我正在构建一个支持 CommonJS 和 ES 模块的包。对于单个入口点,我可以正常工作。我将代码编写为 ESM,并在发布之前使用 Babel 将其编译为 CJS。我的 package.json
的相关位看起来像这样:
"main": "cjs/",
"module": "esm/",
"scripts": {
"test": "jest ./test",
"clean": "rm -rf cjs",
"build": "npm run clean && babel esm --out-dir cjs",
"prepare": "npm test && npm run build"
}
所以我的
index.js
在 esm/index.js
, 和 cjs/index.js
在包发布之前不存在。当使用 require
包含软件包时(例如 const myPackage = require('my-package')
),它将从 cjs/
中提取.如果它是导入的(例如 import myPackage from 'my-packge'
),它将从 esm/
中提取.我的问题是我希望能够从包中导入其他文件(例如
import adapter from 'my-package/adapters/mysql'
或 const adapter = require('my-package/adapters/mysql')
)。但是如果我以这种方式包含它,将找不到该文件。我可以使用完整路径(例如
import adapter from 'my-package/esm/adapters/mysql'
或 const adapter = require('my-package/cjs/adapters/mysql')
)导入它。但我不想在路径中明确指定模块类型。似乎 node 已经知道如何区分 CJS 和 ES 模块(它知道从 main
要求和从 module
导入),所以我希望可以对多个文件做同样的事情。有没有什么方法可以包含一个包,正如我上面所描述的,而不必明确指定
esm/
的路径或 cjs/
?
最佳答案
//the project(package) mcktools's package.josn
"main": "dist/index.js",
"exports": {
".": "dist/index.js",
"./cmd": "dist/nodejs",
"./web": "dist/web",
}
//js import the package mcktools:
import {file} from 'mcktools/cmd'
关于javascript - npm 多模块和主入口点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56136358/