gpt4 book ai didi

javascript - 如何发布双npm包(CommonJS + module)以便子模块统一导入

转载 作者:行者123 更新时间:2023-11-28 03:11:49 25 4
gpt4 key购买 nike

我一直在努力打包 NPM 包,以便它捆绑 CommonJS 和 ES 模块,但它们都使用相同的绝对模块路径导入。不仅仅是主模块。

例如,我可能有一个两个构建在包内都有其 或 目录

/package
/modules
index.js
submodule.js
/node
index.js
submodule.js

我希望能够透明地导入,以便在 Node 或浏览器(或 webpack 等)上加载正确的模块。

因此,调用 require('package/submodule') 将加载 /package/node/submodule.js从 'package/导入子模块submodule' 将加载 /package/modules/submodule.js

这是否可能,特别是它不会影响消费者并与旧版本的 Node 一起使用?

我尝试了各种东西,例如条件导出、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);

这是您在 Node 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 <13

对于不支持子模块的旧版本 Node ,您将需要子模块路径中的一个文件。

例如,您可以添加此 stub :

node_modules/package/submodule.js

modules.exports = require('./node/submodule');

关于javascript - 如何发布双npm包(CommonJS + module)以便子模块统一导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60028301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com