我正在 NodeJS 工作。我有大量遗留代码,包括在许多地方使用的几个包。这段代码都是CommonJS、Node require()模块结构。
Node 现在支持 ES6。由于它是 Javascript 语言功能,我想迁移到它。
今天,我开始了一个小项目。我的小项目样板需要()几个我最喜欢的实用程序,然后说“Hello World”。我编辑它以导入所述实用程序。 Node 告诉我我需要将“type”:“module”添加到我的 package.json 中,我做到了。
当我运行它时,我被告知“未定义要求”,这是指我导入的实用程序模块之一。
我推断这意味着一个项目要么是 CommonJS,要么是 ES6,而且这两者似乎永远不会相遇。我对此感到惊讶,因为这意味着我将永远不会在NodeJS中使用ES6,因为我永远无法更改所有我需要的模块()。有些甚至不是我的,有些则用于我什至不知道的项目(npm!)。
老实说,我很难相信事实是这样。我不明白 ES6 如何成为广泛使用的标准,因为如果 ES^ 和 CommonJS 不能在应用程序中一起使用。我意识到 Webpack 等会预处理代码并修改所有 require() 语句,但并不是每个人都使用这种实用程序。
我的问题是:
这个分析正确吗?
是否有一些解决方法可以让我使用两个模块系统(没有预处理器)?
我即将做出的永远不再使用 ES6 的决定是正确的吗?
我不是一个 javascript 人,所以我虚心接受这里的任何更正。我有同样的问题,并且对通常的地方缺乏清晰度感到惊讶。
令人困惑的是,在实际混合这些的地方,涉及两个文件(模块)——导入文件和导入文件。那么,如果您的索引(或其他入口点)文件是基于 ES 的并且需要包含 CommonJS 文件 - 您会使用哪种格式?对于将 CommonJS 文件/库导入现代 ES6 应用程序的最常见基本情况):
对于node.js 16.18.0
package.json
{
"name": "es6_commonjs",
"version": "1.0.0",
"description": "",
"type": "module",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
书.cjs
module.exports = class Book {
constructor(name) {
this.name = name;
}
}
student.js
export class Student {
constructor(name) {
this.name = name;
}
}
app.js
import { Student } from "./student.js";
import Book from './book.cjs';
const student = new Student('Name');
console.log(student);
const book = new Book('Name');
console.log(book);
运行命令
node ./app.js
结果:
Student { name: 'Name' }
Book { name: 'Name' }
我更新了 NodeJs 文档链接:https://nodejs.org/api/packages.html#defining-module-system
双 CommonJS/ES 模块包的规则解释得很好...