一些知识点:
pnpm 工作空间
pnpm workspace 功能提供了对 monorepo 的支持。
要使用 pnpm workspace
,你需要在 monorepo 的根目录下创建一个 pnpm-workspace.yaml
文件,这个文件定义了哪些包是工作区的一部分。在 pnpm-workspace.yaml 文件中,你可以指定一个或多个包的路径。例如:
packages:
-'packages/*'
-'apps/*'
这表示工作区包含 packages 和 apps 目录下的所有子目录,每个子目录通常包含一个包。
pnpm 支持 workspace: 协议,允许你在依赖项中直接引用工作区中的其他包。例如,如果你有一个名为 foo 的包,并且想要在另一个名为 bar 的包中使用它,你可以在 bar 的 package.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 或其他工具进行代码内引用;