在软件开发中,模块化和封装是非常重要的概念。组件就是封装好的可复用的程序“零部件”,可以被应用在多个地方。在前端开发中,UI组件是常见的组件形式,如按钮、输入框、下拉选择等都是组件。通过组件和组件的组合,可以构建出更复杂的组件。为了使整个项目UI更统一,降低开发成本,提高开发效率,许多前端开发者会使用已有的UI组件库。
常见的UI组件库有: ElemetUI、vuetify、Ant Design、Bootstrap、Material UI、Vant UI、Framework7、arco.design 等等。这些组件库封装了丰富的UI组件,使开发者可以直接引入并使用,无需自己编写繁琐的样式和逻辑代码。同时,这些UI组件库还提供了丰富的文档和示例,方便开发者快速上手。
除了使用现成的UI组件库,有些公司会根据自身业务需求搭建自己的业务组件库,以达到更好的UI风格统一和更高的开发效率。搭建自己的业务组件库需要考虑到组件的可复用性、易用性和可维护性等因素,同时需要提供丰富的文档和示例以方便开发者使用。


架构设计
单包架构
单包架构指的是将所有组件打包成一个整体,发布出去一个npm包的方式。这种方式优点是公共代码易于复用,便于维护和展示更聚合,引入一个包即可使用全部组件。但是缺点也很明显,修改一个组件需要更新整个库,同时需要考虑按需加载。
多包架构
多包架构指的是一个代码仓库包含多个组件代码,每个组件会单独发布出去一个npm包。这种方式的优点是可以单独发包,升级灵活,并且在同一仓库下,便于代码管理。同时使用者无需考虑按需加载。但是缺点也存在,当组件间相互依赖时,需要通过npm包引入,组合使用时需要安装每一个用到的npm包。
打包速度
对于组件库而言,实时预览非常重要,通常可以使用 Storybook 等工具进行实时预览。
样式方案
组件库的样式方案可以选择采用 Less、Sass、CSS in JS 或 CSS,这些技术方案可以满足组件库换肤、样式定制等能力的需求。
产物构建
组件库的产物构建工具可以选择 webpack、rollup、vite 或 gulp,产物格式可以选择cjs、umd、es等。
质量保障
组件库的测试工具可以选择 jest、karma、mocha、enzyme 和 react-testing-library 等,测试类型可以选择单元测试、快照测试、截屏测试和 e2e 测试等。
文档部署
组件库的文档部署可以选择使用 Storybook 或 umijs 等工具展示 Demo,同时也可以使用 markdown 静态内容进行展示。
组件API提取
组件API提取方式可以手写或使用自动提取工具如ts-docuemnt等。
版本日志生成
组件库的版本日志可以手写,也可以使用自动提取工具从 PR 提交记录自动提取。
什么是好的组件?
好的组件应该具有高内聚、低耦合的特点。这意味着一个软件模块由相关性很强的代码组成,只负责一项任务,并且尽可能使其独立存在,减少不同功能或模块之间紧密关系。高内聚和低耦合可以保证服务的独立性以及系统的灵活度。另外,好的组件应具有通用性和易拓展的特点。
组件开发-组件组织的好与坏
在组件开发中,组件的命名应该具有语义,并且避免与基础组件冲突,同一团队/仓库下的业务组件,也应采用相同的命名前缀。同时,NPM包名应尽量与组件名保持一致,包含明确的使用场景信息,并且推荐将需要对外导出的TS类型维护在单独的interface.ts中,并将其在index.ts中导出。
组件开发-组件设计的好与坏
对于组件的设计,需要注意以下几点:
- 接口定义:为组件定义接口类型时,应继承原生DOM(或基础组件)属性,避免属性遗漏或重复声明。
- 类名前缀统一:组件应使用特殊且统一的类名前缀,尽量降低与用户类名冲突的可能性。
- 避免行内样式和css modules:确保外部可通过类名进行样式覆盖。
- 避免在js中直接引入样式文件:应尽量保证逻辑与样式的分离,确保用户可以分别引入js和css文件,避免由于构建环境的不同导致的用户编译失败的问题。
- 注意组件样式的按需加载:在基于基础组件库如Arco进行业务组件的逻辑封装时,应注意按需引入所依赖的Arco基础组件的样式文件。
总结
课程主要讨论了组件库的架构设计和组件开发中的组件组织和组件设计问题。
在架构设计方面,可以选择单包架构或多包架构,打包速度、样式方案、产物构建、质量保障、文档部署、组件API提取和版本日志生成等都需要考虑到。
在组件开发中,好的组件应该具有高内聚、低耦合、通用性和易拓展的特点。组件的命名应具有语义,类名前缀应该统一避免与用户类名冲突,接口定义需要继承原生DOM(或基础组件)属性,避免属性遗漏或重复声明。同时还需要注意样式文件的引入和按需加载等问题。
总之,一个好的组件库需要考虑到各个方面的问题,并且组件开发需要按照规范进行,才能提供高效、易用、易维护的组件服务给用户。