导航


HTML

CSS

JavaScript

浏览器 & 网络

版本管理

框架

构建工具

TypeScript

性能优化

软实力

算法

UI、组件库

Node

业务技能

针对性攻坚

AI


作者:大阿阳链接:https://juejin.cn/post/7014500143453962271来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

npm

install 的时候都做了些什么 ?

在我们敲下 npm install 的时候 , npm 会做以下几件事情 .

  1. 检查 config

npm 执行会先读取 npm config 和 npmrc .

npmrc 是有权重的 ,

项目级 npmrc > 用户级 npmrc > 全局 npmrc > npm 内置 npmrc

  1. 检查是否存在 package-lock.json
  1. 检查缓存

以上就是我们执行 npm install 的过程 .

可以看得出来 , 缓存功能在 npm 整体架构中起到非常关键的作用 . 每次安装依赖时都会对对应包创建缓存 . 那我们如何查看缓存呢 ?

npm 缓存

我们可以通过


npm config get cache

这个命令获取 npm 缓存在本地的路径 . 我们进入该目录 , 进入 _cacache 目录 , npm 的缓存就放在该目录下

~/.npm/_cacache » ls

content-v2 index-v5 tmp

其中 content-v2 是 缓存2进制文件 , index-v5是缓存对应索引.

如何生成缓存

npm install 运行过程中 , 通过 pacote 先将依赖包下载到缓存中 , 把相应的包解压在 node_modules 下 .

pacote 依赖 npm-registry-fetch 来下载包, 在给指定路径下根据 IETF RFC 7234 生成缓存数据 .

如何利用缓存

在每次安装资源时 , 根据 package-lock.json 中存储的 integrity , version , name 信息生成一个唯一的 key . 这个 key 能对应到 index-v5 目录下的缓存记录 . 如果发现有缓存资源 , 就会找到 tar 包的 hash, 再次通过 pacote 把对应 2 进制文件 解压到对应 node_modules 下.

这样缓存的工作流程就结束啦 ~

npm link

想象一下 , 我们现在面临以下场景 .

我们开发了个依赖包 , 我们想要测试以下我们的依赖包 , 但是我们无法发布未经过测试的依赖包. 这下就成死循环了 ...

我们想到了一个最原始的方法 : 手动将依赖放到 node_modules 下 . 这样我们就可以开始测试了 . 这样虽然满足了当前的需求 , 但是一直手动 cv , 总是不优雅的 . 那么有没有一种能方法能解决这个需求呢 ?

我们的主角 npm link 登场

npm link的本质是创建一个软连接

工作原理是 : 将其链接到全局 node 模块安装路径中 . 为目标 npm 模块的可执行 bin 文件创建软连接 将其连接到全局 node 命令安装路径中 .

npx

npx 可以直接执行 node_modules/.bin 下的文件 , 可以自动去 node_modules/.bin 路径和环境变量 $path 中检查命令是否存在 .

npx 会在执行模块时 优先安装依赖 , 但是在安装结束后便删除该依赖 , 优点是 : 避免全局安装模块

(所以我们 npx create-react-app xxx 会默认安装 cra , 完成之后删除)

npm 中的源

npm 的本质就是个查询服务 (默认是 npmjs.org : registry.npmjs.org/)

我们可以使用 npm config set registry xxx来切换我们的源.

如果我们遇到了 , 不同的包的源不同 , 我们可以使用 npm 钩子 preinstall 执行 node 脚本 , 实现源切换 .

部署私有化 npm 的好处

  1. 确保高速 稳定的 npm 服务, 使发布私有模块更加安全
  2. 审核机制可保证模块质量和安全

yarn

install 的时候都做了些什么 ?

  1. 检测包
  2. 解析包
  3. 获取包
  4. 链接包