是什么?

Turborepo 就是一个管理「大项目仓库」的工具。
举个例子:如果你有一个前端项目,里面包含了用户端网站、管理后台、共享组件库、工具函数库这几个部分,它们原本可能是分开的文件夹甚至仓库。用了turborepo之后所有相关的项目可以放在一个仓库中,统一的管理相关联的项目,共享组件库,公共方法,代码规范等等。
在实际工作中,可能需要维护很多个项目,这些项目会用到公共的组件,公共方法,统一的规范。

  • 传统的做法可能是将公共方法复制粘贴到各个项目里。极其容易管理混乱,公共组件变化时需要挨个项目修改,各个项目以及项目人员也可能会针对不同项目做一定的修改,导致各个公共方法后续差异过大,维护成本很高。
  • 进阶一点可能维护一个或者多个组件或者公共方法仓库,然后通过install的方式引入到项目里,版本和环境较难控制,容易出现插件和项目中引用的三方环境版本不一致的问题。还有就是不同组件库之间规范可能会出现不一致的情况。
  • turbo版本,将组件和项目集成到一起,迁移以及版本管理相对轻松。避免我这可以运行,其他人不能运行的问题。还有就是统一构建顺序,可以统一先构建依赖再启动项目,避免组件修改后要先发组件包,然后项目中再引用下载,再启动的流程。

安装

  1. 装node(建议用node18以上的版本)
  2. 装pnpm (建议用10+的版本)
  3. 装turborepo 使用官方的cli创建一个示例项目 pnpm dlx create-turbo@latest

目录结构说明

装完之后重点关注几个文件

  1. app文件夹:用于存放应用,cli创建出来会有两个示例,一个next的后端项目,一个react的web项目,后续可以按照自己的技术栈进行修改。
  2. packages文件夹:存放公共组件,公共方法,项目规范等。
  3. turbo.json文件:turbo的相关配置,用来配置使用turbo运行,构建项目以及组件的相关配置。
  4. pnpm-workspace.yaml文件:主要通过 packages 字段指定工作区包含的目录,指定好之后,工作区配置的项目,会被pnpm识别到,install等操作会统一执行。并且项目内可以使用workspace中配置的本地项目或组件。
  5. package.json文件:全局的项目配置文件,用来精细化配置如何启动/构建项目以及启动/构建哪个项目,以及turbo项目的三方依赖管理。

具体配置

  1. packages文件夹:
    • 创建公共库A: 创建或者修改package.json中的name字段 改为@xx/commonA
    • 创建公共库B: 创建或者修改package.json中的name字段 改为@xx/commonB
      注:因为用了cli创建项目,pnpm-workspace.yaml中packages下会配置好packages/* 文件夹目录,假如不在packages文件夹下增加公共库,需要在pnpm-workspace.yaml里配置对应的文件夹。
  2. app文件夹:
    • 创建项目A:
      • 创建或者修改package.json中的name字段 改为@xx/projecA
      • 在package.json中配置dependencies:{“@xx/commenA”:“workspace:*”}
      • 注:配置dependencies或者devdependencies 要看库的类型和正常使用三方依赖一样。
  3. turbo.json:
    • 按需,具体参考turbo的配置文档。

项目中使用依赖库

  1. 分两种依赖
    • 情况一:项目运行时前置依赖,通常是运行前的一些依赖,比如eslint,或者读取加载静态配置等。
    • 情况二:项目中使用的依赖,比如组件库,工具方法。
  2. 两种依赖的使用
    • 直接调用依赖
    • 需要将依赖先打包成js再调用
  3. 使用时引入到对应项目的package.json中,执行一下全局的pnpm install将依赖下载到对应的项目中,然后就可以使用具体的依赖方法了。

流水线配置

  1. 项目初始化阶段(如刚下载下来项目,这步非必须,初始化执行可以提前知道自己的库的构建结果)
    • packages中如果有需要打包的库,打包工具可以使用tsup,unbuild等,按自己的喜好来。
    • 以tsup为例,需要对组件库先安装tsup,可以不用全局装,在库的package.json的scrip下增加build-package:tsup
    • 在根目录下的package.json的scrip下增加 postinstall:pnpm run -r build-package。这样每次在pnpm install 的时候就会将自己的库先打包。
  2. 打包或者运行阶段
    • 在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

更多推荐