此文是对 pnpm的重要贡献者Zoltan Kochan的几篇关于pnpm、monorepo文章的翻译概括,可能存在不准确的部分。

为什么要使用pnpm?

pnpm是一种更高效快捷的包管理器。 Zoltan Kochan认为,yarn只是对npm做了些微改进,提升了速度、增加了一些属性,但并没有改变npm的扁平化依赖结构。而扁平化结构自带以下问题:

  1. 模块可以访问自身并不依赖的包;
  2. 依赖树的扁平化算法相当复杂;
  3. 有一些包不得不拷贝进项目的node_modules目录;

Zoltan Kochan对pnpm的研发投入了更多的时间,pnpm取得了成功,囊括了yarn所有增加的属性:

  1. 安全:代码执行前对其进行检查,以确保依赖安装的完整性;
  2. 离线模式:pnpm将所有已下载包的压缩文件保存在本地镜像仓库,以实现离线使用,只需要配置--offline参数;
  3. 快速:pnpm速度大概是npmyarn的1/3左右。因为yarn需要拷贝包,而 pnpm只需要把包存在全局仓库,任何需要的地方指向它即可。

比较npm与pnpm的依赖结构

npm@2的node_modules

  • node_modules中的每一个依赖都有其自身的node_modules,所有依赖项都在package.json中指定;
  • 如果多个包依赖同一个包a,则a要在不同的包中多次复制;
  • 由于依赖关系层层嵌套,树的结构过深会产生长路径。

npm@3的node_modules

为了解决npm@2的问题,npm@3采用扁平化的路径:

  • 就算你只下载一个依赖foo,npm 也会把整个依赖树展平在node_modules根目录下,你可以访问到你没有注册下载的依赖bar@1。如果你的项目使用了bar@1但你没标注在package.json里,一旦foo更新了依赖版本、或者去掉了依赖bar@1,你的项目可能崩溃。

pnpm的node_modules

为了解决npm@2的问题,pnpm把依赖包展平,但是通过软链接把每个包自身的依赖组合在一起。

  • node_modules根节点foo是个软链接。因为node遇到软链接会直接执行其真实路径,所以require('foo') 将会执行路径node_modules/.registry.npmjs.org/foo/1.0.0/node_modules/foo/index.js 的文件 而不是node_modules/foo/index.js;
  • 每个包的文件夹下都没有自身的node_modules;
  • foo的依赖bar与foo位于文件夹的同一层,两者都属于node_modules
  • foo也可以require('foo'),因为它位于node_modules文件夹下。

pnpm的优势

我的理解:

  1. pnpm就是把你项目的所有依赖包都放在了电脑上的一个公共仓库,但是项目里仍然保存着各种包的依赖关系和对应位置,需要哪个就去公共仓库里找。
  2. 如果不同项目、同一项目的不同包存在同样的依赖,可以共享同一份依赖。如果需要一个依赖的不同版本,则会单独在公共仓库里下载一下差异文件,从而减少依赖包的总体积,方便快速查找;
  3. pnpm需要把所有直接或间接的项目依赖都注册到package.json里,使用pnpm i a的时候不用加--save它也会自动帮你在package.json中注册a。

为什么要把所有代码放到一个仓库?

Zoltan Kochan也曾极力反对monorepo,他认为npm已经拥有为数众多的、颇受欢迎的贡献者,这些人在npm上拥有成百上千个包,每个包都有各自独立的仓库。但是所有人都做的事就是对的吗?不尽然。
实践中,他觉得大多数包都不需要有自己独立的仓库,因为很多情况下一经发布,就不再更新。而且大部分包也无人问津,没那么多人要往你仓库里提代码。而使用同一个仓库,则减少了引用和更新管理的频率,方便迁移。
可以使用pnpm的递归命令来安装所有依赖pnpm recursive install

参考文献

Why should we use pnpm?
It is OK to keep random things in a single monorepo
pnpm's strictness helps to avoid silly bugs

作者:欧石楠
链接:https://www.jianshu.com/p/e1b1d46ca169
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

备补: pnpm 优点:
1、效率更高
2、更小的空间占用(同一版本的包只会下载一次)
3、安全,与yarn一样,不会出现像npm那样的意外错误

更好的包管理器——pnpm相关推荐

  1. Windows中使用包管理器(类似于apt/yum的) - Chocolatey

    Windows中使用包管理器 - Chocolatey简介 李俊才 的 CSDN 博客 邮箱 :291148484@163.com CSDN 主页:https://blog.csdn.net/qq_2 ...

  2. nodejs第五天 npm yarn pnpm 包管理器

    文章目录 npm package.json 安装包 全局安装 配置镜像 yarn 安装使用 镜像配置 pnpm 使用 镜像 npm node中的包管理器叫做npm(node package manag ...

  3. 安装pnpm包管理器

    确保NodeJs已经安装好!!! 安装好的NodeJs,自带npm包管理器 什么是pnpm? 官网地址: https://www.pnpm.cn/ 安装pnpm 如何升级pnpm 设置镜像源 查看 p ...

  4. pnpm、yarn和npm包管理器淘宝镜像和对比

    pnpm的特点 1.快速 pnpm比其他包管理器快2倍. pnpm 不仅比 npm 快,而且比 yarn 快.无论是冷缓存还是热缓存,它都比 yarn 快.yarn 从缓存中复制文件,而 pnpm 只 ...

  5. 又一个短小精悍的软件包管理器-pnpm

    一个上班摸鱼的契机,看到了pnpm这个新名词,带着我的一丝好奇和一丝疑问,就想着了解一下. 什么是pnpm? pnpm是我们正常印象中的软件包管理器,类似的我们肯定用过淘宝的cnpm,无非是如何又全又 ...

  6. 关于依赖管理的真相 — 前端包管理器探究

    大厂技术  高级前端  Node进阶 点击上方 程序员成长指北,关注公众号 回复1,加入高级Node交流群 前言 npm是Node.JS的包管理工具,除此之外,社区有一些类似的包管理工具如yarn.p ...

  7. 前端包管理器的依赖管理原理

    本文主要探究前端包管理器的依赖管理原理,希望对读者有所帮助. 前言 npm是Node.JS的包管理工具,除此之外,社区有一些类似的包管理工具如yarn.pnpm和cnpm,以及集团内部使用的tnpm. ...

  8. javascript原理_JavaScript程序包管理器工作原理简介

    javascript原理 by Shubheksha 通过Shubheksha JavaScript程序包管理器工作原理简介 (An introduction to how JavaScript pa ...

  9. Swift 4.1增强了泛型、编译器和包管理器

    \ 看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料! \ \\ Swift 4.1发布正式版,它为Swift包管理器和Foundation带来了新的语言特性 ...

最新文章

  1. C# Task注意事项
  2. Runtime-消息发送和消息转发
  3. BZOJ 4212: 神牛的养成计划
  4. 函数式编程语言时代已经来临
  5. C#使用属性进行之传递查询报表
  6. Python面向对象---类的基本使用
  7. Jenkins 设置镜像_我常用的SpringBoot+Jenkins自动化部署技巧,贼好用,推荐给大家...
  8. 生信多组学整合工具的比较研究
  9. 【opencv学习】【hough圆检测】
  10. Cloudera Manager安装之Cloudera Manager 5.3.X安装(三)(tar方式、rpm方式和yum方式)...
  11. html post与get的区别,post 和get请求的区别(html)
  12. 分布排序(distribution sorts)算法大串讲
  13. unitywebplayer 32/64 5.3版本
  14. VC2013 ArcGIS Engine 10.0开发环境搭建
  15. 【GPU精粹与Shader编程】(一) 开篇 全系列11本书核心知识点总览
  16. 逻辑表达式在c语言中作用,C语言中逻辑表达式与关系表达式的值
  17. java 根号x_Java-求根号n
  18. 常用 ASCII 码对照表
  19. 2019.9.1课程设计报告
  20. 小人数字时钟安卓版本APP

热门文章

  1. AAMA 2605铝型材和板材上的超高性能有机涂层的推荐规范、性能要求和测试方法
  2. 新点软件怎么导入清单_excle表怎么导入新点,怎样把EXCEL表格导入project 中?
  3. 《大数据之路:阿里巴巴大数据实践》-第2篇 数据模型篇 -第8章 大数据领域建模综述
  4. asp.net core + 前端H5 页面视频站制作尝试
  5. matlab保存pdf图片乱码,服务器上出现pdf导出乱码的解决方案
  6. 云服务器和虚拟主机哪个好?两者有什么优缺点?
  7. 简易的四位随机数生成
  8. VUE 前端SSO单点登录
  9. Open Cascade造型算法——倒圆与倒角
  10. 个人网页主页设计(实现三种魔方展示效果)