首先,this repository上的所有代码都可以轻松尝试。 (该软件包已发布到npm中,因此可以用作测试)
我正在尝试使此简单的NPM ESModule包可与Nodejs CommonJS + babel一起反向使用。
程序包(在Github存储库上为1-npm-package
)
package.json
{
"name": "test-es6-module-npm-package",
"version": "0.1.0",
"description": "Text NPM package ESModule",
"main": "src/index.js",
"type": "module",
"author": "ArthyFiciel"
}
src / index.js
export const sayHello = (name) => {
console.log(`[Npm module package]: Hello ${name}`);
};
Ps:此软件包发布到npm,可以与npm i test-es6-module-npm-package
和import { sayHello } from 'test-es6-module-npm-package'
一起使用
错误(Github存储库上的4-commonjs-express-with-babel-and-esm
)
该项目是使用Babel的简单Express服务器。
package.json(仅放置链接以避免出现大文件)
src / index,js
import express from 'express';
import { sayHello } from 'test-es6-module-npm-package'; // <<< THIS CAUSING ERROR
const PORT = process.env.PORT || 7000;
const app = express();
app.listen(PORT, async () => {
sayHello(`I'm server on port ${PORT}`);
});
但是当我尝试运行它时,出现错误:
/test-es6-module/4-commonjs-express-with-babel-and-esm/node_modules/test-es6-module-npm-package/src/index.js:1
export const sayHello = (name) => {
^^^^^^
SyntaxError: Unexpected token 'export'
at Module._compile (internal/modules/cjs/loader.js:895:18)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
at Module.load (internal/modules/cjs/loader.js:815:32)
at Function.Module._load (internal/modules/cjs/loader.js:727:14)
at Module.require (internal/modules/cjs/loader.js:852:19)
at require (internal/modules/cjs/helpers.js:74:18)
at Object.<anonymous> (/home/arthyficiel/Dev/GrilledCode/StackOverflow/test-es6-module/4-commonjs-express-with-babel-and-esm/dist/index.js:11:32)
at Module._compile (internal/modules/cjs/loader.js:959:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
at Module.load (internal/modules/cjs/loader.js:815:32)
GitHub项目还提供了另外2个测试:
2-express
证明软件包正在运行的ESModule Express服务器。3-commonjs-express-with-babel
完全相同的项目(4-commonjs-express-with-babel-and-esm
),没有引用我的软件包,工作正常。节点版本 v12.14.0
NPM版本 v6.13.4
答案 0 :(得分:0)
好的,因此,经过大量研究,我发现Babel不会不将依赖项与项目捆绑在一起。 因此,CommonJS项目无法实现纯ESM程序包(但应使用仅将ESM程序包转换为CommonJS的包装程序程序包。)
我发现最好的解决方案(在包方面)是发布混合包:
type:"module"
上使用package.json
)src/
./lib
目录)
publishOnly
npm脚本上运行转写脚本{type:"commonjs"}
上添加./lib
(我在prepublishOnly的结尾使用echo \"{\\\"type\\\":\\\"commonjs\\\"}\" > ./lib/package.json
做过"main":"lib/index.js"
// CommonJS版本"exports":"./src/index.js"
//默认ESM版本Github::我在仓库中添加了此答案(以及更多示例):npm-package-with-cjs-support
注意:我仍在寻找根项目而非包装方面的解决方案。也许可以找到所有纯esm并将它们捆绑在一起的方法?