本节摘要:NocoBase 的架构是一条铁律加一层协议:内核只保留运行时与插件管理,其余一切皆插件;插件之间靠声明式的资源、组件与钩子协议握手。本节把这条骨架拆开讲透——它是你判断「需求能不能落」的最终坐标系。
第 1 章立过靶子:「一切皆插件」。当时是句口号,这一章开始它是工程事实。要看懂这句口号为什么能成立,得先看内核到底留了什么、丢掉了什么。
打开内核的家底,留下的只有四样:应用生命周期管理(启动、加载插件、对外服务、关闭)、插件注册与依赖解析、数据表引擎(把「数据表」这个概念对象化,让插件能声明自己的表)、请求管线(认证、权限、路由的分发骨架)。除此之外——页面区块是插件、工作流引擎是插件、数据源管理是插件、连「用户与角色」本身也是插件。内核丢掉的是一切业务语义,保留的是让业务语义可以插拔的插座。
这个取舍的收益在第 5 章会兑换成运维语言:升级内核不动业务插件,业务插件的启停不伤内核。而它当下的收益是认知上的:你遇到任何「这功能怎么关掉」「这行为为什么这样」的问题,第一步都是问「它是哪个插件管的」——问题瞬间有了归属。

插件与内核之间没有魔法,只有四类声明。第一类是资源声明:插件可以声明自己拥有哪些数据表、哪些接口资源,内核的请求管线据此路由。第二类是组件注册:客户端侧的新区块、新字段组件在初始化时向注册中心报名字,界面配置面板因此多出选项。第三类是钩子监听:插件可以在数据写入、用户登录等事件上挂回调,3.1 的触发器机制在更底层就靠这班车。第四类是迁移脚本:插件声明自己的表结构如何随版本演进,启停与升级时由内核调度执行。
四类声明的配置形态高度一致——每个插件有一份描述自身能力的清单,内核启动时读取、汇总、校验依赖。理解了这一点,你看任何插件源码都有了入口:先找清单,再看它声明了什么,最后才读实现。
微内核加模块化给现场的直接红利有三条。故障隔离:一个插件崩了,卸载或停用即可恢复,不伤及整机。认知分组:每个插件自带说明书(清单加文档),理解成本被封装在插件内部。并行演进:官方迭代内核与插件、你维护你的业务插件,两条线互不踩脚。
代价同样要记在账上。插件间通信只能走公开协议,想「抄近道」直接调另一个插件内部函数,短期省事、升级即断——这是二次开发最常见的翻车点。插件越多,启动时的注册与校验成本越高,第 5 章讲性能时会给出量化建议。还有一条隐性成本:声明式协议意味着你「能做的」受协议约束,超出协议的需求要走扩展点或提建议——自由是有边界的自由。
⚠️ 常见坑:把业务逻辑直接写进内核目录改源码。当时是快,第一次升级就把你的改动连根拔掉。铁律:业务代码只住在自己的插件里,内核与官方插件目录一行不改。
💡 关键直觉:微内核架构的本质是「把变化关进小盒子」。判断一个平台扩展性的真办法,就是看它逼不逼你改内核——NocoBase 的答案几乎总是不必。
每个插件随包携带一份自我声明的清单,内核靠它认识这个插件。看一份典型清单,四类声明的位置一目了然:
插件清单示例(示意结构,字段以当版为准): 名称: workdays-calc 显示名: 工作日计算 版本: 0.1.0 描述: 按起止日期计算工作日天数,供工作流调用 依赖: workflow(声明依赖工作流插件,启用顺序由内核保证) 服务端入口: dist/server/index.js 客户端入口: dist/client/index.js 迁移脚本: migrations/(本插件无自建表,目录为空)
清单之外,插件被启用时内核的加载序列也值得走读一遍:读清单、校验依赖、加载服务端入口、执行未执行的迁移脚本、注册资源与组件、通知客户端加载对应入口。排查「插件装了没反应」时,按这条序列逐段找证据——序列哪一步断,问题就在哪一段。
启用失败的排障顺序: 1. 清单读不到 → 包结构或描述文件损坏,重打包 2. 依赖校验失败 → 先启用其依赖的插件(如 workflow) 3. 服务端加载报错 → 看容器日志的堆栈,多为接口名不匹配 4. 迁移脚本报错 → 检查数据库账号权限与残留表 5. 前端组件缺失 → 客户端构建产物未更新,重新构建
微内核给运维的最大承诺是「升级互不牵连」,兑现的机制值得说透。插件通过声明式清单与内核对话,清单里的接口是受版本管理的公开协议;内核升级时保持协议向后兼容,老插件照常加载。反过来,插件要求内核新能力时,在清单里声明版本下限,内核过旧会得到明确提示而不是静默故障。这套双向版本协商,就是 4.2 里「核对兼容区间」那颗螺丝的底层原理。
理解了协议层,也能解释为什么「抄近道」必死:直调另一个插件的内部函数,等于绕开协议签私约——对方内部重构,私约即刻作废。生态的稳定性恰恰来自每个参与者都只走公开协议,这不是道德要求,是工程自保。
协议意识三则(贴在开发机旁边): 1. 只依赖清单里声明的公开接口,不 import 别人的内部模块 2. 需要别人的数据,请对方暴露接口或走事件钩子 3. 内核协议的破坏性变更会写在升级公告里,升级前必读
学完骨架,把前三章的所见所闻重新过一遍,会有新的观感。第 2 章拖的每个区块,是某个界面类插件注册的组件;第 3 章画的每条流程,跑在逻辑类插件的引擎里,你配的触发器只是引擎注册的一类扳机;第 3 章的数据表界面,是数据类插件提供的管理面板。所谓「使用平台」,实际是在几十个插件的组合成果上操作——这个视角让你对「这功能哪来的、坏了找谁」永远有答案。
也是这个视角,解释了平台的演进方式:新版本带来的新能力,几乎都以新插件或插件升级的形态到达,而不是内核改头换面。你在 5.4 做的升级核对,核对的就是「这批插件与我的自研件是否兼容」——架构认知与运维动作在这里接上了头。