Skip to content

一些知识点:

pnpm 工作空间

pnpm workspace 功能提供了对 monorepo 的支持。

要使用 pnpm workspace,你需要在 monorepo 的根目录下创建一个 pnpm-workspace.yaml 文件,这个文件定义了哪些包是工作区的一部分。在 pnpm-workspace.yaml 文件中,你可以指定一个或多个包的路径。例如:

yaml
packages:
  -'packages/*'
  -'apps/*'

这表示工作区包含 packages 和 apps 目录下的所有子目录,每个子目录通常包含一个包。

pnpm 支持 workspace: 协议,允许你在依赖项中直接引用工作区中的其他包。例如,如果你有一个名为 foo 的包,并且想要在另一个名为 bar 的包中使用它,你可以在 bar 的 package.json 文件中这样声明依赖:

json

"dependencies": {
  "foo": "workspace:*"
}

这告诉 pnpm 去链接工作区中名为 foo 的包,而不是从远程仓库安装它。

pnpm 还提供了一些命令来管理工作区中的包,例如 pnpm add、pnpm update 和 pnpm uninstall,这些命令可以通过 --filter 或 -w 选项来指定特定的工作区包。

此外,pnpm 允许你在工作区的根目录下执行脚本,这对于在多个包之间共享脚本非常有用。你可以在根 package.json 文件中定义脚本,然后使用 pnpm run

如果你需要在工作区中安装依赖,你可以使用 pnpm install 命令,它会安装所有包的依赖项。如果你想要为特定的包安装依赖,可以使用 pnpm add --filter 。

pnpm 还支持在 .npmrc 文件中设置 link-workspace-packages 选项,当设置为 true 时,pnpm 会优先链接工作区中的包,而不是从远程仓库安装。

简而言之,它们允许多个项目一起存在于同一个存储库中并相互交叉引用 - 对一个源代码的任何修改都会立即应用于其他项目。

在没有 monorepo 的时候,我们通常会通过 npm 软链接的方式。

monorepo 具有以下优点:

  • 避免重复安装包
  • 同一个 monorepo 中不同的 package 之间可以互相引用,便于代码重用
  • 代码重用将变得非常容易:由于所有的项目代码都集中于一个代码仓库,我们将很容易抽离出各个项目共用的业务组件或工具,并通过 TypeScript,Lerna 或其他工具进行代码内引用;