标签
note
字数
851 字
阅读时间
4 分钟
1.npm
npm 没出现之前 都是通过下载一些压缩过的 js 包,或者通过别人部署在 cdn 等线上 js 压缩包,这样的方式不管是贡献自己的 js 包,还是引用别人的 js 包都极其麻烦。没有合适的地方寻找,不能简单的升级版本。
npm 出现的好处
- 中央仓库 npm 服务器收集了大量的依赖包,有较为完善的文档,并且安装简单。
- 用户能够快速升级自己依赖包
- 使用 package.json 清晰管理到项目所依赖的包及其版本号
- 使用 nodemodule 形式本地安装依赖,减小了本地依赖压缩 js 库的大小
- 允许用户将自己编写的包或命令行程序上传到 npm 服务器供别人使用。
2.yarn
yarn 出现解决了 npm 的痛点:
- 痛点 1:npm install 会进行顺序安装 package.json 的包,yarn 采用了并行安装,大大提升了安装速度。
- 痛点 2:npm 每次安装都要重新安装,yarn 采用了缓存的方式,同样内容不会重复安装。
- 痛点 3:npm 之前没有使用 lock.json,安装版本混乱,后面 npm 更新汲取了 yarn 的 lock 优点
3.pnpm
3.1 为什么要用 pnpm?
pnpm 的优点:
- 节省磁盘空间
- 速度快
npm 和 yarn 本地如果有 100 个项目使用了同一个依赖吗,那么每个项目都会有这个依赖的副本,这样一来占用巨大的磁盘空间,二来一个文件升级过后会更改这个副本的全部内容进行重新安装。
使用 pnpm,他的方式是 100 个项目用到一个依赖,他会将不同项目中的版本之间的差异存储在本地类似中央仓库的样子,这样一个依赖包假设有 50 个文件,两个同依赖但不同版本不会全部修改,只会更改如 1 个文件的形式,比较完美的解决 npm 和 pnpm 的两个缺点
- 安全性
npm 安装包的安全性问题,如果 A 依赖 B, B 依赖 C,那么 A 当中是可以直接使用 C 的,但问题是 A 当中并没有声明 C 这个依赖,因此会出现这种非法访问的情况。 pnpm 采用的方式是依赖分割 npm 安装一个指定依赖包 express 的 node_module 目录
pnpm 安装的一个指定依赖的 node_module 目录,全是通过.pnpm 做目录结构依赖树,也就是根目录不是平铺的,只显示你所需要那个依赖 express(注意根目录的 express 只是显示,里面仍然没东西)
express 所依赖的是不会被展示在根目录的,通过.pnpm 里面的关系树软链到真实的代码目录
- 支持 monorepo,不用使用繁杂的 lerna,直接 pnpm 通过简单配置进行 monorepo,后面我也会更新一篇 lerna 做 monorepo 的。
等价命令
| npm | yarn | pnpm |
|---|---|---|
npx xxx | yarn run xxx | pnpm exec xxx |