UMI3源码解析系列之插件化架构核心

6c76e2d4cbb10dd5ccf6011eb9e015f6.png

插件化架构

插件化架构(Plug-in Architecture),也被称为微内核架构(Microkernel Architecture),是一种面向功能进行拆分的可扩展性架构,在如今的许多前端主流框架中都能看到它的身影。今天我们以 umi 框架为主,来看看插件化架构的实现思路,同时对比一下不同框架中插件化实现思路的异同。

各个主流框架插件化异同

二话不说先上结论。


触发方式 插件 API 插件功能
umi 基于 tapable 的发布订阅模式 10 种核心方法,50 种扩展方法,9 个核心属性 在路由、生成文件、构建打包、HTML 操作、命令等方面提供能力
babel 基于 visitor 的访问者模式 基于@babel/types 对于 AST 的操作等
rollup 基于 hook 的回调模式 构建钩子、输出钩子、监听钩子 定制构建和打包阶段的能力
webpack 基于 tapable 的发布订阅模式 主要为 compolier 和 compilation 提供一系列的钩子 loader 不能实现的都靠它
vue-cli 基于 hook 的回调模式 生成阶段为 Generator API,运行阶段为 chainWebpack 等更改 webpack 配置为主的 api 在生成项目、项目运行和 vue ui 阶段提供能力

一个完整的插件系统应该包括三个部分:

插件内核(plugiCore):用于管理插件;

插件接口(pluginApi):用于提供 api 给插件使用;

插件(plugin):功能模块,不同的插件实现不同的功能。

因此我们也从这三部分入手去分析 umi 的插件化。

umi 插件(plugin)

我们先从最简单的开始,认识一个umi 插件长什么样。我们以插件集preset(@umijs/preset-built-in)中的一个内置插件umiInfo(packages/preset-built-in/src/plugins/features/umiInfo.ts)为例,来认识一下 umi 插件。

import { IApi } from '@umijs/types';

export default (api: IApi) => {
  // 调用扩展方法addHTMLHeadScripts在 HTML 头部添加脚本
  api.addHTMLHeadScripts(() => [
    {
      content: `//! umi version: ${process.env.UMI_VERSION}`,
    },
  ]);
  // 调用扩展方法addEntryCode在入口文件最后添加代码
  api.addEntryCode(
    () => `
    window.g_umi = {
      version: '${process.env.UMI_VERSION}',
    };
  `,
  );
};

可以看到 umi 插件导出了一个函数,函数内部为调用传参 api 上的两个方法属性,主要实现了两个功能,一个是在 html 文件头部添加脚本,另一个是在入口文件最后添加代码。其中,preset是一系列插件的合集。代码非常简单,就是 require 了一系列的plugin。插件集preset(packages/preset-built-in/src/index.ts)如下:

export default function () {
  return {
    plugins: [
      // 注册方法插件
      require.resolve('./plugins/registerMethods'),

      // 路由插件
      require.resolve('./plugins/routes'),

      // 生成文件相关插件
      require.resolve('./plugins/generateFiles/core/history'),
      ……
      // 打包配置相关插件
      require.resolve('./plugins/features/404'),
      ……
      // html操作相关插件
      require.resolve('./plugins/features/html/favicon'),
      ……
      // 命令相关插件
      require.resolve('./plugins/commands/build/build'),
      ……

}

这些plugin主要包括一个注册方法插件(packages/preset-built-in/src/plugins/registerMethods.ts),一个路由插件(packages/preset-built-in/src/plugins/routes.ts),一些生成文件相关插件(packages/preset-built-in/src/plugins/generateFiles/*),一些打包配置相关插件(packages/preset-built-in/src/plugins/features/*),一些html 操作相关插件(packages/preset-built-in/src/plugins/features/html/*)以及一些命令相关插件(packages/preset-built-in/src/plugins/commands/*)。

在注册方法插件registerMethods(packages/preset-built-in/src/plugins/registerMethods.ts)中,umi集中注册了几十个方法,这些方法就是umi文档中插件 api 的扩展方法

export default function (api: IApi) {
  // 集中注册扩展方法
  [
    'onGenerateFiles',
    'onBuildComplete',
    'onExit',
    ……
  ].forEach((name) => {
    api.registerMethod({ name });
  });

  // 单独注册writeTmpFile方法,并传参fn,方便其他扩展方法使用
  api.registerMet
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Alita是一套基于Umi的移动端框架,是面向场景的开发提效方案。通过整合业务流程、简技术开发,使得开发者能够更专注于业务能力的提升。 最刚开始只是作为一个umi的配置简的脚手架,后来经过吸收社区的需求,发现antd团队在移动端h5这一块的响应需求较少,但是,使用umi做移动端开发的朋友却很多。内置了这阶段帮社区朋友开发的一些umi插件,达到了在配置文件中设置appType:'h5'就能着手移动端页面开发的效果。 后来结合混合开发的需求,增加了cordova相关插件,达到了在配置文件中设置appType:'cordova'就能着手混合页面开发的效果。 要从头开始使用 React 构建一个完整的移动端 Web 应用程序(H5),需要考虑许多重要的细节: 必须使用打包程序(例如 webpack)打包代码,并使用 Babel 等编译器进行代码转换。 你需要针对生产环境进行优,例如代码拆分。 考虑页面在不同设备上的适配情况。 多个项目公用的全局的布局和组件。 在什么时机请求数据才是合适合理的。 alita 面向场景的设计思路,以插件、零配置的方式构建。使得你在使用时能有较好的开发体验和享受许多内置的功能。列举其中一些如下: 文件即路由,约定式的项目文件结构,自动将 pages 目录下的文件映射成路由配置。(并支持动态路由) 自动代码拆分,提升页面加载速度,在某些场景提供自动生成骨架屏的功能 内置 Less 支持,内置 antd 和 antd-mobile 组件库。 开发环境支持热更新,开发时你无需频繁的重启你的开发服务,只要你修改项目代码,alita 会自动重新渲染页面。 友好地移动端 app 开发模式,你可以在真机上预览你的开发效果,并使用 web 的日志系统来快速定位问题。 专注与某些真实的应用场景 可拔插的插件设计,你可以完全的自定义你自己的 alita   alita 更新日志: v2.8.3 修复: 1、inspx 修复部分浏览器没有DeviceMotionEvent 对象的错误。 新增: 1、兼容页面嵌套在iframe中时 viewport 不一致时页面适配正常。 2、增加子进程中断,兼容云服务商通过脚本未正确杀死子进程。 3、状态保持支持动态路由。 4、增加发布日志,发布新版本的时候,自动编写发布日志。 调整: 1、将微应用的东西独立出去,需要用到微应用需要手动安装preset。 2、去掉了pc端内置的插件,pc开发的时候,用户可以自由选择需要的插件。 重大更新: 1、支持webpack5,只需要增加配置 webpakc5:{}。二次编译只需要3秒左右。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值