如何在 Dojo AMD 中包含遗留模块

Posted

技术标签:

【中文标题】如何在 Dojo AMD 中包含遗留模块【英文标题】:How to include legacy module in Dojo AMD 【发布时间】:2013-09-27 15:18:52 【问题描述】:

我正在尝试将应用程序从 dojo 1.6 迁移到版本 1.9.1,并且我有一个我还不想迁移的遗留模块(它非常复杂,需要一些时间才能理解)。 Dojo 文档表明您可以将旧模块与 AMD 模块一起加载,但是当我尝试加载旧模块时,我会收到“dojo.provide is not a function”。

我的脚本:

require([..., "agsjs/dijit/TOC","dojo/domReady!"], 
            function(..., TOC) 
    on(map,'layers-add-result',function(results)
        //Add Legend
        var toc = new TOC(
            map: map,
            layerInfos:legendLayers
        , 'legendDiv');
        toc.startup();
    );
);

模块第一行代码:

dojo.provide('agsjs.dijit.TOC');

在加载程序尝试加载 agsjs/dijit/TOC 模块之前,一切正常,我收到“dojo.provide 不是函数”错误。我如何解决这个问题而不必将整个模块重构为 AMD?谢谢

【问题讨论】:

一个搜索引擎把我带到了这里,所以我会在这里留下一个对我有帮助的链接:ilinkuo.wordpress.com/2013/02/07/… 【参考方案1】:

为了加载遗留模块,你需要在遗留模式下运行加载器,这意味着你不能设置async: true。只要您使用async: false(默认)运行,您就可以从 AMD 模块加载和使用旧版模块,反之亦然。

【讨论】:

不按照教程。 “Dojo 加载程序独有的最后一个功能是能够将遗留 Dojo 模块与 AMD 样式模块混合匹配。这使得可以缓慢而有条不紊地从遗留代码库过渡到 AMD 代码库,而无需转换所有内容立即。这在加载器处于同步模式和异步模式时都有效”找到dojotoolkit.org/documentation/tutorials/1.8/modules 教程不正确。 Dojo Base(旧的dojo 对象)在异步模式下不会加载,典型的dojo.require 调用需要使用同步加载(除非您使用旧的XD 模式)。作为本教程的作者,我可以证明我写在那里的内容是错误的。当时,新加载程序的文档记录很差,也很难理解。 这是一个很好的例子,说明我为什么应该接受你的回答 ;-)。有什么方法可以帮助我在教程中更正这个问题(不是我现在理解加载器)? 教程已更新,更加准确。就贡献而言,不幸的是,教程是目前唯一没有受到良好源代码控制的文档(它位于旧的 Subversion 存储库中)。因此,没有简单的方法可以为它做出贡献。如果您有兴趣帮助文档,Dylan (dylan@dojotoolkit.org) 可以为您提供更多信息。【参考方案2】:

AMD 的一个优点是您现在不必使用“dojo”和“dijit”全局变量。如果您不想更改旧模块中的所有这些 dojo.xxx 调用,您可以尝试将旧模块包装在

define([
    "dojo/_base/declare", 
    "dojo", "dijit", 
        ...  
], function(declare, dojo, dijit) 

   return declare([/*your parent widgets*/], 

   //your old module content at here, maybe  you need make little modifications of your old module

   );

);  

所以那些 dojo.xxx 函数可能仍然有效。

此链接可能会提供您需要的一切:

http://dojotoolkit.org/reference-guide/1.9/releasenotes/migration-17.html

【讨论】:

这消除了错误,但代码实际上并没有工作。 这只是节省您将整个旧模块转换为 AMD 的时间。您仍然需要查看该文档如何使您的模块工作。例如,将 dojo.provide 替换为 declare. 查看我的修改版本

以上是关于如何在 Dojo AMD 中包含遗留模块的主要内容,如果未能解决你的问题,请参考以下文章

如何定义模块并在 AMD 的 dojo 中使用它?

如何在 post create dojo AMD 模块中调用按钮单击事件

如何从AMD dojo创建构建

dojo 1.7 AMD 框架有啥好处?

原创(AMD)JavaScript模块化开发(dojo)

如何在 rake 任务中包含模块类?