导航
作者:大阿阳链接:https://juejin.cn/post/7014500143453962271来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
在我们敲下 npm install 的时候 , npm 会做以下几件事情 .
npm 执行会先读取 npm config 和 npmrc .
npmrc 是有权重的 ,
项目级 npmrc > 用户级 npmrc > 全局 npmrc > npm 内置 npmrc
(因为 npm 版本不同会导致处理方式不同 , 所以这里有一个最佳实践 , 团队的 npm 版本要相同)以上就是我们执行 npm install 的过程 .
可以看得出来 , 缓存功能在 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 下.
这样缓存的工作流程就结束啦 ~
想象一下 , 我们现在面临以下场景 .
我们开发了个依赖包 , 我们想要测试以下我们的依赖包 , 但是我们无法发布未经过测试的依赖包. 这下就成死循环了 ...
我们想到了一个最原始的方法 : 手动将依赖放到 node_modules 下 . 这样我们就可以开始测试了 . 这样虽然满足了当前的需求 , 但是一直手动 cv , 总是不优雅的 . 那么有没有一种能方法能解决这个需求呢 ?
我们的主角 npm link 登场
npm link的本质是创建一个软连接
工作原理是 : 将其链接到全局 node 模块安装路径中 . 为目标 npm 模块的可执行 bin 文件创建软连接 将其连接到全局 node 命令安装路径中 .
npx 可以直接执行 node_modules/.bin 下的文件 , 可以自动去 node_modules/.bin 路径和环境变量 $path 中检查命令是否存在 .
npx 会在执行模块时 优先安装依赖 , 但是在安装结束后便删除该依赖 , 优点是 : 避免全局安装模块
(所以我们 npx create-react-app xxx 会默认安装 cra , 完成之后删除)
npm 的本质就是个查询服务 (默认是 npmjs.org : registry.npmjs.org/)
我们可以使用 npm config set registry xxx来切换我们的源.
如果我们遇到了 , 不同的包的源不同 , 我们可以使用 npm 钩子 preinstall 执行 node 脚本 , 实现源切换 .