Npm ES模块软件包不适用于Express / Babel

时间:2020-02-20 02:18:37

标签: javascript node.js npm ecmascript-6

首先,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-packageimport { 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

1 个答案:

答案 0 :(得分:0)

好的,因此,经过大量研究,我发现Babel不会将依赖项与项目捆绑在一起。 因此,CommonJS项目无法实现纯ESM程序包(但应使用仅将ESM程序包转换为CommonJS的包装程序程序包。)

我发现最好的解决方案(在包方面)是发布混合包:

  • 开发软件包:
    • 作为ESM(在根type:"module"上使用package.json
    • 变成src/
  • 添加Babel以便创建CommonJS版本(进入./lib目录)
    • 然后在publishOnly npm脚本上运行转写脚本
    • 不要忘记在{type:"commonjs"}上添加./lib(我在prepublishOnly的结尾使用echo \"{\\\"type\\\":\\\"commonjs\\\"}\" > ./lib/package.json做过
  • 在Root package.json上同时指定两个版本(EsM和CJS):
    • "main":"lib/index.js" // CommonJS版本
    • "exports":"./src/index.js" //默认ESM版本

Github::我在仓库中添加了此答案(以及更多示例):npm-package-with-cjs-support

注意:我仍在寻找根项目而非包装方面的解决方案。也许可以找到所有纯esm并将它们捆绑在一起的方法?

更多链接