打包工具解析package.json时exports和module字段哪个优先级更高
package.json 中
module 与 exports 字段的解析优先级结论 exports 字段的解析优先级远高于顶层 module 字段,这是所有遵循Node.js官方模块解析规范的现代前端打包工具(Webpack 5、Rollup 2+、Vite、esbuild、Parcel 2+等)的统一行为。
两个字段的定位差异
- 顶层
module是早期前端生态的社区民间约定,从未进入Node.js官方规范,最早由Rollup提出、被Webpack 4及更早版本兼容,作用是标记包的ES Module格式入口,属于旧生态兼容类的遗留配置。 exports是Node.js 12+版本正式纳入标准的官方模块入口配置,支持按引入方式(import/require/运行环境等条件)、引用子路径精确映射入口文件,同时自带包封装能力,未在exports中显式声明的路径默认不允许外部引用。
具体解析规则
你给出的配置示例如下:
{ "module": './index-es.js', "exports":{ "." :{ "import": "./index-es.js" } } }
只要package.json中存在exports配置,打包工具就会优先按exports的规则解析模块入口:
- 解析包主入口(即直接引用包名,比如
import pkg from 'your-package')时,会匹配exports["."]下对应条件的入口路径,上述示例中用import语法引入时,就会加载./index-es.js - 只要
exports字段存在,打包工具就不会再回退读取顶层的module、main等旧入口字段,哪怕exports配置没有覆盖对应场景,也不会降级读旧配置,未声明的路径甚至会直接抛出解析错误。
上述示例里两个字段指向的是同一个文件,实际运行效果没有差异;如果两个字段配置的入口路径不一致,所有支持exports的环境都会以exports的配置为准。
只有当你需要兼容不支持exports的老旧工具链(比如Webpack 4、1.x版本的Rollup)时,才需要额外保留顶层module字段做降级适配。
内容的提问来源于stack exchange,提问作者homy
相关产品推荐
相关产品推荐

