egg自定义插件挂载的属性会导致冲突吗
发布于 4 年前 作者 GeniusBrother 3898 次浏览 来自 问答

egg自定义插件会将一些属性挂载到app或者ctx上,插件多起来之后这样不会导致冲突吗?比如2个插件都挂载相同名字的属性到app上。这样的设计符合规范吗

7 回复

@atian25 大佬能解答下吗

1.会 2.如果插件是用addSingleton挂载到app上会有assert,但如果是手动this.app.xxx这样的方式那就无能为力了,不过在使用插件之前应该要看一下对应的api,确保没有冲突再引用

  1. 会。第三方插件目前没有合适的机制来规范变量的分配与命名
  2. 对于一个插件而言,不仅仅是可能设置app的属性,插件包含了 Service、中间件、配置、框架扩展等等。 其中框架扩展又包含了application、context、request、response、helper,等等,而设置app的属性仅仅是对application的扩展。 插件的每一个可扩展点都面临着变量命名可能存在冲突的问题。如果每引入一个第三方插件都要通过阅读源码来排查是否存在变量命名冲突,不是一个优雅的工程化实践。
  3. 这也是为什么CabloyJS在EggJS基础之上实现了基于模块的开发策略,以及实现模块之间变量隔离的原因之一

@DerekYeung 是的目前我也准备这么做了 引入之前先看看挂载的属性

插件是你自行引入的,当然要看有没有冲突啦。

框架层面不会去约束这个,因为插件的一个职责是实现『差异化』,即我们允许多个插件的 package 的 eggPlugin.name 为同一个,从而实现插件替换对用户无感知。

@atian25 学习了 谢谢

这里其实对插件开发者是有约束的,插件的开发是需要有一定规范的。

如果只是插件里面自己使用的,不要乱挂,一般要挂在自己的命名空间上,或者用 Symbol 搞个私有属性。

回到顶部