

npm,pnpm,yarn,npx的那些事儿
source link: https://www.fly63.com/article/detial/12149
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

扫一扫分享
包管理器历史
最早发布的包管理器是 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 年, yarn 2诞生了,这是一个全新的包管理器,可以说它和之前的 yarn 改动非常大,它通过了 PnP 的方法进行依赖的管理,通过依赖查找表进行包的管理,同时,每个包通过zip的方式进行存储,大大节省了磁盘空间。
npm 通过 install 来安装包,然后会在当前目录生成一个 package.json 文件 和 node_modules 文件夹,package.json 文件保存了报的版本,node_modules 文件夹保存了完整的包文件。
yarn 通过 add 来安装包,同样地,它也会在当前目录总生成一个package.json 文件 和 node_modules 文件夹,不同的是,它会有自己的锁定文件 yarn.lock, 此外它还会生成.yarn/cache/ 缓存文件夹。
pnpm 项目的初始状态看起来就像一个 npm 项目一样,也是有 package.json 文件 和 node_modules 文件夹,不同的是在 node_modules 文件夹中, 它有自己的文件夹目录 .pnpm,在这个目录中,它会用平铺的方式来存储各个包,然后以依赖名和版本号的名字命名,实现了版本的复用。而且它不是通过拷贝机器缓存中的依赖到项目目录下,而是通过硬链接的方式,这能减少空间占用。
npx想要解决的主要问题,就是调用项目内部安装的模块。比如项目内部安装了测试工具webpack,我们要使用的话需要通过node-modules/.bin/webpack -v这样来使用,但是有了npx,我们可以直接npx webpack -v就能使用。此外,对于一些全局命令,如果不存在,它会自动下载安装到一个临时目录,然后使用,不会污染全局空间。
包管理器的当前状态非常好。我们几乎在所有主要的包管理器中实现了功能平等。但是,它们在引擎盖下确实存在很大差异。

pnpm 起初看起来像 npm,因为它们的 CLI 用法相似,但管理依赖项却大不相同;pnpm 的方法带来更好的性能和最佳的磁盘空间效率。Yarn Classic 仍然很受欢迎,但它被认为是遗留软件,并且在不久的将来可能会放弃支持。Yarn Berry PnP 是新贵,但尚未看到它彻底改变包管理器领域的潜力。
Recommend
-
60
Both pnpm (as of v2.17) and Yarn (as of v1.12) support fast, concurrent installations in monorepos. However, there is a big difference betwee...
-
7
news view node依赖管理 Node的依赖管理工具 使用一个名为package.json的文件,用户可以通过npm install –save命令把项目里所有...
-
11
npm 和 npx 的区别 npm:Node Package(包)Manager(管理器)npx :Node Package(包)Execute(执行) 众所周知,npm 是 Node.js 的软件包管理器,其目标是自动化的依赖性和软件包管理。 这意味着...
-
8
How To Upgrade NVM, NPM, Node, and NPXAs a “backender” in the world of ̶J̶a̶v̶a̶S̶c̶r̶i̶p̶t̶ frontend, I was looking for commands and options on keeping versions of core components consistent. That’s mainly about NVM, NPM,...
-
26
Stop Using NPM/Yarn. Use PNPM InsteadWhy I switched from NPM/Yarn to PNPM and why you should too
-
4
Motivation pnpm is more performant at fetching, resolving, and storing dependencies. My personal experience shows that in some projects pnpm can be approx. 10x time fas...
-
6
由 pnpm 做出來的效能比較:npm、yarn 以及 pnpm 找資料的時候看到 pnpm 有在做幾個常見的 javascript package manag...
-
6
速通 npm、yarn、pnpm速通 npm、yarn、pnpm2023-03-06codingnpm<v3 node 依赖管理器的起源,在 npm 前两个版本中,依赖无限嵌套...
-
7
-
8
I replaced npm, yarn and nvm with pnpmPublished: 2023.12.01 · 1 minute readI used to use npm as my package manager because I like d...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK