一.npm,nvm,nrm,npx,cnpm相关概念
//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 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部分命令 npm install -g nrm //全局安装nrm nrm ls //查看可选源 星号代表当前使用源 //若nrm ls运行时报'ERR_REQUIRE_ESM'错误,可能时open库9.0.0后使用了ESM,不再支持CommonJS. //使用npm install -g nrm open@8.4.2 --save 安装后修复 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 create-react-app my-app //这条命令临时安装create-react-app包,命令完成后create-react-app会删掉,不会出现在global中。下次执行,还会重新临时安装。 npx -p node@8 npm run build //指定node版本来运行npm scripts
cnpm i不受package-lock.json影响,只会根据package.json进行下载。 cnpm i xxx@xxx不会跟新到package-lock.json中去。 npm i xxx@xxx会跟新到package-lock.json中去。 总结:所以在实际开发中不建议使用cnpm
//同为包管理工具 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
https://baijiahao.baidu.com/s?id=1726423980119026076&wfr=spider&for=pc https://blog.csdn.net/weixin_43820866/article/details/105232066
https://blog.csdn.net/qq_40434213/article/details/120617908