跳到主要内容

pnpm

参考 山月, 掘金

pnpm workspace的常用命令

包管理工具发展史

npm2

依赖之间层层嵌套

问题:

  • 多个包之间有公共依赖,同样的依赖会复制很多次
  • 嵌套过深,windows 有文件路径的限制

yarn

yarn 将依赖平铺在 node_modules

可能会有嵌套,因为一个包可能有多个版本被依赖,提升只能提升一个版本

npm3 也使用平铺的方案

问题:

  • 幽灵依赖
  • 一个包有多个版本时,仍然会重复

软链接与硬链接

ln -s [file] [target file]  软链接
ln [file] [target file] 硬链接
bash

示例

$ ln -s hello hello-soft
$ ln hello hello-soft

ls -lih

total 8.0K
792886 -rw-r--r-- 2 root root 1.1K Dec 30 22:01 hello
792886 -rw-r--r-- 2 root root 1.1K Dec 30 22:01 hello-hard
792887 lrwxrwxrwx 1 root root 5 Dec 30 22:03 hello-soft -> hello
bash

区别:

  • 软链接可理解为指向源文件的指针,它是单独的一个文件,仅仅只有几个字节,它拥有独立的 inode
  • 硬链接与源文件同时指向一个文件地址,它与源文件共享数据,拥有相同的 inode

使用 pnpm 时,node_modules 的结构

  • package.json中 dependencies 依赖的包都在node_modules下,它们都软连接到.pnpm
$ ls -lih

total 0
793204 lrwxrwxrwx 1 root root 41 Jan 1 16:20 express -> .pnpm/express@4.18.2/node_modules/express
793216 lrwxrwxrwx 1 root root 33 Jan 1 16:22 vue -> .pnpm/vue@3.2.45/node_modules/vue
  • .pnpm下的包硬链接到全局的 store
  • .pnpm下的包的依赖有的硬链接有的软链接.pnpm下的包
  1. 在 link-module 中 pnpm link --global,创建全局软链接
  2. 在 project-A 中pnpm link --global link-module

monorepo

掘金 monorepo 的组件库搭建

创建

新建 pnpm-workspace.yaml,声明对应的工作区

packages:
- docs
- packages/*
yaml

Workspace 协议 (workspace:)

{
"dependencies": {
"foo": "workspace:*",
"bar": "workspace:~",
"qar": "workspace:^"
}
}
json

workspace 包打包发布时,将会动态替换这些 workspace: 依赖

{
"dependencies": {
"foo": "1.5.0",
"bar": "~1.5.0",
"qar": "^1.5.0"
}
}
json