Это недостаточно хорошо документировано или очевидно, но это возможно в Узле 13.7.0+ с использованием условного экспорта, мало чем отличающегося от , как вы бы сделали для главной точки входа . Ваши модули 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
Узел <13 </h2> Для более старых версий узла без поддержки субмодуля вам понадобится файл по пути субмодуля. Например, вы можете добавить эту заглушку: node_modules/package/submodule.js
modules.exports = require('./node/submodule');