注册
web

你真的了解包管理工具吗?(npm、pnpm、cnpm)

 npm (Node Package Manager)


概述



npm 是 Node.js 的官方包管理器,也是全球使用最广泛的 JavaScript 包管理工具。它用于管理 JavaScript 项目的依赖包,可以通过命令行来安装、更新、卸载依赖包。



特点



  • Node.js 官方默认包管理器。支持全局和本地安装模式
  • 通过 package.json 和 package-lock.json 管理依赖版本,可以在 package.json 中定义各种脚本命令

常用命令


npm install [package]       # 安装包
npm uninstall [package] # 卸载包
npm update [package] # 更新包
npm init # 初始化项目
npm run [script] # 运行脚本
npm publish # 发布包

依赖管理方式



npm 使用平铺的 node_modules 结构,会导致依赖重复和幽灵依赖问题(phantom dependencies)。这种管理方式导致npm在处理在处理大量依赖时速度会很慢



cnpm (China npm)


特点



  • 镜像加速:使用淘宝的 npm 镜像,下载速度更快
  • 兼容 npm:命令与 npm 基本一致,学习成本低
  • 安装简单:可以通过 npm 直接安装 cnpm

概述


cnpm 是阿里巴巴团队开发的 npm 命令行工具,基于淘宝镜像 registry.npmmirror.com,用于解决国内访问 npm 官方源缓慢的问题。


特点



  • 镜像加速:使用淘宝的 npm 镜像,下载速度更快
  • 兼容 npm:命令与 npm 基本一致,学习成本低
  • 安装简单:可以通过 npm 直接安装 cnpm

本质是和npm一样,只是为了迎合国内的网络环境,更改了依赖包的下载地址,让下载速度更快


pnpm (## Performant npm)


概述



pnpm 是一个新兴的、高性能的包管理工具,最大的特点是使用硬链接(hard link)来复用依赖文件,极大节省磁盘空间和提升安装速度。



特点



  • 高效存储:多个项目可以共享同一版本的依赖,节省磁盘空间
  • 磁盘空间优化:通过硬链接共享依赖,显著节省了磁盘空间。
  • 强制封闭依赖:避免隐式依赖,提高了依赖管理的可靠性。
  • 速度更快,兼容性更好:安装速度比 npm 和 yarn 更快,兼容 npm 的工作流和 package.json

依赖管理方式


pnpm (Performant npm) 的依赖管理方式与传统包管理器(npm/yarn)有本质区别,其核心基于内容可寻址存储符号链接技术。



  • 内容可寻址存储 (Content-addressable storage)

pnpm 将所有依赖包存储在全局的 ~/.pnpm-store 目录中(默认位置),存储结构基于包内容的哈希值而非包名称。这意味着: 1. 相同内容的包只会存储一次 2.不同项目可以共享完全相同的依赖版本3.通过哈希值精确验证包完整性



  • 符号链接 (Symbolic links) 结构

image.png


举例解释就是



 场景假设:你有 100 个项目,每个项目都用到了相同的 lodash 库


1. npm:每个项目都自己带一本书



  • npm 的方式

    • 每个项目都有一本完整的 lodash,即使内容一模一样。
    • 结果:你的硬盘上存了 100 本相同的书(100 份 lodash 副本),占用大量空间。
    • 更新问题:如果 lodash 发布新版本,哪怕只改了一行代码,npm 也会重新下载整本书,而不是只更新变化的部分。



2. pnpm:所有项目共享同一本书



  • pnpm 的方式

    • 统一存储:所有版本的 lodash 都存放在一个中央仓库(类似“云端书库”)。
    • 按需链接:每个项目只是“链接”到这本书,而不是复制一份。
    • 版本更新优化:如果 lodash 新版本只改了一个文件,pnpm 只存储这个变化的文件,而不是整个新版本。




作者:zayyo
来源:juejin.cn/post/7518212477650927666

0 个评论

要回复文章请先登录注册