微内核架构及代码实现

963 阅读2分钟

文章摘要:

  • 一、什么是微内核架构
  • 二、微内核架构适用的场景
  • 三、简版的代码实现
  • 四、典型案例

一、什么是微内核架构

微内核是一种典型的架构模式。由core 和 plugin 组成。core

image.png

二、微内核架构适用的场景

有点就是特别轻量化,适用做生态型的项目。核心core的职责:提供一套加载机制以及核心属性。把通信处理好。在项目运行过程中的不同时刻提供一些回调埋点出去,也就是生命周期。其他功能,由社区或是个人提供。

三、简版的代码实现

core 和 plugins 之间。 core 把 插件 连接起来,进行管理

core处理好几个方面:

  1. 加载机制
  2. 顺序机制
  3. 生命周期(明确的知道这个程序什么时候会执行,一些时机下埋入的callback)
  4. 通信机制(最最重要核心的机制)(分2种:core和plugin之间、plugin之间)
// 声明容器
const plugins = []//或是别的数据结构,new Map()
// 注册插件-往数组里塞东西
const registerPlugins = (plugin)=>{return plugins.push(plugin)}//收集装载
// 调用插件程序
const applyPlugins = (...args) => plugins.forEach(plugin => plugin.apply(this,...args))
const skipPlugin= ()=>{}

// 生命周期
const start = async()=>{
    //读取配置文件-入参
    const opts = getUserOptions()
    //记载内置插件
    await loadBuiltinPlugins()
    //触发一个钩子
    opts.created && opts.created()//外边要是传入这个钩子,就执行下
    
    await loadUserPlugins()
    
    opts.initePlugins && opts.initedPlugins()
}

// 通信=》最常见:发布订阅模式
export const mitt = ()=>{
    const cache = new Map()//用来装依赖的
    
    return {
    on:()=>{},
    off:()=>{},
    emit:()=>{},
    once:()=>{},
    destory:()=>{},
    
    }

}

//const originalApply = plugin.apply
//plugin.apply = function(){
//    originalApply.apply()
//}

四、典型案例

Umi、webpack、Bable、Vue 都是属于微内核的设计思想。基本都是配置型的。内核轻量。Umi 核心是官方负责,内部集成少量插件,其他插件由社区开发提供,这样生态就慢慢建立起来了。

看Umi官方源码,可以看最初的版本1.x,流程简单,因为看最新的话,经过这些年沉淀积累,里面处理边界、异常、各种场景的代码太多了,不容易看清楚主干核心。 image.png

看下core 里带的插件没几个:dva(低瓦)、yunfengdie(云凤蝶)、dll、datahub、路由 image.png