插件化架构探索

276 阅读5分钟

前言

Vscode、Chrome、Webpack、babel、Ebuild...等等这些前端耳熟能详的项目,都具备插件化的能力。本文将简单探索插件化架构究竟是什么,它能被各大知名项目所青睐的原因又是什么。本文章节:

  1. 插件化架构介绍
  2. 插件化和组件化的区别
  3. 插件化带了什么好处
  4. 什么场景可以使用插件化

1. 插件化架构介绍

\qquad插件化架构又称微核架构,指的是软件的内核相对较小,主要功能和业务逻辑都通过插件实现。插件化架构一般有两个核心的概念:内核和插件

  • 内核:通常只包含系统运行的最小功能;比如webpack、浏览器等,即使没有插件,其基础功能也是可以正常运行。

  • 插件:则是互相独立的模块,一般会提供单一的功能,插件更像是功能的补充或者扩展。插件开发:内核一般会将要完成的所有业务进行抽象,抽象出最小粒度的基础接口,供插件方来调用。 \qquad比方说,webpack打包是一种事件流的机制,它的原理是将各个插件串联起来。webpack在运行的生命周期中会广播出许多事件,Plugin 可以监听这些事件,在特定的阶段钩入想要添加的自定义功能。那么实现这一切的核心就是tapable,tapable它可以暴露出挂载plugin的方法。可以让我们能将plugin控制在webpack事件流上运行。
    tapable给我们暴露了很多钩子类,能为我们的插件提供挂载的钩子。


class HelloWorldPlugin {
  apply(compiler) {
    compiler.hooks.done.tap(
      'Hello World Plugin',
      (
        stats /* 绑定 done 钩子后,stats 会作为参数传入。 */
      ) => {
        console.log('Hello World!');
      }
    );
  }
}
 
module.exports = HelloWorldPlugin;

设计一个完善的插件化架构的系统,包含三要素:

  1. plugCore:插件内核,组织和管理插件的装载、组合、实例化以及销毁,并提供整套完整的生命周期管理和操作接口等。(webpack);

  2. pluginAPI:插件运行时需要的基础接口(webpack 的 compiler对象);

  3. plugin:一系列特定功能的独立模块(webpack 的各种插件)。

erDiagram
PlugCore ||--o{ Plugin : PluginApi 

对于插件化应用的开发,关键是要识别出应用中的通用点和扩展点。基于这个原则,对于开发插件式应用的方法和步骤主要分以下三点:

  1、分析并提取出框架中的通用点

  2、分析并提取出框架中的扩展点

  3、在应用的扩展点处根据系统配置信息动态加载实际需要的程序集(应用插件),动态创建实例对象并调用其服务。

2. 插件化和组件化的区别

插件化和组件化同样都是为了降低系统的复杂度和耦合性,但是通常会有人把组件化和插件化弄混;

  • 组件化:代码重用,功能相对单一或者独立,无统一接口。组件化开发的成果是基础库和公共组件。
  • 插件化:一般存在一个“插拔”过程,所以要求可插拔的插件有一个相同的接口。

\qquad插件和组件都是软件的复用模式,感觉插件和组件区别是复用的维度不一样。组件的复用颗粒度更细,它是技术级复用单元,须要通过进一步加工和组合才能成为解决某一类业务问题的完整部分,而插件是一个更加完整能够解决某一类业务问题的子系统,是业务级别的复用单元。

3. 插件化带了什么好处

\qquad 基于插件的设计好处很多,把扩展功能从原系统中剥离出来,降低了系统的复杂度,让框架更容易实现。扩展功能与系统以一种很松的方式耦合,两者在保持接口不变的情况下,可以独立变化和发布。公开插件接口,让第三方有机会扩展应用程序的功能,大家共同建设你的系统。

\qquad 另外,还可以让开源与闭源共存于一套软件,你的插件是开源还是闭源,完全由你自己决定。基于插件设计并不神秘,相反它比起一团泥的设计更简单,更容易理解。各种基于插件设计的架构都有自己的特色,但从总体架构上看,其模型都大同小异。

4. 什么场景可以使用插件化

第一种:富pluginAPI场景:代码在多种场景中运行,需要抹平场景中差异;

第二种:富plugin场景,插件系统,可预期需求会越来越多,适合通过更多的插件来简化系统的代码量(webpack);

第三种:富pluginCore和pluginAPI场景,插件系统本身非常复杂,需要对开发人员要求极高,这时候,将复杂的工作放到内核和中pluginApi实现,剩下大部分的简单的编码工作留给插件方实现,插件方借助pluginApi也可以快速完成业务开发(Vue CLI)发展方向;

通过建立一个插件标准,将研发流程沉淀的能力进行插件化编程,整个公司通过使用一套的插件系统(中台),这样意味着,我们不用重复造业务轮子,团队和企业可以持续积累自己的插件生态,让软件开可以像汽车等工业制造一样,打造一条标准化装配的流水线。