如何设计顺序无关的插件架构内核?

新手上路,请多包涵

同步知乎:https://www.zhihu.com/questio...
最近在设计可插拔的软件时遇到了问题:如何做到不关心插件顺序呢?

假如现在有一个请求后端的requester,为不同的微前端提供统一但可插拔的基础设施,需提供下述功能:

支持request.body可以是个函数,以便在自动重拨的时候运行某些逻辑(如对数据签名)
支持request.body可以是个Formdata,以便传输File
支持对不同环境env做出不同的逻辑,如拼接proxyPath到url前面
支持嵌入auth逻辑,比如在后端code为501时自动清空token等
对返回结果进行包裹或处理(可能有多次)。
现在问题来了:如果内核不关心插件的顺序,那么插件将内置数据的”形状“改变了,后续插件如何正常运行?如果我让body支持了函数,那么后续需要对body对象包裹通用格式的时候是不是就找不到对应的接口了

参考了webpack的tapabble , 我思考出两点结论:

对插件暴露的接口不能改变接口自身的形状(但在requester这个例子中似乎无法做到)。
如果用了tapple的SyncLoopHook,循环执行插件,插件内判断接口形状是否正确,不正确的话插件就一直返回undefined ,直到插件认为形状正确为止(插件需要做太多的判断工作,光判断逻辑就会非常复杂且不可靠)。
针对这样的场景是否有最佳实践可以参考?

阅读 1.5k
1 个回答
  1. 每个插件应该只关心自己要做的事情,只生成自己相关的数据,只修改自己负责的字段。
  2. 插件应该不知道其它插件的存在,也不需要知道,自然不用考虑顺序。
  3. 插件由插件管理器控制,使用主体的 API 完成自己的工作。
  4. 你说的 requester 看起来是职责链模式,而不是插件模式,那就肯定跟顺序有关。

综上所述,我认为你的问题是,选择了不合适的模式去处理你的场景,所以卡住了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题