包管理方案一:
使用 Lerna
、pnpm workspaces
,以Monorepo的方式进行管理
Monorepo
Monorepo
就是将应用中的所有模块全放在一个项目中,它倡导集中管理,愿意是我们个个包之间会进行相互依赖,优点是
- 不需要单独的发包、测试
- 所有项目在一个仓库中集中管理,一起发布
缺点是:
Link to original
- 仓库体积会很大
- 需要使用维护
monorepo
的工具,例如Lerna
、pnpm workspaces
等- 需要处理各个包之间的依赖问题
简单来说就是一个项目中存在多个包,每个包都是互相独立,可以单独发布、互相依赖,例如我们的组件库最终可能长这个样子
每个包都有自己的版本,可以单独使用,针对与每个包的编译开发,可以使用webpack、rollup、tsdx、vite等。
这样的做法淡化了组件库的概念,因为我们的包不仅可以是Ui组件库,没可以是业务组件库,例如我们可以将部分业务模块抽离成npm包
这样可以确保包的统一性。
缺点也很明显,涉及到多个包之间的依赖以及版本发布问题,如果A包依赖B包,如果开发A包功能的时候,可能也要同时开发B包,那么就需要在开发时启动两个包的开发环境,如果是三个包都要修改,就要启动三个包的开发环境,比较麻烦
另外,如果开发完毕,需要发布的时候,包与包之间的版本依赖也需要注意处理,会有一定的“心智负担”
包管理方案二
一个项目就是一个单独的包,主要针对我们UI组件库来说,类似antd的那种,也是目前开源社区比较流行的方案,好处是开发调试方便,不存在版本依赖管理,缺点是每次修改一个地方,就要发布整个包
Lerna 与 pnpm
如果要使用 Monorepo 的方式管理组件库的话,更推荐使用 pnpm workspace 而不是 lerna, umi 目前使用的就是 pnpm workspace 方案
私有库方案
推荐使用 Verdaccio,Verdaccio 是一个 npm 包管理工具,其特点是科可以托管私有模块,并且自带缓存功能,当私有仓库中找不到对应模块的时候,就会去npm公库上去下载,并缓存起来
Verdaccio 可以配置使用淘宝的 cnpm 进行加速,并用 pm2 去守护进程
推荐 Verdaccio 的原因
- 它的前身 Sinopia 是一个老牌的 npm 私有库管理工具,网上文档也比较多
- 使用的是 Node.js 开发,对前端比较友好
- 界面模仿 npm 官方的页面,用户体验比较好
样式方案
未来的Antd5版本也将使用CSS-in-Js方案了Plan about Ant Design V5 · Issue #33862 · ant-design/ant-design · GitHub
具体代码可以看这里 ant-design/index.tsx at next · ant-design/ant-design · GitHub 感觉也是类似于style-components 的方案