在企业中搭建 monorepo 工程,我们有多种方案可供选择,其中常见的有三种:
• Lerna:Lerna 官网。
• Yarn+Workspace
• Pnpm+Workspace
综合考虑,我们选择了Pnpm方案来搭建工程。Pnpm 内置了对 monorepo 的支持,搭建过程简单快捷,门槛低,非常适合我们的需求。
在软件开发中,“工作区”是一个用于组织和管理项目文件、资源以及工具的逻辑容器。它就像一个工作空间,里面包含了工作所需的一切。
工作区的主要功能包括:
• 组织和管理项目文件:提供存储和组织项目文件的结构,如源代码、配置文件、测试文件等。
• 跨项目共享设置和工具:允许在多个项目间共享设置、依赖和工具,保持项目一致性,减少切换开销。
• 支持协同开发:团队成员可在同一工作区访问和修改项目文件,提高协同效率。
在许多编程语言、框架和开发工具中,都能看到工作区的概念。Pnpm 也提供了工作区功能,用于管理 monorepo 风格的多个项目。创建 Pnpm 工作区非常简单,只需创建一个名为pnpm-workspace.yaml
的文件,并在其中定义包含的目录。例如:
• 创建新目录:
• 初始化目录:
• 创建工作空间文件:
• 配置工作空间:
上述配置将components
、utils
和projects
目录下的所有子包纳入工作空间,使项目间能相互引用。其中:
• components
:存放公共组件。
• utils
:存放工具库。
• projects
:存放各个项目。
以utils
下的tools
目录为例,这是一个公共函数库,可正常打包、发布,并被工程中其他项目引用。首先,使用pnpm init
初始化该目录。
接下来,考虑 TypeScript 的安装位置。由于 TypeScript 不仅tools
会用到,其他项目大概率也会用到,因此选择将其安装到工作空间中:
-w
表示安装到工作空间。
源码开发如下:
为确保公共函数库的每个方法都可靠,需进行测试。选择 Jest 进行测试,同样将其安装到工作空间:
测试代码如下:
创建 Jest 配置文件:
为使 Jest 识别 TS 文件,安装以下依赖:
并确保 Jest 配置文件中的preset
设置为ts-jest
。
TypeScript 配置
创建 TS 配置文件:
修改配置如下:
选择 Rollup 进行打包,支持 CommonJS、Browser 和 ES Module 三种格式。安装以下依赖:
创建rollup.config.js
配置文件:
修改package.json
重点配置如下:
运行pnpm build
进行打包,完成后会在tools
根目录下生成dist
目录,包含打包后的文件。之后可将dist
上传到 npm 或私服。
测试项目引用
在projects
下创建新项目tools-test-proj
,使用pnpm init
初始化。由于tools-test-proj
需要使用tools
中的工具方法,可直接从工作空间安装:
安装完成后,package.json
中会显示该依赖,且来自工作空间:
在tools-test-proj
目录下创建src
源码目录,写入以下代码:
调整package.json
:
调整 TS 配置文件:
配置脚本:
执行pnpm start
,项目成功引入tools
依赖