Appearance
package.json
依赖配置
配置属性
在 package.json 中关于依赖的配置属性包含以下几个:dependencies
, devDependencies
, peerDependencies
, bundledDependencies
, optionalDependencies
。对于我们一般接触到的就前面三个
dependencies
指定了项目运行所依赖的模块,开发环境和生产环境的依赖模块都可以配置到这里
- devDependencies
有些第三方包只是你在开发环境的时候需要使用到,在生产环境就不需要这些包了。如一些检查工具 eslint、prettier 等。
只会在开发环境下依赖的模块,生产环境不会被打入包内。通过 NODE_ENV=developement 或 NODE_ENV=production 指定开发还是生产环境。
这边又一个误区:什么叫生产环境就不需要了?
- 如我们业务工程代码,在 devDependencies 中配置了
prettier
,那么开发环境npm instsall
的时候会下载prettier
;那么在 CI/CD 中运行npm install
会下载么?
答案:如果操作失误仍然是会下载的。
cross-env NODE_ENV=production & npm build
会下载- 系统环境变量设置 export NODE_ENV=production 时才不会安装 devDependencies
npm install --only=dev
peerDependencies
这个属性一般用于开发一个第三方包,其规定了所依赖的版本以及用户安装的依赖包版本的兼容性。
bundledDependencies
bundledDependencies 的值是一个数组,数组里可以指定一些模块,这些模块将在这个包发布时被一起打包。
optionalDependencies
某些场景下,依赖包可能不是强依赖的,这个依赖包的功能可有可无,当这个依赖包无法被获取到时,你希望 npm install 继续运行,而不会导致失败,你可以将这个依赖放到 optionalDependencies 中,注意 optionalDependencies 中的配置将会覆盖掉 dependencies 所以只需在一个地方进行配置。
当然,引用 optionalDependencies 中安装的依赖时,一定要做好异常处理,否则在模块获取不到时会导致报错。
匹配规则
对于依赖配置的匹配规则可以有以下几种方式:
json
{
"dependencies": {
"antd": "ant-design/ant-design#4.0.0-alpha.8", // github
"axios": "^1.2.0", // 版本号规则
"test-js": "file:../test", // 本地文件夹
"test2-js": "http://cdn.com/test2-js.tar.gz" // 可下载的tar.gz文件
}
}
- 版本号 version
这是最常用的方式,遵循 semver 语义化版本规范,通过我们 npm 的仓库去匹配对应的版本下载,其包的下载地址是 npm 的包仓库,这就涉及到 npm 的 registry
, .npmrc文件
json
{
"dependencies": {
"axios": "^1.2.0" // 版本号规则
}
}
- http 可下载 tar.gz 包
不想使用 npm 仓库的那就可以自己去定义包下载的地址。
json
{
"dependencies": {
"test2-js": "http://cdn.com/test2-js.tar.gz" // 可下载的tar.gz文件
}
}
- 本地包
主要用于调试使用,对于 npm^7 或者 pnpm 等可以使用 workspace 的概念去维护内部版本
json
{
"dependencies": {
"test-js": "file:../test" // 本地文件夹
}
}
- github 包
json
{
"dependencies": {
"antd": "ant-design/ant-design#4.0.0-alpha.8" // github
}
}
- 其他仓库
- git://github.com/user/project.git#commit-ish
- git+ssh://user@hostname:project.git#commit-ish
- git+ssh://user@hostname/project.git#commit-ish
- git+http://user@hostname/project/blah.git#commit-ish
- git+https://user@hostname/project/blah.git#commit-ish
json
{
"dependencies": {
// 其他仓库 git+https://xxxx.git#分支仓库
"npm-electron": "git+https://git.code.tencent.com/dolphin-pc/npm-release/npm-electron.git#0.0.12"
}
}
目录、文件相关
这个主要涉及 包 和 cli 等属性,分别是: bin
、 main
、 module
、browser
、 files
。
下面说涉及我们包使用场景的三个属性,具体有哪些场景
- 只允许在客户端使用的
那么这三个属性分别是
- main : 定义了 npm 包的入口文件,browser 环境和 node 环境均可使用
- module : 定义 npm 包的 ESM 规范的入口文件,browser 环境和 node 环境均可使用
- browser : 定义 npm 包在 browser 环境下的入口文件