当前位置: 首页 > 科技观察

关于npm、pnpm、yarn和npx

时间:2023-03-13 02:35:36 科技观察

包管理器的历史最早发布的包管理器是npm,发布于2010年1月。它确立了包管理器如何工作的核心原则。npm的发布迎来了一场项目依赖手动下载和管理的革命。npm引入文件和元数据字段,将依赖项列表存储在package.json文件中,并将下载的文件保存到node_modules文件夹中。随着node的发展,node的包越来越多,人们给项目添加的依赖也越来越多。如何更快地下载,如何安全地下载,已经为人们所关注。于是在2016年,Facebook等公司开发了新的包管理器,也就是我们现在经常用的yarn。yarn的结构设计参考了npm,导致yarn的初始版本主要通过并行化来解决安装加速的问题。当然,yarn也提出了一些新的概念,比如离线缓存、文件锁定、缓存感知等。当yarn出现后,越来越多的人意识到了npm的不足,于是有人在yarn之后发明了一个新的npm版本,定义为pnpm。pnpm和npm、yarn的管理策略不同,它通过引入内容可寻址存储来提升性能。通过生成嵌套的node_modules文件夹,每个版本的依赖只在物理上存储一次,节省了大量的磁盘空间。通过符号链接,实现文件的依赖管理。在pnpm之后,yarn感受到了对手的挑战,于是在2020年,yarn2诞生了。这是一个全新的包管理器。可以说与之前的纱线相比有了很大的变化。它依靠PnP方式管理,依靠查找表进行包管理,同时每个包都以zip的形式存储,大大节省了磁盘空间。npmnpm通过install安装包,然后在当前目录下生成一个package.json文件和node_modules文件夹。package.json文件保存的是上报的版本,node_modules文件夹保存的是完整的包文件。yarnyarn通过add安装包。同样,它总是会在当前目录下生成一个package.json文件和node_modules文件夹。不同的是,它会有自己的锁文件yarn.lock,还会生成.yarn/cache/缓存文件夹。pnpmpnpm项目初始状态看起来像一个npm项目,它也有一个package.json文件和一个node_modules文件夹,不同的是在node_modules文件夹下,它有自己的文件夹目录.pnpm,在这个目录下,它的每一个package会被平铺存储,然后以依赖名和版本号命名,实现版本复用。并且不会将机器缓存中的依赖复制到项目目录中,而是通过硬链接的方式,可以减少空间占用。npxnpx要解决的主要问题是调用项目内部安装的模块。比如项目内部安装了测试工具webpack。如果我们要使用它,需要通过node-modules/.bin/webpack-v来使用,但是有了npx,我们可以直接使用npxwebpack-v。另外,对于一些全局命令,如果不存在,会自动下载并安装到一个临时目录,然后使用,不会污染全局空间。结论包管理器的当前状态非常好。我们已经实现了几乎所有主要包管理器的功能对等。然而,它们在本质上确实有很大的不同。pnpm乍一看很像npm,因为它们的CLI用法相似,但管理依赖关系却大不相同;pnpm的方法可以带来更好的性能和最佳的磁盘空间效率。YarnClassic仍然很受欢迎,但它被认为是遗留软件,可能会在不久的将来放弃支持。YarnBerryPnP是一个新贵,但尚未看到其彻底改变包管理器格局的潜力。