这不是很好的文档或显而易见的,但在 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
节点
对于不支持子模块的旧版本节点,您将需要一个位于子模块路径的文件。
例如,您可以添加此存根:
node_modules/package/submodule.js
modules.exports = require('./node/submodule');