RequireJSと、それを使用して、モジュールで使用しようとしたときに未定義として表示されない依存関係をロードする方法を理解しようと、ぐるぐる回っています。
JohnPapaのPluralsight「SPAwithHTML5」コースから始めました。私が理解していなかったのは、requireJSでAMDの全体的なポイントは、非同期でロードするためにライブラリとそのデータメイン属性に責任を引き渡すことだと思ったときに、バンドルに含まれるスクリプトタグですべてのライブラリを指定する必要がある理由でした何が必要だったか。そのコースで提示されたソリューションについて二重に混乱したのは、データ全体に従わなかったということでした。主な設定は、RequireJSのドキュメントに記載されています。
数か月先に進むと、Durandalを含む「HotTowel」テンプレート、サンプルの「サービス」モジュール、RequireJSドキュメントに従ったセットアップ、およびかなり理解しやすいスターターアプリができました。警鐘を鳴らす唯一のことは、ほとんどのライブラリが通常の「scripts」フォルダにあり、Durandalがアプリケーションロジックとともに完全に別の「app」フォルダにあるという考えです。私がpluralsightSPAコースから1つのことを学び、requireJSで遊んでいるとしたら、単一のフォルダーから物を移動することは非常にすぐに面倒になります。
とにかく、新しいテンプレートは正常に機能します。モジュールの依存関係はうまく機能しており、ViewsとViewModelsはバインドされており、Durandalモジュール(つまり、appフォルダー)にモジュールの依存関係があるサンプルのロガーモジュールがうまく機能しています。ホットタオルテンプレートにあるコードに基づいて、jQueryとmockJsonを使用する別の単純なモジュールを追加するのは簡単なはずですよね?えーと、いや、そうではない。
これは、「app/services」フォルダー内のモジュール「dataservice.js」の開始に関する非常に簡単な宣言です。
define(['jquery'],
function ($) {
var init - function....
もちろん、コードブロック内でアクセスしようとすると、$に対して「undefined」が表示されます。ですから、あまりにも多くの紛らわしい文献を読んだ後(その多くは「これはjquery xxxxで変更されたので、もう関係ありません」というコメントで終わります)私は次の質問があります:
ネットワークトラフィックを監視すると、jQueryライブラリが正しくダウンロードされていることがわかります。BundleConfig.csで定義されている「ベンダー」バンドルにmockJSONを追加すると、jQueryがそこにあり、ブラウザで待機しています。自分でモジュール定義を与えていません。モジュールのドキュメントで「未定義」の参照を取り除くには、次のようなものを追加する必要があることを意味しているようです。
require.config({ paths: { 'text': 'durandal/amd/text', jquery: '../Scripts/jquery-1.9.1' } });
(「text」宣言はすでに存在します。jqueryエイリアスを追加しました)これにより、モジュールに「undefined」ではなく関数が含まれるようになります。これにより、すでに作成したスクリプトの2番目のコピーが発生することを除いて問題の一部が解決されます。 HotTowellテンプレートの「ベンダー」バンドルのためにダウンロードされたように見えます。明らかな理由でjQueryのコピーを2つダウンロードしたくないので、これを修正するにはどうすればよいですか?
mockJSONライブラリを「ベンダー」バンドルに追加しました。これは通常、$。mockJSONを使用して参照されます。これを有効にするために何もできません。'require.config({paths:'宣言でjqueryに対して行ったのと同じプロセスを使用してスクリプトへの参照をハックしたとしても、'ライブラリが2回ダウンロードされる'問題は言うまでもなく、未定義になります。 。モジュールでそのライブラリを使用できるように、ライブラリの依存関係を定義するにはどうすればよいですか?
このすべての苦痛は、requireJSが非同期モジュールのダウンロードに関するものであるという事実と関係があると思いますが、jQueryとmockjsonは同期しているため、他の方法(ハードコードされた参照のバンドル)でダウンロードする必要がありますが、それでもrequireJSを意味しますモジュールには依存関係としてそれらを示す方法が必要であり、私が試したことは何も機能していません。これが同期/非同期の問題であるという私の仮定は正しいですか?デュランダルでjQueryと理想的にはjqueryプラグインを使用するサンプルアプリを少なくとも1つ見つけたいと思っていましたが、表示されるのは、他のものではなくデュランダルモジュールを使用するモジュールコードだけです。これらすべてのライブラリがrequireJSのメインルートの外にあるという事実は、参照を取得するために'../'文字列を含むパスに頼らなければならないため、おそらく問題を悪化させています。
requireJSがdefineコマンドで「設定より規約」を使用していることを理解しています。モジュールIDを見逃した場合、data-mainを使用して指定された定義済みルートフォルダーからのモジュールソースファイル名とパスに基づいたIDを想定します。ただし、Durandalは、コード内で「entrance」と呼ばれるモジュールを参照しています。このモジュールはルートフォルダーではなく、「Durandal / transitions / entry.js」というフォルダーにあるため、このモジュールへの参照が「Durandal / transitions/entrance」ではなく「entrance」である理由について混乱しています。どこでエイリアスされていますか?
最後に(hoorah)defineステートメントの最初の引数(文字列配列)として依存関係を指定することと、それらの依存関係を省略することの違いの微妙な違いを理解していませんが、モジュールファクトリでは、varsystemのようなものを指定する最初の引数になります= require('../ system')-なぜあるフォームを別のフォームよりも優先して使用するのでしょうか。サンプルアプリケーション全体で2つのタイプが混在しているのがわかりますが、その理由がわかりません。
PS:このエントリを編集すると、1から5までの番号が付けられた5つの質問が表示されます。表示すると、1から4としてレンダリングされます。どのフォーマットを試しても、奇妙なHTMLエディタとレンダリングのバグがあります。修正できなかったので、コメントを投稿してください。1から5までの質問が2つではなく、1から5までの質問が5つあるかのように投稿してください。