"type"字段控制node.js对本包.js文件的模块解析方式:设为"module"则默认esm(需import/export),"commonjs"则显式commonjs,不设置则默认commonjs;.mjs/.cjs扩展名优先级高于type,且仅作用于当前包。

package.json 中的 "type" 字段用于告诉 Node.js 如何解析当前包内的 .js 文件 —— 是按 CommonJS 模块规范(默认)解析,还是按 ES 模块规范(ESM)解析。
控制模块解析行为
Node.js 默认把 .js 文件当作 CommonJS 模块处理(使用 require() 和 module.exports)。但一旦在项目根目录的 package.json 中设置了:
-
"type": "module":所有本包下的.js文件默认按 ES 模块加载(需用import/export),require()会报错(除非用createRequire) -
"type": "commonjs":显式声明按 CommonJS 解析(Node.js 20.11+ 支持,主要用于混合场景或明确意图) - 不写
"type"或设为其他值:等同于未设置,走 CommonJS 默认行为
影响文件扩展名和导入方式
"type": "module" 下:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
-
import只能用于.js、.mjs、.cjs(有特殊规则)、.json(需启用--experimental-json-modules)等明确支持的扩展名 -
.mjs文件无论type值如何,始终按 ESM 解析;.cjs则始终按 CommonJS 解析 —— 它们优先级高于type -
require('./foo.js')在 ESM 环境中非法,必须改用import或动态import()
注意作用范围和常见误区
"type" 只对当前 package.json 所在包及其子目录下的 .js 文件生效,不影响依赖包(依赖包各自看自己的 package.json)。
- 不能跨包统一控制:A 包设了
"type": "module",不会让 B 包的.js文件变成 ESM - 混合模块时容易出错:比如在
"type": "module"的项目里用require()加载本地.js文件,会直接抛ERR_REQUIRE_ESM - 顶层
await只在 ESM 中合法:"type": "module"后,脚本顶层可直接写await fetch(...)
实用建议
新项目推荐明确设置 "type": "module",更符合现代 JavaScript 标准;迁移旧项目时注意检查所有 require 调用并替换为 import,同时把配置文件、CLI 入口等同步调整。如需局部用 CommonJS,可将对应文件改为 .cjs 扩展名,它不受 type 字段影响。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










