【turborepo】- 初探
·
是什么?
Turborepo 就是一个管理「大项目仓库」的工具。
举个例子:如果你有一个前端项目,里面包含了用户端网站、管理后台、共享组件库、工具函数库这几个部分,它们原本可能是分开的文件夹甚至仓库。用了turborepo之后所有相关的项目可以放在一个仓库中,统一的管理相关联的项目,共享组件库,公共方法,代码规范等等。
在实际工作中,可能需要维护很多个项目,这些项目会用到公共的组件,公共方法,统一的规范。
- 传统的做法可能是将公共方法复制粘贴到各个项目里。极其容易管理混乱,公共组件变化时需要挨个项目修改,各个项目以及项目人员也可能会针对不同项目做一定的修改,导致各个公共方法后续差异过大,维护成本很高。
- 进阶一点可能维护一个或者多个组件或者公共方法仓库,然后通过install的方式引入到项目里,版本和环境较难控制,容易出现插件和项目中引用的三方环境版本不一致的问题。还有就是不同组件库之间规范可能会出现不一致的情况。
- turbo版本,将组件和项目集成到一起,迁移以及版本管理相对轻松。避免我这可以运行,其他人不能运行的问题。还有就是统一构建顺序,可以统一先构建依赖再启动项目,避免组件修改后要先发组件包,然后项目中再引用下载,再启动的流程。
安装
- 装node(建议用node18以上的版本)
- 装pnpm (建议用10+的版本)
- 装turborepo 使用官方的cli创建一个示例项目 pnpm dlx create-turbo@latest
目录结构说明
装完之后重点关注几个文件
- app文件夹:用于存放应用,cli创建出来会有两个示例,一个next的后端项目,一个react的web项目,后续可以按照自己的技术栈进行修改。
- packages文件夹:存放公共组件,公共方法,项目规范等。
- turbo.json文件:turbo的相关配置,用来配置使用turbo运行,构建项目以及组件的相关配置。
- pnpm-workspace.yaml文件:主要通过 packages 字段指定工作区包含的目录,指定好之后,工作区配置的项目,会被pnpm识别到,install等操作会统一执行。并且项目内可以使用workspace中配置的本地项目或组件。
- package.json文件:全局的项目配置文件,用来精细化配置如何启动/构建项目以及启动/构建哪个项目,以及turbo项目的三方依赖管理。
具体配置
- packages文件夹:
- 创建公共库A: 创建或者修改package.json中的name字段 改为@xx/commonA
- 创建公共库B: 创建或者修改package.json中的name字段 改为@xx/commonB
注:因为用了cli创建项目,pnpm-workspace.yaml中packages下会配置好packages/* 文件夹目录,假如不在packages文件夹下增加公共库,需要在pnpm-workspace.yaml里配置对应的文件夹。
- app文件夹:
- 创建项目A:
- 创建或者修改package.json中的name字段 改为@xx/projecA
- 在package.json中配置dependencies:{“@xx/commenA”:“workspace:*”}
- 注:配置dependencies或者devdependencies 要看库的类型和正常使用三方依赖一样。
- 创建项目A:
- turbo.json:
- 按需,具体参考turbo的配置文档。
项目中使用依赖库
- 分两种依赖
- 情况一:项目运行时前置依赖,通常是运行前的一些依赖,比如eslint,或者读取加载静态配置等。
- 情况二:项目中使用的依赖,比如组件库,工具方法。
- 两种依赖的使用
- 直接调用依赖
- 需要将依赖先打包成js再调用
- 使用时引入到对应项目的package.json中,执行一下全局的pnpm install将依赖下载到对应的项目中,然后就可以使用具体的依赖方法了。
流水线配置
- 项目初始化阶段(如刚下载下来项目,这步非必须,初始化执行可以提前知道自己的库的构建结果)
- packages中如果有需要打包的库,打包工具可以使用tsup,unbuild等,按自己的喜好来。
- 以tsup为例,需要对组件库先安装tsup,可以不用全局装,在库的package.json的scrip下增加build-package:tsup
- 在根目录下的package.json的scrip下增加 postinstall:pnpm run -r build-package。这样每次在pnpm install 的时候就会将自己的库先打包。
- 打包或者运行阶段
- 在turbo.json的tasks配置项下增加build,dev两个配置,并新增dependsOn:[“^build”] 代表先执行依赖库package.json script中的build。如果配置的不是build打包命令,在dependsOn这个数组里可以增加对应的命令。直接执行pnpm turbo run build 将会按顺序打包
- dependsOn中还可以更粒度的配置具体项目的依赖,比如打包项目A只需要打包依赖A,其他不需要,那么可以配置(这样配置有局限性,还是建议全都打包最好)
"@xx/projectA#build": { "dependsOn": [ "@xx/commonA#build" // 显式依赖 libs/utils 的 build ], "outputs": ["dist/**"] } - 直接执行pnpm turbo run build --filter=@xx/projectA
更多推荐

所有评论(0)