如何发布双npm软件包(CommonJS +模块),以便子模块被统一导入

问题描述 投票:1回答:1

我一直在努力打包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尝试导入错误模块的问题。

javascript node.js npm es6-modules commonjs
1个回答
0
投票

记录不充分或不明显,但在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
© www.soinside.com 2019 - 2024. All rights reserved.