【转】nvm,npm,npx,nrm,yarn概念整理

一.npm,nvm,nrm,npx,cnpm相关概念

npm:npm是node自带的包管理工具,负责对依赖包进行下载,同时也可以发布自己的包
 //npm部分命令
 npm --help           //查看npm帮助命令
 npm insall xxx --sava-dev (npm install -D)  //安装依赖,包只用于开发环境,不用于生产环境
 npm insall xxx --sava (npm install -S)      //安装依赖,包需要发布到生产环境的
 npm update xxx      //更新指定包
 npm uninstall xxx   //卸载指定包
 npm config list           //查看npm的配置 返回源地址,安装目录等信息
 npm config get registry   //获得源地址
 npm cache clean -f        //清空npm本地缓存
 npm i --legacy-peer-deps  //梳理依赖,处理npm install因版本问题导致的报错
nvm:nvm是node的版本管理工具,可以使用nvm动态切换node版本
 //nvm部分命令
 nvm ls :列出所有已安装的 node 版本
 nvm ls-remote :列出所有远程服务器的版本(官方node version list)
 nvm list :列出所有已安装的 node 版本
 nvm list available :显示所有可下载的版本
 nvm install stable :安装最新版 node
 nvm install [node版本号] :安装指定版本 node
 nvm uninstall [node版本号] :删除已安装的指定版本
 nvm use [node版本号] :切换到指定版本 node
 nvm current :当前 node 版本
 nvm alias [别名] [node版本号] :给不同的版本号添加别名
 nvm unalias [别名] :删除已定义的别名
 nvm alias default [node版本号] :设置默认版本
 //其它
 Mac 系统, m1 芯片的话,会有兼容性问题。
 node.js 的 v15.x.x 及以上版本,已经对 M1 做了兼容处理
 安装的 node.js 的 v14 及以下版本时,需要进入 Rosetta 2 ,安装对应的 stable 版本
nrm:nrm是npm的源管理工具,可以使用该工具对npm进行换源,例如npm官方源的包下载速度较慢,可以切换成淘宝镜像
  //nrm部分命令
  npm install -g nrm  //全局安装nrm
  nrm ls  //查看可选源 星号代表当前使用源
  nrm current  //查看当前使用源
  nrm use   //切换源
  nrm add    //添加源
  如添加一个公司私有源:nrm add cpm http://192.168.22.11:8888/repository/npm-public/
  nrm del cpm   //删除源
  nrm test npm  //测试源速度
  //其它
  .npmrc文件可以设置package.json中依赖包的安装来源,在里面以 key=value 的格式进行配置。
  如:registry=https://registry.npm.taobao.org
  .npmrc优先级大于nrm,其实是设置了 global 的 npmrc。项目下的 npmrc 肯定优先级更高一些。
  电脑中有多个.npmrc文件时,npm按照如下顺序读取这些配置文件
  1项目配置文件: /project/.npmrc
  2用户配置文件:~/.npmrc
  3全局配置文件:$PREFIX/etc/npmrc
  4npm内置配置文件 /path/to/npm/npmrc
  yarn会读取.npmrc的配置文件,所以不必为yarn再设置一次
npx:npx是npm5.2版本后发布的一个新的命令,使用npx命令时,会自动进入node_modules/.bin目录中查找其中的命令,例如 npx http-server,会进入node_modules/.bin目录中启动http-server. 若npx 的命令不存在,则会从网上下载后放在临时文件夹中,执行完后临时文件夹删除
 //npx部分命令
 npx create-react-app my-app  //这条命令临时安装create-react-app包,命令完成后create-react-app会删掉,不会出现在global中。下次执行,还会重新临时安装。
 npx -p node@8 npm run build  //指定node版本来运行npm scripts
cnpm: 使用的是淘宝的源。用法跟 npm 完全一致。cnpm 经常会有问题,所以在很多地方不推荐使用
cnpm i不受package-lock.json影响,只会根据package.json进行下载。
cnpm i xxx@xxx不会跟新到package-lock.json中去。
npm i xxx@xxx会跟新到package-lock.json中去。
总结:所以在实际开发中不建议使用cnpm
yarn: 是由 Facebook、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具,yarn 是为了弥补 npm 的一些缺陷而出现的。
//同为包管理工具 npm和yarn的区别
1、并行安装:yarn安装包会同时执行多个任务,npm 需等待上一个任务安装完成才能运行下一个任务
2、离线模式:如果你已经安装过一个包,用 yarn 再次安装会从缓存中获取,而 npm 会从网络下载
3、版本锁定:yarn 默认有一个 yarn.lock 文件锁定版本,保证环境统一,而 npm 默认从网络下载最新的最稳定的,版本锁定可以解决包之间版本不兼容问题,npm 也可以通过命令实现版本锁定
4、更简洁的输出:yarn 安装包时输出的信息较少,npm 输出信息冗余
//其它
yarn.lock和package-lock.json起的作用相同。只不过yarn是默认的,npm到5以后才会出现lock。两者确定包间的依赖关系算法也不同。两者之间可以通过synp转换。
synp --source-file yarn.lock
synp --source-file package-lock.json

二.npm的package.json和package-lock.json更新策略

概括来讲,假若你在开发一个可供其它应用使用的应用(或者叫包依赖),你必须说明每次升级变更会对第三方使用产生哪些影响。这就是语义化版本想要传达的。一个版本有三部分:X, Y, Z,分别指代大版本,小版本,与查缺补漏版本。比如1.2.3,那么就是大版本1,小版本2,bugfix版本3。bugfix版本不会影响任何功能,小版本变更往往是增加新功能,也不会影响使用。而大版本变更往往会带来使用层面不兼容的情况,需要再做调整。(想想webpack每次升级的时候!)

当你使用npm安装一个包(并保存它)的时候,package.json里就自动添加了一条信息,包括包名和其版本。npm当然也支持版本的通配符。npm默认安装最新版本,然后在其版本号之前添加一个^符号。比如^1.2.12,它表明最低应使用1.2.12版本,并且在这之上,拥有相同大版本号的任何版本都是OK的。毕竟小版本和bugfix版本不会对使用造成任何影响,所以用任何相同大版本的更高级版本都很安全。

符号^:表示安装不低于该版本的应用,但是大版本号需相同,例如:vuex: "^3.1.3",3.1.3及其以上的3.x.x都是满足的。

符号~:表示安装不低于该版本的应用,但是大版本号和小版本号需相同,例如:vuex: "^3.1.3",3.1.3及其以上的3.1.x都是满足的。

无符号:无符号表示固定版本号,例如:vuex: "3.1.3",此时一定是安装3.1.3版本。

为什么需要package-lock.json

因为npm作为开源世界的一部分,也遵循一个发布原则:相同大版本号下的新版本应该兼容旧版本。即2.1.0升级到2.2.0时API不应该发生变化。但很多开源库的开发者并没有严格遵守这个发布原则,导致了上面的这个问题。为了在不同的环境下生成相同的node_modules,npm使用package-lock.json。无论何时运行npm install,npm都会生成或更新package-lock.json。

npm install读取package.json创建依赖项列表,并使用package-lock.json来通知要安装这些依赖项的哪个版本。如果某个依赖项在package.json中,但是不在package-lock.json中,运行npm install会将这个依赖项的确定版本更新到package-lock.json中,不会更新其它依赖项的版本。

  //依赖更新场景一
  package.json中:"vue": "^2.0.0",package-lock.json中:"vue":2.1.0
  以上2.1.0在^2.0.0指定的范围内,npm install会安装vue2.1.0版本。
  //依赖更新场景二
  package.json中:"vue": "^2.2.0",package-lock.json中:"vue":2.1.0
  以上package-lock.json指定的2.1.0不在^2.2.0指定的范围内,npm install会按照^2.2.0的规则去安装最新的2.6.10版本,并且将package-lock.json的版本更新为2.6.10。

三.关于npm ci

npm版本至少是v5.7.1。此命令与 npm install 类似,不同之处在于它旨在用于自动化环境,例如集成测试环境、线上环境、或者您希望确保干净安装依赖项的任何情况。通过跳过某些面向用户的功能,它可以比常规的 npm install 快得多。它也比常规安装更严格,它可以捕获由于本地环境的增量安装引起的错误或不一致。

npm ci 是根据 package-lock.json 去安装确定的依赖,package.json 只是用来验证是不是有不匹配的版本,假设 package-lock.json 中存在一个确定版本的依赖 A,如果 package.json 中不存在依赖 A 或者依赖 A 版本和 lock 中不兼容,npm ci 就会报错。

  //npm ci和npm install 差异
  1项目必须存在 package-lock.json 或 npm-shrinkwrap.json。
  2如果 package-lock.json 中的依赖和 package.json 中不匹配,npm ci 会退出并且报错,而不是去更新 package-lock.json。
  3npm ci 只能安装整个项目的依赖,无法安装单个依赖。
  4如果 node_modules 已经存在,它将在 npm ci 开始安装之前自动删除。
  npm ci 永远不会改变 package.json 和 package-lock.json。
  5缓存 npm ci --cache .npm
  6npm ci 时建议加上 --quiet --no-progress 关闭进度和其他无用 log,否则产生的日志会很大。
  7所以 ci 时推荐完整的命令为 npm ci --cache .npm --quiet --no-progress

 欢迎转载:转载时请注明本文出处及文章链接

标签:


添加新评论

captcha
请输入验证码