2

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

很明显,这就是旧语法映射到新语法的方式:

老的

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");     
});

我应该回到这里做什么?

4

2 回答 2

2

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

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

好的报价:

如果您发现自己正在输入 dojo.* 或 dijit.* 或 dojox.*,则说明有问题。

更改 AMD 的基本原理:

“现代”Dojo 的核心概念之一是全局命名空间中的东西是坏的。这有很多原因,但在复杂的 Web 应用程序中,全局命名空间很容易被各种代码污染,尤其是当许多组织使用多个 JavaScript 框架时。我什至不会提及从安全角度来看可能发生的恶意事情,即人们故意修改全局命名空间。这意味着在“现代”Dojo 中,如果您因为做错某事而要访问全局命名空间 STOP 中的某些内容。

...

另一个核心概念是同步操作很慢,而异步操作通常更快。“传统”Dojo 在异步 JavaScript 代码中已经有了相当强大的血统,带有 dojo.Deferred 的概念,但在“现代”Dojo 中,最好将所有操作都考虑为异步操作。

...

为了加强 Dojo 的模块化并利用上述概念,Dojo 在 1.7 中采用了称为异步模块定义 (AMD) 的 CommonJS 模块定义。这意味着对通常通过 require() 和 define() 函数公开的 Dojo 模块加载器进行基本的重写。您可以在参考指南中找到加载程序的完整文档。这从根本上改变了代码的结构方式。

于 2013-10-21T20:40:26.267 回答
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, {});
});
于 2013-10-22T03:05:52.800 回答