Dojo:覆盖预加载模块

Posted

技术标签:

【中文标题】Dojo:覆盖预加载模块【英文标题】:Dojo: Override Pre-Loaded Module 【发布时间】:2013-11-02 01:29:21 【问题描述】:

我正在使用一个预先构建的客户端应用程序,全部使用 Dojo 1.8(AMD 风格)编写,我需要对其进行扩展。

我可以访问源代码,但希望尽可能保持不变,而是支持覆盖(这就是应用程序插件框架的工作方式,其他任何东西都是黑客行为)。

我的脚本仅在基本应用程序脚本之后加载。例如,我不能修改 djConfig,也不能在加载基本应用程序模块之前发生任何其他事情。

这是我的问题:我想扩展一个基础应用程序类(使用声明创建)并在全局范围内应用我的覆盖——即使在已经需要包含此类的模块的预加载模块上(但尚未实例化)它)。

到目前为止,我发现的最佳解决方案是使用 require() 为包含该类的模块设置别名。但这仅适用于在我注册别名后需要该类的模块。

【问题讨论】:

最好的方法是覆盖你想要编辑的模块的原型。您可以直接使用原型或使用 dojo.extend 来执行此操作。另请查找“道场猴子修补” 【参考方案1】:

Dojo AMD Loader documentation 声明:

一旦一个模块值被输入到模块命名空间中,它就是 每次需要时都不会重新计算。在实践层面上,这 表示 factory 只调用一次,返回值为 在使用给定模块的所有代码之间缓存和共享。 (注: dojo loader 包含非标准函数 require.undef,它 取消定义模块值。)

这意味着如果您修改模块的原型,更改将传播到整个应用程序,甚至传播到更改之前创建的实例,因为这就是 javascript 的工作原理。

要修改通过dojo/_base/declare 创建的类的原型,在构造函数上定义了一个extend() 方法:

require(['App'], function(App) 
    App.extend(
        run: function() 
            // override `run` method here         
        
    );
);

查看实际操作:http://jsfiddle.net/phusick/HxkFs/

【讨论】:

这正是我想要的。非常感谢!

以上是关于Dojo:覆盖预加载模块的主要内容,如果未能解决你的问题,请参考以下文章

Redux预加载状态会覆盖我的应用程序状态

翻译Angular Router-模块预加载

图片预加载

jquery 图片预加载

如何使用 Vue CLI 4.3 默认禁用链接(异步模块)预取/预加载?

NuxtJS 中的预加载页面