目录
🖥️ 前言
◼️ npm
◼️ cnpm
◼️ yarn
◼️ pnpm
◼️ Bower
🖥️ 参考文献
🖥️ 参考资料
🖥️ 前言
如果你是前端开发者,或多或少都会接触到一些包管理工具,包管理工具是用于持续自动化程序的集合,例如安装、升级、配置和删除程序。使用包管理工具可以为前端开发解决很多问题,提高开发效率。
相信很多刚学习包管理工具的同学都说从认识npm开始的,但是其他的包管理工具你都用过哪些,都知道它们的优缺点吗?今天就和大家一起探讨一下!
主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这是包管理器都是基于 nodejs。
◼️ npm
NPM是Node.js的包管理器工具,是js开发人员共享打包的代码模块,是前端web应用程序等的开放源代码包的公共集合,npm也是命令行客户端开发人员用来安装和发布这些软件包的工具,npm,Inc.是负责托管和维护上述所有内容的公司。
起源:npm 是 2010 年发布的 nodejs 依赖管理工具,在此之前,前端的依赖管理都是手动下载和管理的。
优点:npm是一个成熟、稳定、并且有趣的包管理器。提供了一个非常有用的解决方案,支持大量的测试用例
缺点:
- 下载速度慢
- 安装速度慢
- 下载版本不一致
◼️ cnpm
cnpm 是阿里巴巴推出的包管理工具,安装之后默认会使用 https://registry.npmmirror.com 这个镜像源。cnpm支持所有
npm 命令
,它的安装命令和 npm 基本一致,通过 cnpm i 或者 cnpm install 命令来安装插件,当然在使用 `cnpm 前必须先通过npm安装。参考:浅谈npm、yarn、cnpm、pnpm
起源:国内使用npm下载太慢了,所以淘宝提供了镜像cnpm访问。
优点:跟npm使用区别不大,npm是国外站点资源,cnpm是国内站点资源,当然国内站点的要快一点。
缺点:npm有packge-lock.json是用来锁定安装的包的版本号,但是cnpm不受packge-lock.json的限制,cnpm只根据packge.json来下载安装包
◼️ yarn
yarn是安装和共享代码的软件包管理工具,也是项目管理工具,无论是小型项目还是大型单体仓库(monorepos),无论是业余爱好者,还是企业用户,Yarn都能满足需求。。它可以通过插件扩展,稳定,有很好的文档记录,免费和开源。yarn 是经过重新设计的崭新的 npm 客户端,它能让开发人员并行处理所有必须的操作,并添加了一些其他改进。运行速度得到了显著的提升,整个安装时间也变得更少。
起源:yarn 是 Facebook 于 2016 年 发布的替代 npm 的包管理工具,还可以作为项目管理工具,定位是快速、可靠、安全的依赖管理工具。
缺点:
-
存在幽灵依赖。
-
提升的依赖依然复制多份的问题。
优点:
-
运行速度获得了显著的提高,整个安装时间也变得更少
-
像npm一样,yarn使用本地缓存。与npm不一样的是,yarn无需互联网链接就能安装本地缓存的依赖项,它提供了离线模式。这个功能在2012年的npm项目中就被提出来过,但一直没有实现。
-
容许合并项目中使用到的全部的包的许可证
注意:yarn解决npm在某些方面的缺陷,并改进了速度和安全性等方面。如果你需要一个快速、高效且安全的包管理工具,并且你的项目相对较小,则应该使用yarn。
小结:yarn特性
1. 安装速度非常快,因为它可以并行下载和安装依赖包。
2. 支持离线安装,即使没有网络连接也能安装依赖包
3. 内置良好的安全检查功能,可以避免安全风险。
4. 与npm相比,yarn可以更准确地确定依赖关系,从而避免版本冲突问题。
5. 对于少数的一些依赖包,可能会出现兼容性问题。
6. 在某些情况下,与npm不兼容。
◼️ pnpm
pnpm 是一个速度快、磁盘空间大的软件包管理器。pnpm 使用内容可寻址文件系统将所有模块目录中的所有文件存储在磁盘上。使用 npm 或 Yarn 时,如果你有 100 个项目使用 lodash,则磁盘上将有 100 个 lodash 副本。使用 pnpm,lodash 将存储在内容可寻址的存储中。
起源:是 2017 年发布的一款替代 npm 包管理工具,具有速度快、节省磁盘空间的特点。它的大部分功能与npm相同,由于其特殊的工作机制,它可以极大地提高包安装和卸载的速度。
缺点:对老旧存量项目迁移pnpm可能需要踩坑
优点:
- pnpm运行起来非常的快,超过了npm和yarn
- pnpm采用了一种巧妙的方法,利用硬链接和符号链接来避免复制所有本地缓存源文件,这是yarn的最大的性能弱点之一
- pnpm继承了yarn的所有优点,包括离线模式和确定性安装
- pnpm 内置了对单个源码仓库中包含多个软件包的支持
- pnpm 创建的 node_modules 并非扁平结构,因此代码不能对任意软件包进行访问
注:pnpm解决了yarn存在的问题。 如果你需要一个可靠且稳定的包管理工具,并且你的项目是大型的企业级应用程序,则应使用npm或者pnpm
小结:pnpm特性
- 快速。比替代方案快 2 倍(参见基准测试)
- 高效。node_modules 内的文件是由一个可寻址的内容存储空间链接的。
- 非常适合 monorepos。
- 严格。一个包只能访问其 package.json 中指定的依赖关系。
- 确定性的。有一个名为 pnpm-lock.yaml 的 lockfile。
- 在任何地方都适用。支持 Windows、Linux 和 macOS。
- 久经沙场。自 2016 年以来被各种规模的团队在生产中使用。
◼️ Bower
Bower是一个客户端技术的软件包管理器,基于nodejs的静态资源管理工具。它可用于搜索、安装和卸载如JavaScript、HTML、CSS之类的网络资源,Bower管理的基本上都是前端工程师使用的东东。它擅长前端的包管理,通过其API展示了包依赖模型。使得项目不存在系统级的依赖,不同的应用程序间也不会共享依赖,整个依赖树是扁平的。
起源: Bower 是 twitter 推出的一款包管理工具,基于nodejs的模块化思想,把功能分散到各个模块中,让模块和模块之间存在联系,通过 Bower 来管理模块间的这种联系,其主要作用就是:为模块的安装、升级和删除,提供一种统一的、可维护的管理模式。
优点:约束松散,使用简单,可用模块众多
缺点:特点是对包结构没有强制规范,也因此bower本身并没有提供一套构建工具(当前应该能从社区中找到针对bower的构建工具),它充当的基本上是一个静态资源的共享平台。另外,直接在bower上安装模块稳定性难以保证(源的稳定性,以及国内网速的稳定性)。
不过如果是公司级别内部使用的话,结合公司本身的git仓库,并创建一个私有的bower server,并定制一套规范和打包工具,也是可行的。(好吧,这是我之前考虑过的在我厂内部实施的方案)
bower本身不存储模块文件本身(NPM以及SPM则会将模块作者的文件打包保存在自己的服务器中),也不保存模块的版本信息。模块的发布者通过注册(register)的方式,将模块的可访问的公开的git地址记录在bower的数据库中。而所有的版本都是通过模块发布者自己控制代码库的tag来决定的 。来源:npm,spm,bower 这三个包管理器的比较
更多参考:Web前端开发工具——bower依赖包管理工具 | Bower 网页 Web 开发软件包管理器
🖥️ 参考文献
[1] npm中文文档 | npm中文网
[2] cnpm - npm
[3] Home | Yarn - JavaScript 软件包管理器 | Yarn中文文档 - Yarn中文网
[4] pnpm - 速度快、节省磁盘空间的软件包管理器 | pnpm中文文档 | pnpm中文网
🖥️ 参考资料
软件包管理系统知多少 | 包管理工具,代码压缩编译等工具
rpm/yum/npm包管理器区别以及常用命令 | 常用软件包rpm/yum/npm区别
yum和apt-get包管理工具 | yum包管理工具详解 | 扒扒包管理器:Bower、Browserify、Duo