一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
瞎逼逼
最近在整公司的组件库。项目已经整完,在写博客记录自己所遇到的问题,写到 dependencies 和 devDependencies 发现他们我的印象十分的模糊,因为我开发中包放在 dependencies 和 devDependencies 他们好像没啥区别。 本地开发与线上都是可以运行, 因此具体不清楚他们的区别,所以就看到几篇文章,但是也是讲的不清晰,看到知乎的讨论不错: dependencies与devDependencies貌似一点区别都没有,姿势不对还是理解有误??。
推荐看官网:
开始说他们的区别
其实在项目开发你如果不发布npm包的话,这两个没啥区别,都会把你需要安装都放到node_modules下面。但是如果这个项目你是发布到npm的包就有区别了。
这里假设 B是 npm包, A是 项目
当A 使用 B 时 会 npm install B
下载了B, 当安装B时 也会安装B dependencies 下面的包。 这个时候如果B dependencies下的包有些是打包工具例如 rollup 。 但是 A项目使用 webpack 打包不需要rollup,那么这就额外增加了 A 的install rollup。 当然 A 项目安装 B 放在 dependencies 还是 devDependencies 都是没啥区别的,但是最好还是规范化下。
规范化:
-
当这个包只是开发时使用,线上运行时就不用,应放在 devDependencies 如:
babel-core
、babel-eslint
、等babel
系列,autoprefixer
、webpack
、webpack-dev-server
、*-loader
loader系列等等 -
当这个包开发时使用并且线上运行时也使用,应放在 dependencies 如:
react
、vue
、react-redux
、react-router-dom
等
衍生
当 A 的 node_modules 已经存在 B dependencies 的包,还会重洗下载安装嘛?
例子: A node_modules/core-js 的版本为 3.6.1, B dependencies 的 core-js 为 3.22.1。
会重新安装,但是安装的core-js: 3.22.1
是放在 node_modules/B/node_modules,目录结构如下
|- A
|- node_modules
|- B
|- node_modules
|- core-js 3.22.1
|- core-js 3.6.1
如何减少 core-js 的多次安装
这里就导致了重复性的安装 core-js 。 因此我们可以把 core-js 放到 peerDependencies 就不会再安装了。
# 原先 B 的 package.json
dependencies {
"core-js": "^3.22.0",
}
更改
# 原先 B 的 package.json
peerDependencies {
"core-js": "^3.22.0",
}
当 A npm install B
只安装 B 不会在 B 的下面装 core-js: "^3.22.0
需要自己去安装 core-js 了。但是可能就会出现版本错误问题。因为 A 使用的 core-js: 3.6.1
版本比 B要用的低。A 的 core-js 需要升级。
npm install 存在的问题
其实下面问题是根据这篇文章: npm与yarn对peerDependencies处理的差异
这篇文章讲到了npm 的 hoist 问题。例如把上面core-js 变成 less-loader 与 less
# B 的 package.json
dependencies {
"less": "^4.1.2",
"less-loader": "^10.2.0"
}
当 A 本地安装了一个less: 3.0.0
用于之前的使用。 这个时候你去安npm install B
目录结构就发现了变化。
|- A
|- node_modules
|- B
|- node_modules
|- less 4.1.2
|- less 3.0.0
|- less-loader
这个时候就发现less-loader 需要的less 版本就会对应不上。 less-loader 需要 3.5.0 或者 4.0.0 之上的。3.0.0肯定不满足。
这个时候就使用 yarn add B
|- A
|- node_modules
|- B
|- node_modules
|- less 4.1.2
|- less-loader
|- less 3.0.0
当然那篇文章下面有人评论 yarn 的 hoist 也是不太稳定。建议使用 pnpm 这个我也没有用过,但是最近看到pnpm 次数有些多,当我有时间了去了解下,再把这块这里更新下。
版本号前面的符号啥意思
version
必须匹配某个版本
如: 2.2.1, 表示必须依赖2.2.1版的依赖包
>version
必须大于某个版本
如: >2.2.1, 表示必须依赖大于 >2.2.1版的依赖包
>=version
必须大于或等于某个版本
如: >=2.2.1, 表示必须依赖大于或等于 >=2.2.1版的依赖包
<version
必须小于某个版本
如: <2.2.1, 表示必须依赖小于 <2.2.1版的依赖包
<=version
必须小于或等于某个版本
如: >=2.2.1, 表示必须依赖小于或等于 >=2.2.1版的依赖包
~version
不改变大版本号和次要版本号,小版本号随意
注意:
如果按照版本号格式,X.Y.Z,那么小版本号就是随意
如: ~2.2.1, 表示 >=2.2.1 <2.3.0 版的依赖包 (可以是2.2.1, 2.2.2, 2.2.3, …, 2.2.n)
如果版本号格式,X.Y,那么跟正规格式的意义相同
如果版本号格式,X,那么次要版本号和小版本号可以随意
如: ~2, 表示 >=2.0.0 < 3.0.0版的依赖包 (可以是2.0.0, 2.0.n, 2.1.0, …, 2.n.n)
^version
版本号最左边非 0 数字的右侧可以任意
如: ^2.2.1,表示 >=2.2.1 < 3.0.0版依赖包
^0.2.1,表示 >=0.2.1 <0.3.0版依赖包
^0.0,表示 >=0.0.0 <0.1.0版依赖包
version号位置出现 X
X 的位置表示任意版本
如: 2.2.x,表示 >=2.2.0 <2.3.0版依赖包
version使用 * 代替
任意版本, *""*也表示任意版本
如: *, 表示 >=0.0.0版依赖包
version(1) - version(2)
大于等于version(1),小于等于version(2)
如: 2.2.1 - 2.3.1, 表示 >=2.2.1 <=2.3.1版依赖包
根据前面十条设置版本号规则,range(1)||range(2)
满足range(1)或者满足range(2),可以设置多个范围,用空格隔开
如: <2.2.1||>=2.3.1 <2.4.1||>2.5.1 <2.6.1,表示三个范围的版本号都可以
上面复制张贴来的复制的文章: npm依赖包版本前面符号的意义
还有写功能,自己看吧.
version
Must matchversion
exactly>version
Must be greater thanversion
>=version
etc<version
<=version
~version
"Approximately equivalent to version" See semver^version
"Compatible with version" See semver1.2.x
1.2.0, 1.2.1, etc., but not 1.3.0http://...
See 'URLs as Dependencies' below*
Matches any version""
(just an empty string) Same as*
version1 - version2
Same as>=version1 <=version2
.range1 || range2
Passes if either range1 or range2 are satisfied.git...
See 'Git URLs as Dependencies' belowuser/repo
See 'GitHub URLs' belowtag
A specific version tagged and published astag
Seenpm dist-tag
path/path/path
See Local Paths below
参考: dependencies
参考文章
dependencies与devDependencies貌似一点区别都没有,姿势不对还是理解有误??