<\/HEAD>
<\/P>
フォーラムでの質問<\/A>が最近あり、単一の返信よりもブログ記事形式で説明したほうが良いかもしれないと思いました。レガシーDojoからモダンなDojo AMDスタイルにどう移行すればよいですか?<\/EM> それは妥当な質問であり、Dojo 1.7がリリースされたときに私も苦労したものです。変更点の概要を知るにはドキュメントのMigrating to 3.0<\/A>を参照してください。<\/P><\/P>
今では、dojo.declareがdojo\/_base\declareというモジュールになったことは多くの人が知っていますが、AMDの使い方に混乱が生じることがあります。<\/P>
<\/P>
AMDを理解すること自体がハードルの一つだと思います。最初はrequireを使うべきかdefineを使うべきか、モジュールの扱い方がわからず頭を悩ませました。最初はrequirejsで苦労し、メンターもいなかったのでドキュメントやGoogleグループの投稿を読み漁って理解しました。そのためDojo 1.7でAMDローダーが導入されたときには準備ができていました。<\/P>
<\/P>
最も単純な形に分解して、
ArcGIS Developersサイトのほとんどの例で見られるものを見てみましょう。<\/P>
require(["esri\/map", "dojo\/domReady!"], function(Map) {
var map = new Map("map", {
center: [-118, 34.5],
zoom: 8,
basemap: "topo"
});
});<\/PRE><\/P>ここに恐れられているrequireメソッドがあります。C++やJavaなど似た言語で作業したことがあればmain()関数に馴染みがあるかもしれません。これはアプリケーション起動時に実行される関数であり、パーティーが始まる場所です。requireメソッドはAMDのmain関数です<\/STRONG>。CDN経由でダウンロードされるArcGIS API for JavaScriptモジュール内のどこかに、esriというフォルダー内にmap.jsというJavaScriptファイルがあります。それは次のようなものです。<\/P><\/P>define(['dependency1', 'dependency2'], function(dependency1, dependency2) {
var Map;
\/*magic unicorn stuff*\/
return Map;
});<\/PRE><\/P>requireメソッドはそのファイルを探して非同期的にアプリケーションに読み込みます。読み込みが完了するとアプリケーション内の関数が呼ばれ、Mapとは何かを定義する内容(非常に存在論的)が関数から返されます。このモジュールには独自の依存関係があり、それらは関数内で要求された順序で読み込まれます。これは重要です。順序が重要です。これらの依存関係は関数やオブジェクト、あるいは文字列かもしれません。以下は私の本からの図で参考になるでしょう。<\/P><\/P>
<\/P><\/P>私の本ではrun.jsというファイルを使ってrequireメソッドでdojoConfigdojoConfigを定義し、main.jsというファイルで実際に処理を開始します。それは私のスタイルですが決定的なスタイルではありません。<\/P><\/P>main.jsの使用方法で混乱する人もいますし、正直私も最初はそうでした。良い参考資料としてDojoのAdvanced Modulesチュートリアルがあります。「Configuring the Loader」の重要部分を引用します。<\/P>main(オプション、デフォルト = main.js) 😞: パッケージ自体をrequireしようとした場合に正しいモジュールを発見するために使用されます。例えば「dojo」をrequireしようとすると実際に読み込まれるファイルは「/js/dojo/main.js」です。「my」パッケージ用にこのプロパティを上書きしているので、「my」をrequireすると実際には「/js/my/app.js」が読み込まれます。「util」という定義されていないパッケージをrequireしようとするとローダーは「/js/util.js」を読み込もうとします。ローダー設定では必ずすべてのパッケージを定義してください。<\/BLOCKQUOTE>以下は私のdojoConfig(requireエントリーポイント)のサンプルです。<\/P>var pathRX = new RegExp(\/5c\/5b^\/5c\/5d+$\/)
, locationPath = location.pathname.replace(pathRX, '');
require({
packages: [{
name: 'widgets',
location: locationPath + 'js/widgets'
}, {
name: 'utils',
location: locationPath + 'js/utils'
}, {
name: 'app',
location: locationPath + 'js'
}]
}, ['app']);<\/PRE><\/P>requireメソッドでは最初のパラメータがdojoConfigオブジェクト、2番目が['app']依存関係であり、これがエントリーポイントです。上記ドキュメントによれば単に'app'を要求するとデフォルトで'app/main.js'を探します。<\/P><\/P>もしまだ混乱しているなら、グローバルなdojoConfigオブジェクトを定義してパッケージ設定し、従来通り単純なrequireでアプリケーションを開始することもできます。このような感じです。<\/P><body class=\"nihilo\">
<script>
var pathRX = new RegExp(\/5c\/5b^\/5c\/5d+$\/)
, locationPath = location.pathname.replace(pathRX, '');
var dojoConfig = {
async: true,
isDebug: true,
packages: [
{ name: 'xstyle', location: locationPath + '\/bower_components\/xstyle' },
{ name: 'mayhem', location: locationPath + '\/bower_components\/mayhem\/dist' },
{ name: 'app', location: locationPath + 'js' }
],
tlmSiblingOfDojo: false
};
</script>
<script>require(['app/start'], function() {})</script>
</body><\/PRE><\/P>これで少しはクリアになることを願います。<\/P>
この多くはDojoドキュメントや特にCDN Modulesチュートリアルから学べます。このページではレガシーからモダンDojoへの詳細な説明があります。また移行ガイドもあります。さらにレガシーDojoからAMDへのコンバーターも試せます。私は使ったことはありませんが良い出発点になるでしょう。ただしすべてのEsriモジュールで100%動作するとは限りませんが試す価値はあります。
I hope that helps out a bit if you are still struggling with migrating Legacy Dojo applications to modern Dojo. It may take some time to let it all sink in, but it will. For more geodev tips and tricks, check out my blog.