前端项目重构的深度思考和复盘( 五 )

  • 产品需求层优化
  • 产品需求层面导致的重构主要场景比如:
    • 项目国际化支持
    • 项目埋点
    • 整体项目UI升级
    当然还有很到场景这里不一一介绍了. 以上列的场景都是比较常见的, 而且也有很多解决方案, 后期我会一一复盘. 我们在项目重构之前或者立项之前, 这几种情况也是需要重点考虑的, 毕竟都是大工作量的任务.
    2. 技术升级带来的重构技术升级带来的重构主要有前端框架的升级, 前端设计模式的升级, 脚手架的升级. 后面两个主要是围绕前端技术的不断演进, 我们采取的程序性升级, 比如从传统的 gulp 升级到 webpack, 或者从 webpack 升级到vite 等. 前者比较常见的场景是企业中有很多老的系统, 采用的是比较传统的技术方案如 CMD 模式 + jquery, 但是新项目采用的是 webpack + vue 或者 react, 此时我们需要更新项目情况来有选择的做重构:
    老项目只需要少量维护的情况这种情况我们就不需要大刀阔斧的重新用新框架再写一套了, 我们只需要在重构时, 对老项目代码做好足够的注释, 类库的封装即可:
    前端项目重构的深度思考和复盘

    文章插图
    图片
    其次我们需要做好js变量隔离, 因为传统模式我们会在 window 顶层定义大量 var 全局变量, 作为优化的一部分, 我们可以采用闭包自执行和变量约定来规范我的js变量定义,  以防止全局的变量污染.
    老项目仍然需要不断迭代, 并且后期会有新的模块这种情况我们需要做评估和拆分, 如果是小模块, 我们可以用 jquery插件 的方式快速爹迭代, 如果是页面级别的迭代, 并且交互比较复杂, 我们可以将老系统的新页面拆离一个子工程, 采用最新的框架(如vue)来开发迭代, 再通过 MPA 的方式和老系统做集成:
    前端项目重构的深度思考和复盘

    文章插图
    图片
    老项目和新项目需要相互通信, 嵌套这种场景下最好的方式就是用iframe + postmessage, 或者我们可以参考类似微前端的方式来管理组织不同子系统.
    3. 组件库重构
    前端项目重构的深度思考和复盘

    文章插图
    图片
    对于一个包含很多子系统的复杂的项目系统来说,要想设计一个好的架构 , 第一步就是合理划分组件,组件的粒度拆成的足够细,这样才能最大限度的复用组件 。
    对于任何一个复杂系统来说,最重要的就是实现错综复杂的业务功能,但是不同模块或者子系统之间很多业务往往是相通的或者相似的,如果这个时候我们每个页面对于实现类似的业务场景都去重复去写一遍业务代码,那完全是没必要的,对于可维护性来说也是一种打击 , 所以基于这种场景我们的 业务组件 就很有必要出场了 。我们可以把功能或者需求类似的有机体封装成一个业务组件,并对外暴露接口来实现灵活的可定制性,这样的话我们就可以再不同页面不同子系统中复用同样的逻辑和功能了 。
    同理,不同页面中往往有可能出现视觉或者交互完全相同或者类似的区块,为了提高可复用性和提高开发效率 , 我们往往会基于基础组件和业务组件再进行一次封装,让其成为一个独立的区块以便直接复用 。
    通过这样一层层封装,我们就逐渐搭建了一套完整的组件化系统,基于这种模式的开发往往也是一个好的前端架构的开始 。但要注意一点就是高层次的组件一定会依赖低层次的组件,但是低层次的组件不可以包含高层次的组件 。(听起来有点像rudex的单向数据流法则),他们的关系就好像下图:
    前端项目重构的深度思考和复盘

    文章插图
    图片
    所以对组件库的重构需要对我们的项目有一个本质的认知, 并对页面进行有效的拆分, 从而达到局部的最优, 降低后续的维护成本, 并能提高整个系统甚至跨系统的复用.
    前端项目重构的深度思考和复盘

    文章插图
    图片
    有关如何从0到1教你搭建前端团队的组件系统 我之前也写过详细的文章, 大家可以参考学习一下.
    总结系统重构是一个持续的过程, 我们不仅要有持续学习的态度, 还需要不断的实践和积累优秀的最佳实践, 这样才能在不断重构中让我们的系统不断适应复杂多变的“社会环境”.


    推荐阅读