https://nodejs.org/docs/v20.13.1/api/packages.html#packagejson-and-file-extensions
作为示例,先看一个项目的package.json,它有"type": "module
":
{
"name": "mock-demo",
"version": "0.0.0",
"private": true,
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"axios": "^1.6.8",
"vue": "^3.4.21"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.0.4",
"json5": "^2.2.3",
"mockjs": "^1.1.0",
"vite": "^5.2.8"
}
}
-
在包内部,package.json 的 “type” 字段定义了 Node.js 应该如何解释 .js 文件。如果package.json 文件没有 “type” 字段,.js 文件将被当作 CommonJS 对待。
-
package.json 文件中的 “type” 值为 “module” 告诉 Node.js 将该包内的 .js 文件解释为使用 ES module(ECMAScript模块)语法。
-
“type” 字段不仅适用于初始入口点(如 node my-app.js),还适用于由 import 语句和 import() 表达式引用的文件。
-
以 .mjs 结尾的文件总是作为 ES 模块加载,不管最近的父级 package.json 如何。
-
以 .cjs 结尾的文件始终作为 CommonJS 加载,不管最近的父级 package.json 如何。
-
.mjs 和 .cjs 扩展名可以用于在同一包内混合使用不同的类型:
1、在 “type”: “module” 的包中,可以通过将文件命名为 .cjs 扩展名(因为在 “module” 包中,.js 和 .mjs 文件都被当作 ES 模块处理)来指示 Node.js 将特定文件解释为 CommonJS。
2、在 “type”: “commonjs” 的包中,可以通过将文件命名为 .mjs 扩展名来指示 Node.js 将特定文件解释为 ES 模块(因为在 “commonjs” 包中,.js 和 .cjs 文件都被当作 CommonJS 处理)。