npm install策略

npm install 和 npm ci

一. npm install

npm install 更新策略:

  • 执行npm install的时候,会先比较package.json和package-lock.json,
  • 如果package-lock.json里面的版本符合package.json的要求,那么就会安装package-lock.json的版本;那么,这个内容是从哪里来的呢?答案是优先从.npmrc里来,即缓存里。同时安装缓存文件里的版本更新package-lock.json;
  • 如果不符合,那么就会安装package.json中的版本,并更新package-lock.json。这个内容就应该是从网路里来了。

npm install的整体流程:

检查 .npmrc 文件:优先级为:项目级的 .npmrc 文件 > 用户级的 .npmrc 文件> 全局级的 .npmrc 文件 > npm 内置的 .npmrc 文件

关于.npmrc: https://juejin.cn/post/6983522411647860766

检查项目中有无 lock 文件:

  • 无 lock 文件:

    1. 从 npm 远程仓库获取包信息

    2. 根据 package.json 构建依赖树,构建过程:

      • 构建依赖树时,不管其是直接依赖还是子依赖的依赖,优先将其放置在 node_modules 根目录。
      • 当遇到相同模块时,判断已放置在依赖树的模块版本是否符合新模块的版本范围,如果符合则跳过,不符合则在当前模块的 node_modules 下放置该模块。

      注意这一步只是确定逻辑上的依赖树,并非真正的安装,后面会根据这个依赖结构去下载或拿到缓存中的依赖包

    3. 在缓存中依次查找依赖树中的每个包
      在这里插入图片描述

  1. 生成 lock 文件
  • 有 lock 文件:

    1. 检查 package.json 中的依赖版本是否和 package-lock.json 中的依赖有冲突。
    2. 如果没有冲突,直接跳过获取包信息、构建依赖树过程,开始在缓存中查找包信息,后续过程相同。

npm 提供了几个命令来管理缓存数据:

  • npm cache add:官方解释说这个命令主要是 npm 内部使用,但是也可以用来手动给一个指定的 package 添加缓存。

  • npm cache clean:删除缓存目录下的所有数据,为了保证缓存数据的完整性,需要加上 --force 参数。

  • npm cache verify:验证缓存数据的有效性和完整性,清理垃圾数据。

基于缓存数据,npm 提供了离线安装模式,分别有以下几种:

  • –prefer-offline:优先使用缓存数据,如果没有匹配的缓存数据,则从远程仓库下载。

  • –prefer-online:优先使用网络数据,如果网络数据请求失败,再去请求缓存数据,这种模式可以及时获取最新的模块。

  • –offline:不请求网络,直接使用缓存数据,一旦缓存数据不存在,则安装失败。

二. npm ci

npm ci 参考链接:https://www.cnblogs.com/listen9436/p/13984978.html
npm ci 和 npm install 类似,都可以用来安装依赖。但npm ci旨在用于自动化环境,如测试平台,持续集成和部署。它比常规的 npm install 安装快,也比常规安装更严格。

npm ci与npm install主要有以下的区别:

  • npm i依赖package.json,而npm ci依赖package-lock.json。
  • 当package-lock.json中的依赖和package.json不一致时,npm ci退出但不会修改package-lock.json。
  • npm ci只可以一次性的安装整个项目依赖,无法添加单个依赖项。
  • npm ci安装包之前,会删除掉node_modules文件夹,因此它不需要去校验已下载文件版本与控制版本的关系,也不用校验是否存在最新版本的库,所以下载的速度更快。
  • npm ci安装时,不会修改package.json与package-lock.json。

参考自:https://godrry.com/archives/in-short-the-overall-process-of-npm-install.html


总结:

1. npm install

先看有无锁文件;

  • 如果有,则对比package.json和package-lock.json,

    1. 如果package-lock.json里包版本号符合package.json要求,则直接获取包信息(如果是从远程拉取,则按照package-lock.json,否则以实际缓存的为准),构建依赖树,(注意这一步只是确定逻辑上的依赖树,并非真正的安装,后面会根据这个依赖结构去下载或拿到缓存中的依赖包);那么接下来就看.npmrc里有没有缓存,如果有缓存文件,则从缓存文件中拉取内容,否则从远程拉取;并更改package-lock版本号。
    2. 如果版本号不符合要求,则直接从远程拉取,本更新package-lock版本号。
  • 如果没有锁文件,则:

    1. 根据package.json构建依赖树(注意这一步只是确定逻辑上的依赖树,并非真正的安装,后面会根据这个依赖结构去下载或拿到缓存中的依赖包);
    2. 如果缓存中(.npmrc)有,则优先从缓存中读取,否则从远程读取;注意:(如果是从远程拉取,则按照package.json,否则以实际缓存的为准)

2. npm ci

  • npm i依赖package.json,而npm ci依赖package-lock.json。
  • npm ci安装包之前,会删除掉node_modules文件夹,因此它不需要去校验已下载文件版本与控制版本的关系,也不用校验是否存在最新版本的库,所以下载的速度更快。
  • npm ci安装时,不会修改package.json与package-lock.json。
  • npm ci安装包之前,会删除掉node_modules文件夹,因此它不需要去校验已下载文件版本与控制版本的关系,也不用校验是否存在最新版本的库,所以下载的速度更快。
  • npm ci只可以一次性的安装整个项目依赖,无法添加单个依赖项。

在这里插入图片描述

如何查看缓存文件

  1. 下面的命令,可以用于查看本机的npm缓存的位置:
npm config get cache

一般来说,默认的路径是这样的:

  • win系统的路径基础是:%APPDATA%/npm-cache/
  • mac系统下路径基础是:~/.npm/
    在这里插入图片描述
  1. 进入_cacache目录,我们看到如下内容:
    在这里插入图片描述
    从结构中我们大致可以看出,content-v2应该就是缓存的内容,index-v5应该就是缓存内容的索引,没错了,缓存文件就放在_cacache中。

在这里插入图片描述

npm 在执行安装时,可以根据 package-lock.json 中存储的 integrity、version、name 生成一个唯一的 key 对应到 index-v5 目录下的缓存记录,从而找到依赖包的 hash,然后根据 hash 去缓存目录下找到具体包的内容。

例如:
1.

"koa": {
      "version": "2.10.0",
      "resolved": "http://registry.m.jd.com/koa/download/koa-2.10.0.tgz",
      "integrity": "sha1-hqWD/ygIltzjo2sLba6A+VWSQNM=",
 "koa": {
      "version": "2.13.4",
      "resolved": "http://registry.m.jd.com/koa/download/koa-2.13.4.tgz",
      "integrity": "sha1-7lsMs54LgGnDjRFROcd0gz0yRi4=",

为了再次验证缓存文件在这个文件夹下,我们安装了koa来测试一下,安装完会在package-lock.json文件夹下生成如下内容:

也就是这个koa的内容integrity(集成)在后面的hash值里。

我们现在知道一个包至少有4个内容,显而易见分别是包名、版本号、具体下载tar包的URL、一个不知道通过什么算出来的integrity值。

为了进一步知道这些信息被用在哪了,我就在index-v5这个目录里搜了一把,只搜koa有很多内容,只搜版本号也有很多内容,在经过几次尝试后,我发现搜那个URL会得到一个结果:

  1. 强制清除缓存

清除缓存的命令,如下:

npm cache clean

npm官方是强烈不建议清空缓存;另外,值得说明的是,清空的只是其中一个目录_cacache,并不是所有的目录。

npm指定目录安装依赖包

参考链接:https://www.codenong.com/14469515/

您可以使用–prefix选项:

mkdir -p ./install/here/node_modules
npm install <package> --prefix ./install/here

安装在指定目录中。即使上级层次结构中已经存在node_modules目录,NPM也会自动创建node_modules文件夹。当然,在./install/here文件夹下需要有package.json文件

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当执行命令npm install pnpm -g时,如果出现报错,可能是因为在此系统上禁止运行脚本。你可以按照以下步骤解决该问题: 1. 在系统中搜索框中输入"Windows PowerShell",然后右键点击并选择"以管理员身份运行"。 2. 在打开的PowerShell窗口中输入以下命令,然后按回车键执行: ``` set-executionpolicy remotesigned ``` 3. 根据提示输入"A"来确认更改执行策略。 4. 然后再次执行命令"pnpm -v",应该能够成功执行了。 需要注意的是,如果是使用npm命令来安装pnpm这类cli命令工具,必须将其安装到全局环境中才能生效。 另外,如果你想设置pnpm的源为淘宝源,可以使用以下命令: ``` pnpm config set registry http://registry.npm.taobao.org ``` 这样就可以使用淘宝源来下载和安装包了。 如果你还想对pnpm进行其他配置,可以使用以下命令: - 设置pnpm版本: ``` pnpm --version ``` - 设置pnpm全局仓库路径: ``` pnpm config set store-dir "D:\.pnpm-store" ``` - 设置pnpm全局安装路径: ``` pnpm config set global-dir "D:\nodejs\pnpm\pnpm-global" ``` - 设置pnpm全局bin路径: ``` pnpm config set global-bin-dir "D:\nodejs" ``` - 设置pnpm创建pnpm-state.json文件的目录: ``` pnpm config set state-dir "D:\nodejs\pnpm" ``` - 设置pnpm全局缓存路径: ``` pnpm config set cache-dir "D:\nodejs\pnpm\cache" ``` 在项目配置中,你可以在项目根路径下添加一个.npmrc文件,并在其中设置"shamefully-hoist=true",这可以帮助你使用pnpm进行包的下载和安装。 最后,如果你想使用pnpm来下载包,可以使用以下命令: - 下载包: ``` pnpm install <package> ``` - 下载包并将其写入dependencies: ``` pnpm add <package> -S ``` - 下载包并将其写入devDependencies: ``` pnpm add <package> -D ``` - 全局安装包: ``` pnpm add -g <package> ``` - 移除包: ``` pnpm remove <package> ``` - 移除全局包: ``` pnpm remove <package> --global ``` - 更新所有依赖项: ``` pnpm up ``` - 更新包: ``` pnpm upgrade <package> ``` - 更新全局包: ``` pnpm upgrade <package> --global ``` - 设置存储路径: ``` pnpm config set store-dir /path/to/.pnpm-store ``` - 启动项目: ``` pnpm run dev ``` 希望以上信息对你有帮助!如果你还有其他问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [pnpm使用](https://blog.csdn.net/gdyjdao/article/details/129375963)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [npm install 原理](https://blog.csdn.net/weixin_47450807/article/details/124233169)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

. . . . .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值