【tips】项目中 package.json的 “type“对于文件的导入导出的区别
Node.js模块系统
-
package.json的"type"字段选项:
"type": "module": 将目录下所有默认.js文件视为ES模块(ESM)"type": "commonjs": 将目录下所有默认.js文件视为CommonJS模块(CJS)- 不设置时,默认为
"commonjs"
-
不同模块系统支持的语法:
- ES模块(ESM) 支持:
- 使用
import语句导入模块 - 使用
export语句导出模块 - 使用
import()动态导入 - 支持命名导出和默认导出
- 使用
- CommonJS模块(CJS) 支持:
- 使用
require()函数导入模块 - 使用
module.exports导出模块 - 使用
exports.xxx导出模块
- 使用
- ES模块(ESM) 支持:
-
文件扩展名与模块类型的关系:
.js: 根据package.json中的"type"字段决定是ESM还是CJS.mjs: 始终被视为ES模块,无论package.json设置如何.cjs: 始终被视为CommonJS模块,无论package.json设置如何.json: 可被两种模块系统导入.node: 编译后的二进制模块,可被两种模块系统导入
-
混用两种模块系统的注意事项:
- ES模块可以导入CommonJS模块,但会将其作为默认导出对象
- CommonJS模块可以通过动态
import()导入ES模块,但不能使用静态require() - 这种混合使用可能会导致一些边界情况,特别是在处理异步加载时
Node.js通过package.json的"type"字段和文件扩展名来确定模块系统类型,不同扩展名提供了明确区分模块类型的方式。所以我们在导入导出文件时需要注意用法
