.js 和 .mjs 文件有什么区别?

Kev*_*ata 103 javascript node.js mjs

我已经开始在一个基于 Node.js 的现有项目上工作。我只是想了解执行流程,在那里我遇到了一些*.mjs文件。我搜索了网络,发现这些是基于模块的 JS 文件。

我想知道它与*.js文件有什么不同(它有什么好处)?

Que*_*tin 133

它表示一个 ES6 模块文件。


Node.js 的原始模块系统是CommonJs(使用requiremodule.exports)。

自从 Node.js 创建以来,ECMAScript 模块系统(使用importexport)已经成为标准,并且 Node.js 增加了对它的支持。

Node.js 会将.cjs文件视为 CommonJS 模块,将.mjs文件视为 ECMAScript 模块。它会将.js文件视为项目的默认模块系统(除非package.json说的是 CommonJS "type": "module",)。

另请参阅:ES6 模块系统和 CommonJs 之间的差异

  • 如果您使用 TypeScript,那么您正在使用 TypeScript 模块。 (14认同)
  • 自 2023 年起,您可以通过“*.mts”和“*.cts”源文件扩展名编译为“*.mjs”和“*.cjs”。请参阅 https://www.typescriptlang.org/docs/handbook/esm-node.html#new-file-extensions (7认同)
  • 只是为了澄清,如果您使用 typescript 并拥有 tsconfig 和所有内容,并使用 .ts 文件,那么默认情况下它是模块吗? (3认同)

Biv*_*nod 46

.MJS 文件

  • mjs 是 EcmaScript 模块的扩展
  • MJS 文件是包含用于 Node.js 应用程序的 ES 模块(ECMAScript 模块)的源代码文件。
  • MJS 文件是用 JavaScript 编写的,也可能在 Node.js 上下文之外使用 .JS 扩展名。

  • ES 模块允许 Web 和应用程序开发人员将代码组织成更小的可重用组件。

ECMAScript 6 (ES6) 引入了 ES Modules 规范,提供了在 JavaScript 中实现模块的标准。截至 2018 年,所有主要的 Web 浏览器都支持 ES 模块。

然而,模块化 JavaScript 的流行早于 ES6。Node.js 是一种 JavaScript 运行时环境,使用 CommonJS 作为模块规范。因为现有的很多应用都是用CommonJS构建的,所以Node.js在添加对原生ES模块的支持时,颇有争议地引入了MJS文件扩展名来区分两者,防止应用崩溃。

注意:一些开发人员非正式地将 MJS 文件称为“迈克尔杰克逊脚本”文件。

  • 如果你不打算使用 mjs 扩展,你可以跳过它。 (14认同)
  • 如果人们一直称其为迈克尔·杰克逊脚本/解决方案,那么就没有人会使用 MJS... (9认同)
  • 已故流行歌星或“react-router”的作者之一迈克尔·杰克逊(Michael Jackson)是谁? (7认同)

dev*_*mba 6

为清楚起见。对于开发人员/人类,很容易区分模块文件(.mjs)和普通的 javascript 文件(.js)...因为即使您检查文件中的代码也并不总是容易确定。

还有一些性能优势,让您有更多理由考虑使用它。V8(支持 Google Chrome 的 JavaScript 引擎)推荐使用 .mjs,但这仍然取决于您的情况。如果您想了解更多它的优点,请查看https://v8.dev/features/modules#mjs

  • 很棒的链接。我会考虑引用一些内容。“_在 Web 上,文件扩展名并不重要,只要文件使用 JavaScript MIME 类型 text/javascript 提供即可。由于 script 元素上的 type 属性,浏览器知道它是一个模块......在dev,.mjs 扩展名使您和其他查看您项目的人清楚地知道该文件是一个模块,而不是经典脚本。(仅通过查看代码并不总是可以判断出来。)如前所述,模块的处理方式与经典脚本不同,因此区别很重要!_” (2认同)