2

dojo.provideプロジェクトに Dojo 1.9 を使用していますが、従来のスタイルと比較して、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

これは非常に優れたチュートリアル「Modern Dojo」です。

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

良い引用:

dojo.*、dijit.*、または dojox.* と入力している場合は、何かが正しくありません。

AMD への変更の基本的な根拠:

「モダンな」Dojo の核となる概念の 1 つは、グローバル名前空間にあるものは良くないということです。これには多くの理由がありますが、複雑な Web アプリケーションでは、特に多くの組織が複数の JavaScript フレームワークを使用している場合、グローバル名前空間があらゆる種類のコードで簡単に汚染される可能性があります。グローバル名前空間を意図的に変更することで、セキュリティの観点から起こりうる悪質なことについては言及しません。これは、「最新の」Dojo で、グローバル名前空間内の何かにアクセスしようとしている場合、何か間違ったことをしているために停止することを意味します。

...

もう 1 つの重要な概念は、同期操作は低速で、非同期操作は通常高速であるということです。「レガシー」Dojo は、すでに dojo.Deferred の概念を持つ非同期 JavaScript コードでかなり強力な血統を持っていましたが、「最新」Dojo では、すべてが非同期で動作していると考えるのが最善です。

...

Dojo のモジュール性を強化し、上記の概念を活用するために、Dojo 1.7 では Asynchronous Module Definition (AMD) と呼ばれる CommonJS モジュール定義を採用しました。これは、通常は require() および define() 関数を通じて公開される Dojo モジュール・ローダーの根本的な書き直しを意味します。ローダーの完全なドキュメントは、リファレンス ガイドにあります。これにより、コードの構造が根本的に変わりました。

于 2013-10-21T20:40:26.267 に答える
1

dojo.provideAMD に相当するものはありません。この呼び出しは、ファイル内からグローバル スコープ内の特定の場所にオブジェクトを作成するつもりであることをシステムの一部に通知するためにのみ必要でした。そのために、ファイル名に基づく 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 に答える