2020 年初,一场新的全球大流行疫情的爆发,可能永久的改变了我们的生活。起初,我们以为它会像非典那样,仅仅是时代的一朵浪花,转瞬即逝;但随着病毒不断变异,越来越强的传染性给人类社会的未来蒙上了一层阴影,也将 08 年次贷危机隐隐揭露的让人恐慌的可能狠狠的拍在了所有人的脸上。
基于Monorepo实现Web应用
Vue新版本前瞻(1)
2020 年 4 月 16 日,前端业内最知名的框架之一——vue——发布了大版本 3.0 的第一个 beta 版本,增加了许多新特性、新功能,并进一步对性能进行了优化,让我们来看看都有哪些激动人心的变化
React组件设计模式(2)
Monorepo and CI
About
Monorepo
Monorepo 是一种项目的组织方式,许多开源项目均采用这种组织方式,如create-react-app
、react-router
、babel
,基本的项目结构如下
1 | ├── packages |
Lerna
Lerna是一个 JavaScript 下用于管理 Monorepo 项目的工具。它通过配置文件以及 cli 命令的方式使用,优化了使用 git 和 npm 管理多包存储库的工作流。
Github Action
GithubAction 是 github 内置的一种 CI/CD 工具,它不需要项目安装 TravisCI、CircleCI 等 CI 工具即可使用 CI 功能。最重要的是:它对于不论是 private 还是 public 项目都是免费的。
GithubAction 有一个非常强大的功能——官方市场,在上面你可以搜索到其他开发者提交的 action,并在自己的 ci 脚本中使用。
Setup
创建基本项目结构
1 | mkdir my-project && cd my-project |
初始化并配置 lerna
1 | npx lerna init # 根目录生成 lerna.json 配置文件 |
修改 lerna.json 内容至如下
1 | { |
修改根 package.json
1 | { |
为子项目间依赖生成 Symlink
像react-router
这样的项目,它的多个子项目分别以react-router
、react-router-dom
、react-router-config
等名称单独发布到了 npm。而在子项目的实现代码中,难免出现互相依赖的,例如:
1 | // react-router/packages/react-router-config/modules/renderRoutes.js |
此时需要将子项目间的依赖关系添加到所在项目package.json
的dependencies
或devDependencies
中,使得 lerna 在创建symlink
时候可以将本地项目与node_modules
下的依赖关联起来,否则会导致执行 build、test 等操作时报错。
lerna 在创建 symlink 时是通过npm
/yarn
提供的lin
功能实现的。这样,在本地开发时,任何子项目内的改动都会同步到设置了对应 symlink 的其他子项目 node_modules 下
使 lerna 生效
执行以下命令即可使 lerna 的基本功能正常工作:
1 | npx lerna bootstrap # 为各个子项目安装依赖,并根据package.json中的依赖配置创建symlink |
通过 lerna 批量操作
若要对所有子项目进行打包,可以通过lerna run < script >
执行各个子项目 package.json 下的 script 命令,如 build、test。
若要清除所有子项目的node_modules
,可以执行lerna clean
命令。
创建 CI
Github Action 的 CI 采用YAML
格式的文件进行配置,并将配置文件存放在./.github/workflows
下。最基本的 ci 配置文件如下:
1 | name: CI |
将配置文件修改为通过 lerna 执行 build、test,以验证项目的可用性:
1 | name: CI |
功能完善
待续…
项目参考
Tan90Qian/leetcode:这是笔者看书时候顺手练习创建的项目,里面包含了 Monorepo、Lerna、Typescript、基于 rollup 的打包、基于 Jest 的单元测试、CI 等要素。