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

308 阅读3分钟

 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 只存储这个变化的文件,而不是整个新版本。