这是我参与「掘金日新计划 · 4 月更文挑战」的第 6 天,点击查看活动详情
设置源的问题
事情是这样的,我有一个项目,直接依赖了私包A,私包A对应的私仓地址是私仓A';又依赖了公开包B,B又依赖了私包C,私包C对应的私仓地址是私仓C'。因此我一共有三个npm源需要使用,一个是全局的npm/cnpm源,还有项目直接依赖包的私仓A',以及项目间接依赖的私仓B'。
我将项目下的.npmrc设为:
registry=https://registry.npm.taobao.org/
A:registry=A'
C:registry=C'
发现只对项目的直接依赖A:registry=A'生效,而对间接依赖C:registry=C'不生效。
最终无奈🤷🏻♀️之下,只能暂时将私包C发在了npm。也许获取npm的依赖图,然后再安装之前替换间接依赖的私仓地址可行?但权宜之计是发在npm处理了。
cnpm的问题
其实一开始使用的是cnpm,但是.npmrc对cnpm完全无效,它根本不会去读取这个文件。它自己有一个.cnpmrc的配置,但是必须在系统根目录下,当前根目录设置是无效的,多么鸡肋,怎么可能每次去系统根目录下设置呢?
npm源设置优先级顺序(从高到低)
项目级别配置:xx项目的根目录下的.npmrc文件 用户级别配置:
windows下 C:\Users\yourname\ .npmrc mac下 ~/.npmrc
全局级别配置:
windows下 C:\Users\yourname\AppData\Roaming\npm\etc\npmrc mac下 /etc/npmrc
npm install的执行过程
-
检查并获取 npm 配置,优先级为:项目根目录下的 .npmrc 文件 > 用户根目录下的 .npmrc 文件 > 系统根目录下的 .npmrc 文件 > npm 内置的 .npmrc 文件。
-
检查项目中是否有 package-lock.json 文件。如果有,则检查 package-lock.json 和 package.json 声明的依赖是否一致:
2.1 一致,则直接 package-lock.json 中的信息,从缓存或网络资源中加载依赖;
2.2 不一致,按照 npm 版本进行处理,查看不同版本的包是否规范一直,若一直则按照
package-lock.json为准,若不一致则以package.json的版本下载(不同版本的npm策略略有不同)。 -
如果没有,则根据 package.json 递归构建依赖树。然后按照构建好的依赖树下载完整的依赖资源,在下载时就会检查是否存在相关资源缓存:
3.1 存在,则将缓存内容解压到 node_modules 中;
3.2 不存在,先从 npm 远程仓库下载包,校验包的完整性,并添加到缓存,同时解压到 node_modules。
-
生成
package-lock.json文件
常用命令集合
总结一些使用npm会常用到的命令:
- 全局设置npm源:
npm config set registry xxxx
- 查看全局设置的npm源:
npm config get registry xxx
- 查看npm设置列表:
npm config list
- 查看npm缓存:
npm cache clean --force
- 清除npm缓存:
npm cache clean --force
.npmrc设置
;设置全局源
registry=https://registry.npm.taobao.org/
;设置单个源
@cmvalue:registry=http://npm.cmvalue.net/
nvm管理node与npm依赖
单独更新npm会导致node与npm版本不对应的问题,以及拉高版本会导致某些项目依赖的包无法正常使用的问题,这也是笔者在期间遇到的,因此使用nvm进行node/npm版本切换管理是必要的。
下载nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
或者
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
环境变量生效:
source ~/.bashrc
or
source ~/.zshrc
查看下本地上的node/npm环境
nvm ls
下载某个node/npm版本,注意是下载node版本,npm会随着node的版本相应安装
nvm install 14.13.0
查看当前本机node/npm版本:
发现已生效。