更新Dojo提供

时间:2013-10-21 20:35:14

标签: dojo amd

我正在使用Dojo 1.9作为项目,但我不理解AMD风格中dojo.provide的正确替代方案与传统风格相比。我正在阅读this文档页面。

所以,这就是旧语法映射到新语法的方式:

OLD

dojo.provide("acme.Dialog");
dojo.require("dijit._Widget");
dojo.require("dojo.date");
CODE HERE

define(["dijit/_Widget", "dojo/date"], function(_Widget, date){   ....
     CODE HERE
     return MyWidget;
});

我不确定我作为MyWidget返回的是什么。我的代码看起来像这样:

define(["dojo/foo/x","dojo/foo/y"], function(x, y){
    dojo.provide("my.module");     
});

我应该在这里回来什么?

2 个答案:

答案 0 :(得分:2)

这是一个非常好的教程,“现代道场”:

http://dojotoolkit.org/documentation/tutorials/1.7/modern_dojo/

好的报价:

  

如果您发现自己输入了dojo。*或dijit。*或dojox。*,那么   是不对的。

AMD变更的基本原理:

  

“现代”道场的核心概念之一就是全球化的事物   名称空间不好。这有很多原因,但在一个   复杂的Web应用程序,全局命名空间很容易成为   被各种代码污染,特别是当很多时候   组织使用多个JavaScript框架。我甚至都不提   从安全角度看可能发生的邪恶事件   人们故意修改全局命名空间。这意味着   “现代”道场,如果你即将访问全球的东西   命名空间STOP,因为你做错了什么。

     

...

     

另一个核心概念是同步操作很慢   异步的通常更快。 “遗产”道场已经有了   异步JavaScript代码中相当强大的谱系   dojo.Deferred的概念,但在“现代”Dojo中,最好考虑一下   一切都是异步操作。

     

...

     

为了加强Dojo的模块化并利用上述概念,   在1.7中,Dojo采用了名为Asynchronous的CommonJS模块定义   模块定义(AMD)。这意味着对Dojo的基本重写   模块加载器,通常通过require()和   define()函数。您可以在中找到装载机的完整文档   参考指南..这有助于改变代码的方式   结构

答案 1 :(得分:1)

AMD中没有等同于dojo.provide的内容。此调用仅用于通知系统的某些部分您打算在文件中的全局范围内的给定位置创建对象。现在我们使用基于文件名的AMD模块ID来做到这一点。

从AMD模块的工厂功能中,您可以返回任何内容,或者您​​可以不返回任何内容。如果你返回一些东西,它就变成了模块的价值。所以,在遗产中:

不定义任何内容的模块:

dojo.provide("app.nothing");
// some code

会变成:

// in app/nothing.js
define([], function () {
    // some code
});

定义对象的模块:

dojo.provide("app.myModule");
app.myModule = { foo: "foo" };

会变成:

// in app/myModule.js
define([], function () {
    return { foo: "foo" };
});

使用declare定义构造函数的模块:

dojo.provide("app.MyClass");
dojo.require("dijit._WidgetBase");
dojo.declare("app.MyClass", dijit._WidgetBase, {});

会变成:

// in app/MyClass.js
define([ "dojo/_base/declare", "dijit/_WidgetBase" ], function (declare, _WidgetBase) {
    return declare(_WidgetBase, {});
});