"type": "module"
是 Node.js 中 package.json
文件的一个字段,用于指示该项目的模块系统类型。它决定了项目中的 .js
文件应被视为 ECMAScript 模块 (ESM) 还是 CommonJS 模块 (CJS)。
含义和作用:
"type": "module"
:项目中的.js
文件将默认被视为 ECMAScript 模块 (ESM/ES6)。- 默认行为(未定义
"type"
):项目中的.js
文件将默认被视为 CommonJS 模块 (CJS)。
区别:
-
CommonJS (
"type"
未定义或等于"type": "commonjs"
):<ul> <li>使用 <code>require()</code> 和 <code>module.exports</code>。</li> <li>文件扩展名 <code>.cjs</code> 通常用于明确表示 CommonJS 文件。</li> </ul> </li> <li> <p><strong>ECMAScript 模块 (<code>"type": "module"</code>)</strong>:</p> <ul> <li>使用 <code>import</code> 和 <code>export</code> 语法。</li> <li>文件扩展名 <code>.mjs</code> 通常用于明确表示 ECMAScript 模块文件。</li> <li>不支持 <code>require()</code>,只能使用 <code>import</code> 语法。</li> </ul> </li>
什么时候使用 "type": "module"
?
如果你正在编写现代 JavaScript 应用程序,并希望使用原生的 ESM 语法 (import
和 export
),可以在 package.json
中添加 "type": "module"
。这使得你的 .js
文件默认被解析为 ECMAScript 模块。
示例:
package.json
:
{
"name": "my-project",
"version": "1.0.0",
"type": "module"
}
文件中:
你可以使用 import
:
import path from 'path';
import fs from 'fs';
注意: 如果你的项目中有需要同时使用 ESM 和 CJS 的文件,可以使用 .mjs
(ESM)和 .cjs
(CJS)扩展名来明确区分模块类型,而不用依赖 package.json
中的 "type"
字段。
所以我写了一个js脚本,使用require的时候报错了:
node ./cli/creatIcon.js
file:///Users/song/Project/my/PakePlus/cli/creatIcon.js:1
const path = require('path')
^ReferenceError: require is not defined in ES module scope, you can use import instead
This file is being treated as an ES module because it has a '.js' file extension and '/Users/song/Project/my/PakePlus/package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
这是因为你在项目的 package.json
中使用了 "type": "module"
,使得 Node.js 默认将 .js
文件视为 ES 模块(ESM)。在 ESM 模块中不能使用 require()
,需要使用 import
。你有两种解决方案:
解决方案 1:将文件扩展名改为 .cjs
将 creatIcon.js
文件重命名为 creatIcon.cjs
,这样 Node.js 会将其视为 CommonJS 模块,你可以继续使用 require()
。
解决方案 2:修改代码以使用 import
将 require()
替换为 import
语法,示例如下:
这两种方法都可以解决 require is not defined
的错误。
-
修改
creatIcon.js
:<pre>
import path from 'path'; import fs from 'fs'; import png2icons from 'png2icons'; import sharp from 'sharp';
// 你的其他代码逻辑
<p></p> </li> <li> <p><strong>确保 <code>package.json</code> 中有 <code>"type": "module"</code></strong>: 如果已经存在,则无需更改。</p> </li> <li> <h3>注意事项</h3> </li> <li><code>import</code> 语法只能在支持 ESM 的环境中使用(Node.js 版本必须是 12+)。</li> <li>如果使用 <code>import</code> 语法,文件加载等异步操作需要 <code>await</code>,并且在模块作用域中需要使用 <code>async</code> 函数或 <code>top-level await</code>。</li>