我一直在努力打包NPM软件包,以便它捆绑CommonJS和ES模块,但两者都使用相同的绝对模块路径导入。不仅是主模块。
例如,我可能在软件包中的两个内部版本都有其目录或目录
/package
/modules
index.js
submodule.js
/node
index.js
submodule.js
我希望能够透明地导入,以便将正确的模块加载到节点或浏览器(或Webpack等)上。
因此,对require('package/submodule')
的调用将加载/package/node/submodule.js
,而import submodule from 'package/submodule'
将加载/package/modules/submodule.js
这是否有可能,尤其是使其不影响使用者并与旧版本的节点一起使用?
[我尝试了诸如条件导出之类的各种操作,type=module
,但遇到了jest + babel-jest尝试导入错误模块的问题。
记录不充分或不明显,但在Node 13.7.0+中可能使用条件导出,与the way you would for the main entry point相似。但是,您的ES模块将需要使用.mjs
文件扩展名。
node_modules/package/package.json
{
"main": "./node/index.js",
"exports": {
".": [
{
"import": "./modules/index.mjs",
"require": "./node/index.js",
"default": "./node/index.js"
},
"./node/index.js"
],
"./submodule": [
{
"import": "./modules/submodule.mjs",
"require": "./node/submodule.js",
"default": "./node/submodule.js"
},
"./node/submodule.js"
]
}
}
node_modules/package/modules/index.mjs
export const index = 'mjs-index';
node_modules/package/modules/submodule.mjs
export const submodule = 'mjs-submodule';
node_modules/package/node/index.js
exports.index = 'cjs-index';
node_modules/package/node/submodule.js
exports.submodule = 'cjs-submodule';
比您的包可以这样使用:
main.js
const {index} = require('package');
const {submodule} = require('package/submodule');
console.log(index);
console.log(submodule);
main.mjs
import {index} from 'package';
import {submodule} from 'package/submodule';
console.log(index);
console.log(submodule);
这是您在节点13.11.0中获得的输出。
$ node main.js
cjs-index
cjs-submodule
$ node main.mjs
(node:44920) ExperimentalWarning: The ESM module loader is experimental.
mjs-index
mjs-submodule