包管理方案一:

使用 Lernapnpm workspaces,以Monorepo的方式进行管理

Monorepo

Monorepo 就是将应用中的所有模块全放在一个项目中,它倡导集中管理,愿意是我们个个包之间会进行相互依赖,优点是

  • 不需要单独的发包、测试
  • 所有项目在一个仓库中集中管理,一起发布

缺点是:

  • 仓库体积会很大
  • 需要使用维护 monorepo 的工具,例如 Lernapnpm workspaces
  • 需要处理各个包之间的依赖问题
Link to original

简单来说就是一个项目中存在多个包,每个包都是互相独立,可以单独发布、互相依赖,例如我们的组件库最终可能长这个样子

import Button from '@5e/Button';
import Modal from '@5e/Modal';

每个包都有自己的版本,可以单独使用,针对与每个包的编译开发,可以使用webpack、rollup、tsdx、vite等。
这样的做法淡化了组件库的概念,因为我们的包不仅可以是Ui组件库,没可以是业务组件库,例如我们可以将部分业务模块抽离成npm包

import SystemConfig from '@5e/SystemConfig';
// 用来进行系统配置的弹窗组件

这样可以确保包的统一性。
缺点也很明显,涉及到多个包之间的依赖以及版本发布问题,如果A包依赖B包,如果开发A包功能的时候,可能也要同时开发B包,那么就需要在开发时启动两个包的开发环境,如果是三个包都要修改,就要启动三个包的开发环境,比较麻烦
另外,如果开发完毕,需要发布的时候,包与包之间的版本依赖也需要注意处理,会有一定的“心智负担”

包管理方案二
一个项目就是一个单独的包,主要针对我们UI组件库来说,类似antd的那种,也是目前开源社区比较流行的方案,好处是开发调试方便,不存在版本依赖管理,缺点是每次修改一个地方,就要发布整个包

Lerna 与 pnpm

如果要使用 Monorepo 的方式管理组件库的话,更推荐使用 pnpm workspace 而不是 lerna, umi 目前使用的就是 pnpm workspace 方案

私有库方案

Verdaccio 私有Npm服务

推荐使用 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 的方案

组件库实时编辑

https://wx.zsxq.com/mweb/views/topicdetail/topicdetail.html?topic_id=415841424544558&inviter_id=458154422288&keyword=063vRjiyz