在 package.json 中使用 exports 字段定义条件导出,通过键名区分环境并映射到具体文件路径。例如配置 "./module.js": { "import": "./module.mjs", "require": "./module.cjs" } 即可让 node.js 和浏览器根据加载方式自动选择模块。若需支持特定环境如 node 或 default,只需在对象中增加对应键值对即可。

如何为 CommonJS 和 ES Modules 分别指定入口文件
当需要同时兼容 require() 和 import 时,应在 exports 中同时声明 require 和 import 键。Node.js 会优先匹配当前运行环境的键,未匹配的键会被忽略。这种写法确保了同一包在不同模块系统下都能正确加载对应的实现文件。

{
"name": "my-package",
"type": "module",
"exports": {
".": {
"import": "./index.mjs",
"require": "./index.cjs"
}
}
}
上述配置使 import 语句指向 index.mjs,而 require 调用指向 index.cjs。开发者无需关心底层实现差异,只需按标准语法引入即可。
如何处理子路径的条件导出
对于包内的子模块,可以使用通配符或显式路径进行条件导出。例如 "./utils/*": "./dist/utils/*.mjs" 允许外部导入 my-package/utils/helper.js 时自动解析到对应的 .mjs 文件。这种方式保持了内部结构的灵活性,同时对外提供稳定的接口。

{
"name": "my-package",
"exports": {
".": "./index.mjs",
"./utils/*": "./dist/utils/*.mjs"
}
}
该配置下,import helper from 'my-package/utils/helper' 将加载 ./dist/utils/helper.mjs。注意路径中的 * 必须与导入语句中的实际文件名一致,否则会导致解析失败。
当使用 default 键时会发生什么
default 键作为兜底选项,在所有其他条件键都不匹配时生效。例如若仅配置 "import": "./mod.mjs" 和 "default": "./mod.cjs",则在不支持 import 的环境中会回退到 .cjs 文件。这提供了良好的向后兼容性,确保旧版工具链也能正常工作。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











