node.js - pnpm 快速且节省磁盘的新一代包管理工具

发布时间 2023-12-19 19:21:20作者: 箫笛

相较于传统的 npm 和 Yarn,pnpm 采用了一种全新的依赖管理方式,通过共享依赖来减少磁盘占用,同时提供了快速的安装和更新速度。

1. 安装pnpm

npm install -g pnpm

2. 初始化项目

pnpm init
pnpm root # 打印有效的存放模块(modules)的目录

3. 配置pnpm (本地配置文件为项目下的.npmrc)

pnpm config list # 显示所有config的设置
pnpm config get <key> # 显示config设置的某一项
pnpm config set <key> <value> # 设置config的某一项
pnpm delete <key> # 从配置中删除配置的key

4. 安装项目依赖

pnpm install # 安装项目所有依赖
pnpm i --offline # 仅从store中离线下载
pnpm i -D # 仅安装devDependencies并删除已安装的dependencies,无论 NODE_ENV是什么
pnpm i -P # 使用这个指令pnpm会忽略NODE_ENV ,强制pnpm以production的方式执行install命令

5. 安装依赖包

  • 从npm源安装
    pnpm add <pkg> # 默认保存到 dependencies
    pnpm add -P <pkg> # 保存到 dependencies
    pnpm add -D <pkg> # 保存到 devDependencies
    pnpm add -g <pkg> # 全局安装

  • 从本地安装
    pnpm add ./package.tar.gz # 从源码文件 (.tar, .tar.gz, or .tgz) 安装
    pnpm add ./some-directory 从本地目录安装
    注意: 当从目录安装时,会在当前项目目录中生成一个 symlink node_modules, 因此这里跟执行 pnpm link 是一致的.

  • 从远端安装tar包
    pnpm add https://github.com/indexzero/forever/tarball/v0.5.6

  • 从git安装
    pnpm add <git remote url>

6. 更新依赖

pnpm upgrade <pkg>
pnpm update <pkg>
pnpm up <pkg>

7. 删除依赖

pnpm remove <pkg>
pnpm uninstall <pkg>
pnpm rm <pkg>
pnpm un <pkg>

8. 使本地包可在其他位置访问

pnpm link <dir> # 将包从 dir 链接到执行命令的包的 node_modules
pnpm link --dir <dir> # 将包从当前工作目录链接到 dir
pnpm link --global # 将此命令执行位置的包链接到全局以便其他包从全局引用
pnpm link --global <pkg> # 将指定的包pkg从全局 node_modules 链接到 package 的 node_modules
pnpm link --global --dir <dir> # 将指定位置的包链接到全局以便其他包从全局引用
pnpm link --global <pkg> --dir <dir> # 将指定的包pkg从全局 node_modules 链接到 dir node_modules

9. 管理包存储

pnpm store status # 查看 store 中已修改的包
pnpm store add <pkg> # 将包加入存储中
pnpm store path # 返回存储目录路径
pnpm store prune # 清理未引用的包

10. 本地运行命令

pnpm run <script-name> # 运行 package.json 文件中定义的脚本
pnpm start # 运行start属性指定的脚本
pnpm test # 运行test属性指定的脚本
pnpm exec jest # 执行依赖项node_modules/.bin中的jest命令
pnpm create react-app my-app 从 create-* 或 @foo/create-* 启动套件创建my-app项目。

11. 卸载pnpm

pnpm ls -g # 列出所有全局包
pnpm root -g # 列出全局包目录
pnpm rm -g <pkg> # 删除某个全局包
rm -rf $(pnpm store path) # 删除全局内容可寻址存储
npm rm -g pnpm # 卸载pnpm

12. pnpm vs npm

  • npm v3开始使用平铺的依赖结构,这可以减少磁盘占用,却导致node_modules目录的混乱。
  • pnpm 使用硬连接和符号连接到全局磁盘内容可寻址存储来管理node_modules, 这将带来更少的磁盘占用空间,也能保持node_modules整洁。
  • pnpm 正确的node_modules结构的好处是,让你无法使用package.json中没有指定的模块, npm的平铺依赖结构则有这个问题。