kangyana / daily-question

When your heart is set on something, you get closer to your goal with each passing day.
https://www.webpack.top
MIT License
3 stars 0 forks source link

【Q120】什么是 semver,~1.2.3 与 ^1.2.3 的版本号范围是多少 #120

Open kangyana opened 1 year ago

kangyana commented 1 year ago

semverSemantic Versioning 语义化版本的缩写,文档可见 https://semver.org/ (opens new window),它由 [major, minor, patch] 三部分组成,其中

假设你的版本库中含有一个函数

// 假设原函数
export const sum = (x: number, y: number): number => x + y;

// Patch Version,修复小 Bug
export const sum = (x: number, y: number): number => x + y;

// Minor Version,向后兼容
export const sum = (...rest: number[]): number =>
  rest.reduce((s, x) => s + x, 0);

// Marjor Version,出现 Breaking Change
export const sub = () => {};

对于 ~1.2.3 而言,它的版本号范围是 >=1.2.3 <1.3.0

对于 ^1.2.3 而言,它的版本号范围是 >=1.2.3 <2.0.0

当我们 npm i 时,默认的版本号是 ^,可最大限度地在向后兼容与新特性之间做取舍,但是有些库有可能不遵循该规则,我们在项目时应当使用 yarn.lock/package-lock.json 锁定版本号。

我们看看 package-lock 的工作流程。

经典八股文

npm i 某个 package 时会修改 package-lock.json 中的版本号吗?

package-lock.json 该 package 锁死的版本号符合 package.json中的版本号范围时,将以 package-lock.json 锁死版本号为主。

package-lock.json 该 package 锁死的版本号不符合 package.json 中的版本号范围时,将会安装该 package 符合 package.json 版本号范围的最新版本号,并重写 package-lock.json