package.json 配置完全解读( 四 )


overrides 可以重写项目依赖的依赖,及其依赖树下某个依赖的版本号,进行包的替换 。
比如某个依赖 A,由于一些原因它依赖的包 foo@1.0.0 需要替换,我们可以使用 overrides 修改 foo 的版本号:
"overrides": { "foo": "1.1.0-patch" }
当然这样会更改整个依赖树里的 foo,我们可以只对 A 下的 foo 进行版本号重写:
"overrides": { "A": { "foo": "1.1.0-patch", } }
overrides 支持任意深度的嵌套 。
 

如果在 yarn 里也想复写依赖版本号,需要使用 resolution 字段,而在 pnpm 里复写版本号需要使用 pnpm.overrides 字段 。
5. 发布配置 
主要是和项目发布相关的配置 。
private
如果是私有项目,不希望发布到公共 npm 仓库上,可以将 private 设为 true 。
"private": true
publishConfig
顾名思义,publishConfig 就是 npm 包发布时使用的配置 。
比如在安装依赖时指定了 registry 为 taobao 镜像源,但发布时希望在公网发布,就可以指定 publishConfig.registry 。
"publishConfig": { "registry": "https://registry.npmjs.org/" } 6. 系统配置
和项目关联的系统配置,比如 node 版本或操作系统兼容性之类 。这些要求只会起到提示警告的作用,即使用户的环境不符合要求,也不影响安装依赖包 。
engines
一些项目由于兼容性问题会对 node 或者包管理器有特定的版本号要求,比如:
"engines": { "node": ">=14 <16", "pnpm": ">7" }
要求 node 版本大于等于 14 且小于 16,同时 pnpm 版本号需要大于 7 。
os
在 linux 上能正常运行的项目可能在 windows 上会出现异常,使用 os 字段可以指定项目对操作系统的兼容性要求 。
"os": ["darwin", "linux"]
CPU
指定项目只能在特定的 CPU 体系上运行 。
"cpu": ["x64", "ia32"] 7. 第三方配置
一些第三方库或应用在进行某些内部处理时会依赖这些字段,使用它们时需要安装对应的第三方库 。
types 或者 typings
指定 TypeScript 的类型定义的入口文件
"types": "./index.d.ts",
unpkg
可以让 npm 上所有的文件都开启 CDN 服务 。
比如 vue package.json 的 unpkg 定义为 dist/vue.global.js
"unpkg": "dist/vue.global.js",
当我们想通过 CDN 的方式使用链接引入 vue 时 。
访问 https://unpkg.com/vue 会重定向到 https://unpkg.com/vue@3.2.37/dist/vue.global.js,其中 3.2.27 是 Vue 的最新版本 。
jsdelivr
与 unpkg 类似,vue 通过如下的配置
"jsdelivr": "dist/vue.global.js",
访问 https://cdn.jsdelivr.NET/npm/vue 实际上获取到的是 jsdelivr 字段里配置的文件地址 。
package.json 配置完全解读

文章插图
 
browserslist
设置项目的浏览器兼容情况 。babel 和 autoprefixer 等工具会使用该配置对代码进行转换 。当然你也可以使用 .browserslistrc 单文件配置 。
"browserslist": [ "> 1%", "last 2 versions" ]
sideEffects
显示设置某些模块具有副作用,用于 webpack 的 tree-shaking 优化 。
比如在项目中整体引入 Ant Design 组件库的 css 文件 。
import 'antd/dist/antd.css'; // or 'antd/dist/antd.less'
如果 Ant Design 的 package.json 里不设置 sideEffects,那么 webapck 构建打包时会认为这段代码只是引入了但并没有使用,可以 tree-shaking 剔除掉,最终导致产物缺少样式 。
所以 Ant Design 在 package.json 里设置了如下的 sideEffects,来告知 webpack,这些文件具有副作用,引入后不能被删除 。
"sideEffects": [ "dist/*", "es/**/style/*", "lib/**/style/*", "*.less" ]
lint-staged
lint-staged 是用于对 git 的暂存区的文件进行操作的工具,比如可以在代码提交前执行 lint 校验,类型检查,图片优化等操作 。
"lint-staged": { "src/**/*.{js,jsx,ts,tsx}": [ "eslint --fix", "git add -A" ] }
lint-staged 通常配合 husky 这样的 git-hooks 工具一起使用 。git-hooks 用来定义一个钩子,这些钩子方法会在 git 工作流程中比如 pre-commit,commit-msg 时触发,可以把 lint-staged 放到这些钩子方法中 。


推荐阅读