一个上班摸鱼的契机,看到了pnpm这个新名词,带着我的一丝好奇和一丝疑问,就想着了解一下。

什么是pnpm?

pnpm是我们正常印象中的软件包管理器,类似的我们肯定用过淘宝的cnpm,无非是如何又全又快又小巧地获取需要拉取的软件包。

它给自己的slogan是【速度快】、【节省磁盘空间】这两个前缀,具体我们再往下了解下。

pnpm和yarn/cnpm/npm有什么区别?

谈到差别,最主要的还是它标语提到的两点,一个是时间,一个是空间。
它也是在官网上有一个TAB,就是写的【性能对比】,具体来看看它提供的是怎样的成绩。

取了一次更新于【Jan 1, 2023, 3:20 AM】的分析说明
测试的点有:

  • clean install: 在没有任何lockfile、packages、node_modules时
  • with cache, with lockfile, with node_modules: 在首次install之后,再次install后
  • with cache, with lockfile: 当开发人员获取存储库并首次运行安装时
  • with cache: 与上面的相同,但包管理器没有可以使用的lockfile
  • with lockfile: 当安装在 CI 服务器上运行时
  • with cache, with node_modules: 删除lockfile并再次运行安装命令
  • with node_modules, with lockfile: 删除包缓存并再次运行安装命令
  • with node_modules: 删除包缓存和lockfile,并再次运行安装命令
  • update: 通过更改 package.json 中的版本并再次运行安装命令来更新依赖项

使用一个固定的package.json进行测试

{"name": "alotta-modules","version": "0.0.1","dependencies": {"animate.less": "^2.2.0","autoprefixer": "^10.4.8","babel-core": "^6.26.3","babel-eslint": "^10.1.0","babel-loader": "^8.2.5","babel-plugin-lodash": "^3.3.4","babel-plugin-module-resolver": "^4.1.0","babel-plugin-transform-decorators-legacy": "^1.3.5","babel-plugin-transform-runtime": "^6.23.0","babel-polyfill": "^6.26.0","babel-preset-es2015": "^6.24.1","babel-preset-react": "^6.24.1","babel-preset-react-hmre": "^1.1.1","babel-preset-stage-1": "^6.24.1","babel-runtime": "^6.26.0","clean-webpack-plugin": "^4.0.0","core-decorators": "^0.20.0","css-loader": "^6.7.1","css-mqpacker": "^7.0.0","cssnano": "^5.1.13","custom-event-polyfill": "^1.0.7","draft-js": "^0.11.7","ejs": "^3.1.8","eslint": "^8.23.0","eslint-config-airbnb": "^19.0.4","eslint-import-resolver-webpack": "^0.13.2","eslint-plugin-import": "^2.26.0","eslint-plugin-jsx-a11y": "^6.6.1","eslint-plugin-react": "^7.31.6","express": "^4.18.1","express-http-proxy": "^1.6.3","font-awesome": "^4.7.0","fready": "^1.0.0","glob": "^8.0.3","gulp": "^4.0.2","gulp-concat": "^2.6.1","gulp-csslint": "^1.0.1","gulp-cssnano": "^2.1.3","gulp-eol": "^0.2.0","gulp-less": "^5.0.0","gulp-livereload": "^4.0.2","gulp-minify-css": "^1.2.4","gulp-postcss": "^9.0.1","gulp-rename": "^2.0.0","gulp-util": "^3.0.8","happypack": "^5.0.1","highcharts": "^10.2.1","highcharts-solid-gauge": "^0.1.7","history": "^5.3.0","howler": "^2.2.3","imports-loader": "^4.0.1","jquery": "^3.6.1","jquery-ui": "1.13.2","js-cookie": "^3.0.1","json-loader": "^0.5.7","leftpad": "^0.0.1","less": "^4.1.3","lesshat": "^4.1.0","lodash": "^4.17.21","medium-draft": "^0.5.18","mobx": "^6.6.1","mobx-react": "^7.5.2","moment": "^2.29.4","moment-range": "^4.0.2","moment-timezone": "^0.5.37","password-policy": "0.0.3","postcss-reporter": "^7.0.5","progress": "^2.0.3","qs": "^6.11.0","raw-loader": "^4.0.2","rc-slider": "^10.0.1","react": "^18.2.0","react-addons-css-transition-group": "^15.6.2","react-addons-shallow-compare": "^15.6.3","react-dnd": "^16.0.1","react-dnd-html5-backend": "^16.0.1","react-dom": "^18.2.0","react-draft-wysiwyg": "^1.15.0","react-dropzone": "^14.2.2","react-grid-layout": "^1.3.4","react-highcharts": "^16.1.0","react-hot-loader": "4.13.0","react-input-calendar": "^0.5.4","react-lazyload": "^3.2.0","react-measure": "^2.5.2","react-mixin": "^5.0.0","react-responsive": "9.0.0-beta.10","react-responsive-tabs": "^4.4.3","react-router": "^6.3.0","react-router-dom": "^6.3.0","react-select-plus": "1.0.0-rc.3.patch12","react-skylight": "^0.5.1","react-sortablejs": "^6.1.4","react-tappable": "^1.0.4","react-tooltip": "4.2.21","react-virtualized": "^9.22.3","react-waypoint": "^10.3.0","sortablejs": "^1.15.0","style-loader": "^3.3.1","stylelint": "^14.11.0","superagent": "^8.0.0","uglify-js": "^3.17.0","uuid": "^8.3.2","verge": "^1.10.2","webpack-bundle-analyzer": "^4.6.1","webpack-hot-middleware": "^2.25.2","webpack-notifier": "^1.15.0","webpack-split-by-path": "^2.0.0","whatwg-fetch": "^3.6.2"},"devDependencies": {"nan-as": "^1.6.1"}
}

将npm/pnpm/Yarn/Yarn Pnp四个管理器进行比对。

  • npm是一个有效的软件包管理器,但是出于国内资源的不稳定性,还是会给使用者一些困扰,比如安装的不确定性(可以通过开启skrinkwrap实现预测,并不默认),安装程序有风险
  • yarn是一个在npm的基础上,默认创建yarn.lock文件,包含安装内容的校验和,来确保库的版本相同。不仅提升了安全性,运行速度也是有显著提升
  • 虽然yarn已经很优秀了,但是pnpm在性能上给出了更好的成绩,也利用硬链接和符号链接来避免复制所有本地缓存源文件(yarn最大的性能弱点)

pnpm有什么特点和优势?

主要就是节省磁盘空间并且提升安装速度,这是它存在的动机,具体来说:

  • 去除多依赖包副本的逻辑,统一存放依赖包,不同版本分别存储
  • 安装软件包时,使用需要的文件都硬链接至此位置,不占用额外磁盘空间,不同项目可以共享相同版本的依赖包
  • 扁平化的node_modules目录结构,也极大地解决Windows系统下可能的依赖包存储问题

如何安装和使用pnpm?

pnpm的安装方法有很多,官方也有明确指导,可以看这里

1.通过脚本安装:windows\posix系统\Linux
2.通过Corepack安装
3.通过npm安装
4.通过homebrew安装
5.通过scoop安装

那我本地是已经具备npm的条件,我尝试使用npm来安装pnpm,非常快速地就安装上了

a@b:~$ sudo npm install -g pnpm
Password:
/usr/local/bin/pnpx -> /usr/local/lib/node_modules/pnpm/bin/pnpx.cjs
/usr/local/bin/pnpm -> /usr/local/lib/node_modules/pnpm/bin/pnpm.cjs
+ pnpm@7.22.0
added 1 package in 1.736sa@b:~$ which pnpm
/usr/local/bin/pnpm

也有pnpm与npm对比的指令

npm 命令 pnpm 等价命令
npm install pnpm install
npm i pnpm add
npm run pnpm

直接看一下pnpm安装成功了没?

a@b:~$ pnpm -v
ERROR: This version of pnpm requires at least Node.js v14.6
The current version of Node.js is v8.16.0
Visit https://r.pnpm.io/comp to see the list of past pnpm versions with respective Node.js version support.

根据错误提示,说必须要Node.js v14.6及以上,那么我目前是 v8.16.0,我这边使用n指令(是node版本管理器)来切换一下node的版本,最终pnpm是可以使用了

a@b:~$ node -v
v14.15.0
a@b:~$ pnpm -v
7.22.0

此外升级和卸载指令:

  • pnpm add -g pnpm
  • pnpm rm -g pnpm

又一个短小精悍的软件包管理器-pnpm相关推荐

  1. 怎么理解ubuntu中的软件包管理器apt和dpkg

    大家都知道在ubuntu下,安装软件经常会用到一个命令就是"apt-get install",这里的apt命令,其实是linux系统下一个通用的软件包管理器,使用该命令可以很方便的 ...

  2. helm部署仓库中没有的包_Kubernetes的Helm软件包管理器简介

    helm部署仓库中没有的包 Before we dive into the Helm package manager, I'm going to explain some key concepts t ...

  3. BZOJ4196:[NOI2015]软件包管理器——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4196 https://www.luogu.org/problemnew/show/P2146 你决定 ...

  4. Linux学习笔记重新梳理20180702 之 yum软件包管理器

    2019独角兽企业重金招聘Python工程师标准>>> Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中 ...

  5. BZOJ4196[Noi2015]软件包管理器——树链剖分+线段树

    题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...

  6. 微软开源 Windows 软件包管理器 winget,一行命令安装软件

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 来源 | https://www.oschin ...

  7. 【NOI2015】软件包管理器

    NOI难得的水题,话说还是T2诶--又学到了线段树的一种新的魔性使用 看sxysxy大神的代码才写出来的,sxysxy_orz 原题: Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包 ...

  8. bzoj4196:[Noi2015]软件包管理器

    Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...

  9. yum(Fedora和RedHat以及SUSE中的Shell前端软件包管理器)命令详解

    yum官方网站:http://yum.baseurl.org/ Fedora对于yum的介绍:http://fedoraproject.org/wiki/Yum yum(全称为 Yellow dog ...

最新文章

  1. Nature综述:Rob Knight带你分析微生物组数据(2020版)
  2. sublime php 乱码,sublime打开TXT文件乱码的问题
  3. 初次使用Windbg调试简单C++程序
  4. Qt Creator连接裸机设备
  5. firefox下可恶的value
  6. CentOS7 install spark+ipython-nodebook
  7. [转载] Python数学实验与建模 课后习题第1章解析
  8. Android 5.1 memory leak,Android 性能优化之使用MAT分析内存泄露问题
  9. svn汉化依然失败无解
  10. 黑苹果系统发热与续航
  11. 轻松理解java前期绑定(静态绑定)与后期绑定(动态绑定) 的区别。
  12. Codeforces Round #657 (Div. 2) B. Dubious Cyrpto(思维,数学)
  13. 如何通过多线程执行单个任务?
  14. ESP32自动更新气象站
  15. 电脑播放器哪个最好用
  16. 硅谷来信丨一招阻击恶意软件攻击:沙箱集成MITRE ATTCK攻击框架
  17. ORM框架Gorm-删除记录
  18. 化工行业多计量单位管理
  19. Android 接入网易易盾 SDK (文本检测)
  20. KeyboardEvent.metaKey 苹果电脑command键按下、win键按下

热门文章

  1. git 版本管理系统
  2. 请问转换音乐格式的软件有哪些
  3. OFweek(第三届)2018中国高科技产业大会在深圳开幕
  4. OpenHarmony 物联网设备开发环境搭建
  5. 这批钛媒体90后已经瞎了、秃了、腰椎间盘突出了
  6. 同時acts_as_tree 和 ancestry gem
  7. 浙大计算机科学与技术专业课表,周亚金 - 浙江大学 - 计算机科学与技术
  8. 中科院研究院:三峡工程将来最大的受害者是上海
  9. 【转载】细嚼慢咽读论文:PointNet论文及代码详细解析
  10. 帝国霸业服务器无限加载,帝国霸业银河生存控制台的服务器命令是什么_控制台服务器命令一览_3DM单机...