[英]How to include commonjs module in ES6 module node app?
我有一个节点应用程序,我想在标准 ES6 模块格式中使用(即package.json
中的"type": "module"
,并在整个过程中使用import
和export
)而不转译为 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
导出您要import
或require
的代码。
在dependencies
属性下的package.json
中添加以下内容:
"myCustomModule":"file:./path/to/myCustomModule"
完成此操作后,运行npm install
。
完成后,查看项目根目录的node_modules
,您将看到一个名为myCustonModule
的目录。
现在在任何项目文件中,您都可以像其他任何mode_module
一样import
或require
该代码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.