当面试官问你node的时候,更多引导面试官用node做前端工程化,去引导到webpacknpm、打包工具上面去说说自己的想法,不要引导到自己会后端,后台不是会一点node语法就能写的

# 1 package.json版本号规则

⚡ 30 秒速记

  • 语义化版本 major.minor.patch:主版本号(不兼容改动)、次版本号(兼容的新功能)、修订号(兼容的 bug 修复)
  • ^1.2.3 锁主版本,匹配 1.x.x(不含 2.0.0);~1.2.3 锁到次版本,只匹配 1.2.x
  • ⚠️ 0.x.y 版本 ^ 的行为不同 —— ^0.2.3 只匹配 0.2.x,因为 0.x 被视为不稳定期
  • */latest 永远装最新,几乎不该用;精确版本(1.2.3)最稳但享受不到补丁修复
  • 真正决定实际安装版本的是 package-lock.json——它才是可复现构建的保障,^/~ 只在没有 lock 或重新解析时起作用

package.json 通常遵循 major.minor.patch:不兼容改动升级主版本,兼容的新功能升级次版本,兼容的修复升级修订版本。 ^1.2.3 可匹配 1.x.x 但不含 2.0.0~1.2.3 只匹配 1.2.x。需要注意 0.x 的规则更严格,例如 ^0.2.3 只会落在 0.2.x;精确版本最稳,而 *latest 风险更高。实际安装结果主要由 package-lock.json 锁定,版本范围通常只在缺少锁文件或重新解析依赖时生效。

major.minor.patch

  • 主版本号.次版本号.修补版本号(major.minor.patch)
  • major:新的架构调整,不兼容老版本
  • minor:新增功能,兼容老版本
  • patch:修复bug,兼容老版本

~和^的区别

  • ~会匹配最近的小版本依赖包,比如~1.2.3会匹配所有1.2.x版本,但是不包括1.3.0
  • ^会匹配最新的大版本依赖包,比如^1.2.3会匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0
  • * 安装最新版本的依赖包,比如 *1.2.3 会匹配 x.x.x

那么该如何选择呢?当然你可以指定特定的版本号,直接写1.2.3,前面什么前缀都没有,这样固然没问题,但是如果依赖包发布新版本修复了一些小bug,那么需要手动修改package.json文件;~^ 则可以解决这个问题

  • 但是需要注意 ^版本更新可能比较大,会造成项目代码错误,所以 建议使用 ~来标记版本号,这样可以保证项目不会出现大的问题,也能保证包中的小bug可以得到修复。
  • 版本号写 *,这意味着安装最新版本的依赖包,但缺点同上,可能会造成版本不兼容,慎用

我们举个例子:

  • 假设我们中安装了 vue, 当我们运行安装 npm install vue -save的时候,在项目中的package.jsonvue版本是 vue: ^3.0.0, 我们电脑安装的vue版本就是 3.0.0 版本,我们把项目代码提交后,过了一段时间,vue 发布了新版本 3.0.1,这时新来一个同事,从新 git clone克隆项目,执行 npm install安装的时候,在他电脑的vue版本就是 3.0.1了,因为^只是锁了主要版本,这样我们电脑中的vue版本就会不一样,从理论上讲(大家都遵循语义版本控制的话),它们应该仍然是兼容的,但也许 bugfix 会影响我们正在使用的功能,而且当使用vue版本3.0.03.0.1运行时,我们的应用程序会产生不同的结果。
  • 大家思考思考,这样的话,不同人电脑安装的依赖版项目,是不是都有可能不一样,就会导致每个人电脑运行的应用程序产生不同的结果。就会存在bug的隐患。
  • 这时也许有同学想到,那么我们在package.json上面锁死依赖包的版本号不就可以了? 直接写 vue: 3.0.0锁死,这样大家安装vue的版本都是3.0.0版本了。
  • 这个想法固然是不错的,但是你只能控制你自己的项目锁死版本号,那你项目中依赖包的依赖包呢?你怎么控制限制别人锁死版本号呢?
  • 为了解决这个不同人电脑安装的所有依赖版本都是一致的,确保项目代码在安装所执行的运行结果都一样,这时 package-lock.json 就应运而生了
webapp
公众号
开发者导航
切换夜间模式
点击侧边栏上一篇
点击侧边栏下一篇
折叠侧边栏
收起全部