背景
lerna转交Nrwl维护
- vue仓库大量从
yarn迁移到pnpm
Monorepos相比Polyrepo优势
Monorepos指多个项目放到一个git仓库,Polyrepo指多个项目对应多个git仓库,在特定场景下,
Monorepos有以下优势:
-
便于复用代码、代码更方便查阅
-
原子化提交,一个
commmit能包含整个功能 -
第三方包版本一致性
-
一致的开发链
Monorepos 工程难题
依赖处理
-
同版本依赖只安装一次
-
允许不同版本依赖共存
-
workspace包项目引用
workspace cli
-
执行
workspace所有脚本 -
执行
workspace指定脚本
workspace publish
以往Monorepos方案
依赖管理
yarn workspace管理依赖
workspace cli
执行全包命令
执行单包命令
lerna run --scope package build
workspace publish
新的Monorepos方案
依赖管理
从yarn迁移到pnpm是因为pnpm非常快,并且内置了workspace的能力
workspace cli
如果项目简单,推荐使用pnpm的workspace就足够了,如果复杂,推荐使用nx来管理
执行全包命令
nx run-many --target=build --all
执行单包命令
workspace publish
如果是从lerna迁移到nx,可以继续使用lerna publish,新的仓库推荐使用release-it
迁移方案
迁移到pnpm
迁移到pnpm workspace
lerna 迁移到 nx
nx介绍
性能
- 任务仅仅可配置缓存
Local Computation Caching,同时nx的缓存更新算法类似React的diff算法,非常高效,而且支持云端缓存Distributed Computation Caching,可以让整个团队享受缓存加速
- 可分布式执行任务
Distributed task execution,下图是不同数量机器下同一任务执行的速度比较
- 可智能检测改动影响到的包,只编译此次commit改动到的包(
affected)
以上性能方案,只有云端缓存和分布式任务需要额外配置,开发者只需要执行诸如nx affected --target=test nx的缓存和只启动影响到的包的任务的好处,非常方便
灵活性
-
支持任务编排
Local task coordination -
支持
Executor,社区诸如linter、unit test、e2e test、bundle都有官方提供的Executors -
支持
Generator,可以很便利地生成对应的代码
Executor和Generator都可以在nx官网找到
新建nx
npx create-nx-workspace --preset=apps
迁移到nx
npx add-nx-to-monorepo
升级nx
nx migrate latest
nx migrate --run-migrations
体验
可以使用教程体验使用nx开发全栈
formater
安装格式化依赖
pnpm add -D -w prettier
格式化配置
.prettierignore
*.json
*.yaml
格式化命令
nx format:write
linter
安装linter依赖
pnpm add -D -w @nrwl/linter
配置linter
project.json
{
"targets": {
"lint": {
"executor": "@nrwl/linter:eslint",
"options": {
"lintFilePatterns": ["./packages/packageName/src/**/*.*"]
}
}
}
}
.eslintrc.js
linter命令
nx lint project
定制rule
nx g @nrwl/linter:workspace-rule my-custom-rule
unit test
安装依赖
pnpm add -D -w @nrwl/jest
初始化
nx g @nrwl/jest:jest-project --project=<project-name>
执行
nx test projectName
e2e test
安装依赖
pnpm add -w -D cypress @nrwl/cypress
配置
nx g @nrwl/cypress:cypress-project your-app-name-e2e --project=your-app-name
执行
nx e2e projectName --skipServe true --headed true
builder
@nrwl/web