同步知乎: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 ,直到插件认为形状正确为止(插件需要做太多的判断工作,光判断逻辑就会非常复杂且不可靠)。
针对这样的场景是否有最佳实践可以参考?
综上所述,我认为你的问题是,选择了不合适的模式去处理你的场景,所以卡住了。