npm、yarn和pnpm的古往今来

小广告:本人在找工作,有深圳南山、宝安的坑位,能否给个面试机会,谢谢

I. 引言

本文将深入探讨这三种包管理工具的背景、特点和使用场景,以帮助读者更好地了解它们,为自己的项目选择合适的工具。从最初的 Node.js 发布到包管理工具的崛起和不断演进,我们将带您一一解读,探索它们背后的故事和技术细节。

无论您是新手开发者还是资深工程师,相信本文都能为您带来一些有价值的信息和启发。让我们一起探索 npm、Yarn 和 PNPM 的世界,为我们的项目选择最佳伙伴!

1. NPM背景介绍

Node.js的第一个版本是由Ryan Dahl创建的,最初发布于2009年5月27日

该版本基于v8引擎,提供了一个事件驱动、非阻塞I/O环境,使得JS可以运行在服务器环境下

而为了解决node.js生态系统中包的管理问题,在2010年,Isaac Z. Schlueter发布了npm

2. 包管理工具的重要性

包管理工具在现代软件开发中是不可或缺的一部分,其重要性体现在以下几个方面:

  1. 依赖管理
    软件开发通常依赖于许多第三方库和工具。包管理工具能够方便地安装、更新和卸载这些依赖,确保项目能够顺利运行并保持最新状态。
  2. 版本控制
    包管理工具提供了对依赖项版本的控制机制。通过语义化版本控制(Semantic Versioning),开发者能够明确指定项目对依赖项的版本要求,避免由于版本不一致导致的兼容性问题。
  3. 易于分享和分发
    包管理工具使得开发者能够方便地分享自己的代码库(包)给其他人使用。这种分享机制促进了开源社区的发展,使得开发者能够从全球范围内获取并贡献代码。
  4. 构建和部署
    包管理工具通常集成了构建和打包的功能,简化了项目的构建过程。通过包管理工具,开发者可以轻松地将项目部署到生产环境中。
  5. 自动化任务
    包管理工具支持定义和运行各种自动化任务,例如运行测试、执行代码风格检查、生成文档等。这些任务可以通过配置文件或命令行参数进行定制,提高了开发过程的效率。
  6. 安全性
    包管理工具通常包含安全审查机制,能够检测并报告依赖项中存在的安全漏洞。这有助于开发者及时采取措施,保障项目的安全性。
  7. 多项目管理
    对于大型项目或使用多个子项目的情况,包管理工具支持工作区(workspace)和多包存储库,使得依赖项的管理更加灵活。
  8. 环境隔离
    包管理工具可以创建虚拟环境,将项目的依赖项隔离开来,避免了不同项目之间的冲突。这种隔离有助于确保项目在不同环境中的稳定性。

II. NPM的特点和优势

NPM全称Node Package Manager,从名称可以看出是node包的管理工具

  1. 便捷的包管理,通过简单命令,即可方便的安装、更新和卸载包,无需手动管理依赖关系
  2. 语义化版本控制,指定依赖包的版本范围,避免兼容问题
  3. 丰富的生态系统,庞大的生态系统,覆盖了几乎整个JS开发领域,可以轻松找到开发所需功能和工具
  4. 命令行工具,不仅提供了安装、卸载命令,也提供了脚本执行、查看依赖等工具
  5. 安全性,npm对包进行安全审查,及时报告安全漏洞

III. Yarn的独特之处

Yarn 是由 Facebook、Google、Exponent 和 Tilde 共同开发的开源项目(基于MIT许可证),于2016年10月发布,相比于npm,yarn有诸多优势

  1. 并行安装
    yarn能够并行安装依赖包,从而在速度上甩npm几条街,这也是大部分开发人员转投yarn的原因
    注:npm在2020年10月发布的7.0版本也开始支持并行安装,可以用npm install --legacy-peer-deps启用并行
  2. 锁定文件(lock file)
    yarn.lock文件记录了安装包的依赖版本,确保不同环境的依赖性保持一致
  3. 缓存策略和离线支持
    下载过的包会在本地缓存起来,当需要重新安装包时甚至可以脱离网络
  4. Workspace支持
    当需要在单个版本库管理多个相关包时,通过workspace可以轻松管理,共享依赖关系,并确保之间一致性
  5. Plug'n'Play(PnP)模式
    该模式下不需要安装实际依赖库,而是直接使用,减少 node_modules 文件夹体积和构建时间
  6. 处理重复依赖
    当有多个库重复依赖一个包时,yarn可以减少冗余,提高安装效率

IV. pnpm的崛起

pnpm是由 Zoltan Kochan 创建开源项目(基于MIT许可证),发布于2016年,但是开始流行是在2020年左右

主要特点有:

  1. 链接形式的共享模块
    使用符号链接共享相同的模块,减少磁盘空间占用
    相对于yarn的PnP模式,符号链接是在安装时共享模块,而PnP模式则是在运行时以虚拟文件系统加载依赖性
  2. 并行安装和缓存策略
    跟Yarn一样,pnpm支持并行安装和本地缓存,加快了安装效率和降低网络依赖
  3. 增量式安装
    当安装或是更新依赖时,pnpm会先检查依赖树,并与package.json比较,找出需要新增或更新的部分,而不是整个依赖树
  4. Workspaces支持
    使得更轻松管理多个包的版本库,共享依赖并保障一致性
  5. 预先编译
    pnpm install --frozen-lockfile 可以在安装时预先编译为二进制文件,减少构建时间
  6. 对Windows友好性
    • 符号链接对Windows新老版本都很友好
    • 针对Windows文件系统特性进行了优化
    • 积极关注和解决Windows平台的bug,稳定性更高

V. 选择建议

各个包管理工具,都有其适合的使用场景,需根据项目特点、团队需求进行选择

  1. npm适用中小型项目,有官方支持,与社区生态集成度高,尤其大部分框架和脚手架都默认适用npm
  2. yarn适用中大型项目,更快速的安装,更好的缓存机制, 并且yarn.lock可以确保团队中均使用相同依赖版本
  3. pnpm同样适用中大型项目或者monorepo结构的项目,符号链接减少磁盘占用, 并且对Windows平台极为友好

随着 JavaScript 生态系统的不断发展和项目规模的不断扩大,包管理工具的选择变得越来越重要。无论是对于小型项目还是大型项目,选择合适的工具都能够极大地提高开发效率和项目质量。

Ⅵ. 附录

相关推荐
学不会•1 小时前
css数据不固定情况下,循环加不同背景颜色
前端·javascript·html
EasyNTS2 小时前
H.264/H.265播放器EasyPlayer.js视频流媒体播放器关于websocket1006的异常断连
javascript·h.265·h.264
活宝小娜3 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点3 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow3 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
我开心就好o3 小时前
uniapp点左上角返回键, 重复来回跳转的问题 解决方案
前端·javascript·uni-app
刚刚好ā4 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
yqcoder6 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
会发光的猪。6 小时前
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
前端·javascript·vue.js
天下代码客7 小时前
【vue】vue中.sync修饰符如何使用--详细代码对比
前端·javascript·vue.js