繁体   English   中英

如何在 ES6 模块节点应用程序中包含 commonjs 模块?

[英]How to include commonjs module in ES6 module node app?

我有一个节点应用程序,我想在标准 ES6 模块格式中使用(即package.json中的"type": "module" ,并在整个过程中使用importexport )而不转译为 ES5。 但我想利用一些较旧的库,例如使用 CommonJS / require格式的 express 和 socket.io。 我有哪些选择(截至 5/2020,Node 12.16.3)将 CommonJS 模块组合到 ES6 应用程序中?

使用 CommonJS 模块非常简单。 您只能从 CommonJS 模块执行default导出。

import packageMain from 'commonjs-package'; // Works
import { method } from 'commonjs-package'; // Errors

这意味着所有 commonjs 导出都将存在于packageMain object 中,您需要在 packageMain object 中添加以获取您需要的内容。

packageMain.method1()

官方 nodejs 文档中的更多信息

从 Node 13.10 开始,还有另一种选择,最有前瞻性的一种:

在您想使用的 CommonJS 库的 repo 中提交问题,说服维护者发布双包(ESM + CommonJS),使用条件导出

对于用 TypeScript 编写的库,生成双包很容易,不需要 Babel 或 rollup 或任何其他工具。 这是我在local-iso-dt中的做法:

package.json的相关部分:

{
  "name": "local-iso-dt",
  "version": "3.1.0",
  "description": "...",
  "type": "commonjs",
  "exports": {
    "node": {
      "import": "./index.mjs",
      "require": "./index.js"
    },
    "default": "./index.mjs"
  },
  "main": "index.js",
  "files": [
    "index.ts",
    "index.mjs",
    "index.js"
  ],
  "scripts": {
    "clean": "rm index*.js index.mjs",
    "prepublishOnly:cjs": "tsc index.ts --esModuleInterop --removeComments",
    "prepublishOnly:esm": "tsc index.ts -t ES2015 --types node && mv index.js index.mjs",
    "prepublishOnly": "npm run prepublishOnly:esm; npm run prepublishOnly:cjs"
  },
  "devDependencies": {
    "typescript": "^4.0.2"
  },
}

prepublishOnly prepublishOnly:esm esm 手动重命名 output 因为--outFile还不能生成.mjs output 模块直接与 ES 一起工作。

exports块具有“启用 TypeScript 代码与 ES 模块转译的条件导出,以使用命名导入。TypeScript 不直接支持.mjs 输入文件

这个简单的模块不需要tsconfig.json

伊万的回答很有帮助,但我还应该注意,因为我使用的是节点 12.16.3,所以我还需要在 package.json 的启动脚本中添加package.json --experimental-modules标志:

"type": "module",
"scripts": {
    "start": "node --experimental-modules --experimental-json-modules server.mjs",
}
  • "type": "module"告诉 node 你应该使用 ES6 模块
  • .mjs的文件名进一步表明我们正在使用模块 JavaScript 文件
  • --experimental-modules--experimental-json-modules允许您在节点版本 12 中使用import

然后我可以做一些事情,比如import express from 'express'; (其中 express 4.17.1 是一个 CommonJS 模块),它运行良好。

确保有问题的模块有一个index.js导出您要importrequire的代码。

dependencies属性下的package.json中添加以下内容:

"myCustomModule":"file:./path/to/myCustomModule"

完成此操作后,运行npm install

完成后,查看项目根目录的node_modules ,您将看到一个名为myCustonModule的目录。

现在在任何项目文件中,您都可以像其他任何mode_module一样importrequire该代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM