繁体   English   中英

在同一项目中混合 CommonJS 和 ES6 模块

[英]Mix CommonJS and ES6 modules in same project

我在 NodeJS 工作。 我有大量遗留代码,包括在许多地方使用的几个包。 这段代码都是CommonJS,Node require() 模块结构。

Node 现在支持 ES6。 由于它是一个 Javascript 语言功能,我想迁移到它。

今天,我开始了一个小项目。 我的小项目样板需要()几个我最喜欢的实用程序,然后说“Hello World”。 我编辑它以导入所述实用程序。 Node 告诉我需要将 "type":"module" 添加到我的 package.json 中,我做到了。

当我运行它时,我被告知“require is not defined”,这是指我导入的实用程序模块之一。

我推断这意味着一个项目要么是 CommonJS 要么是 ES6,而且这两者似乎永远不会相遇。 我对此感到惊讶,因为这意味着我永远不会在 NodeJS 中使用 ES6,因为我永远无法更改我需要的所有模块()。 有些甚至不是我的,有些在我什至不知道的项目 (npm.) 中使用。

老实说,我很难相信这是真的。 我不明白 ES6 如何成为广泛使用的标准,因为 ES^ 和 CommonJS 不能在应用程序中一起使用。 我意识到 Webpack 等会预处理代码并修改所有 require() 语句,但并不是每个人都使用这种实用程序。

我的问题是:

这个分析正确吗?

是否有一些解决方法可以让我同时使用两个模块系统(没有预处理器)?

我即将做出的永远、永远不使用 ES6 的决定是正确的吗?

我不是 javascript 的人,所以我在这里谦虚地接受任何更正。 我有同样的问题,并对通常的地方缺乏明确性感到惊讶。

令人困惑的是,在你实际混合这些的地方,涉及到两个文件(模块)——导入文件和导入文件。 所以,如果您的索引(或其他入口点)文件是基于 ES 的,并且它需要包含一个 CommonJS 文件 - 您使用哪种格式? 对于将 CommonJS 文件/库导入现代 ES6 应用程序的最常见基本情况):

  1. 不要在package.json中指定类型:模块(这将默认设置为 CommonJS)
  2. 文件扩展名:对所有 ES6 文件使用 .mjs 扩展名。 对所有 CommonJS 文件使用(或保留)older.js 扩展名
  3. 导出语句:对所有 ES6 导出使用 export 关键字(例如“export functionName”) - 对所有 CommonJS 导出使用“modules.export”
  4. 导入语句:对要导入的任何文件类型使用导入语法 例如,如果你在 ES6 模块文件中,需要引入 CommonJS 文件,使用 ES6 导入语法

在此处输入图像描述

对于 node.js 16.18.0

包.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;
    }
}

学生.js

export class Student {
    constructor(name) {
        this.name = name;
    }
}

应用程序.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' }

暂无
暂无

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

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