require.js によって ('define' で) ロードされる 2 つのモジュールがあります。
- ds.test.js
- ds.js
ご想像のとおり、前者は後者をテストします。ds.test.js のプリアンブルは次のとおりです。いくつかのコンソール/ログを追加しました。
define(["ds", "test", "assert"], function (ds, test, assert) {
console.log(arguments);
// the rest is a 'pure' module --
// no executable code outside of a returned object/map of methods
コンソール/ロギングからの出力は、私が期待するものです:[オブジェクト、オブジェクト、オブジェクト]
ds.js のプリアンブル (コンソール/ログ付き) は次のとおりです。
define(["ds"], function (ds) {
console.log(arguments);
// the rest is a 'pure' module
ただし、コンソール/ロギングからの出力は次のとおりです。[未定義]
前者 (ds.test.js) は ds を正常にロードできるのに、ds.js 自体はロードできないのはなぜですか? これにより、テストの 1 つが失敗します。ds によって返されるメソッドの 1 つがそれ自体のメソッド、つまり「ds.assoc()」を参照しているためです。興味深いことに、require.js の前に独自の依存関係マネージャーを使用していましたが、同じメソッドでテストが失敗することはありませんでした。ds.js はそれ自体を参照できました。
これは、いわゆる「循環依存」の問題でしょうか? ds.test.js は ds.js に依存しており、ds.js はそれ自体に依存しています。その場合、どうすれば問題を解決できますか?
価値のあることとして、ds.test.js が最初にロードされます。これは、「test.runner.js」によって「SUITE」という名前のグローバル変数として取得されます。そのプリアンブルは次のとおりです。
define(["test", SUITE], function (test, suite) {
次に、読み込まれるテスト スイート (このキャストでは ds.test.js) は、テスト対象のモジュール ("ds" など) を順番に読み込みます。
いくつかの最終的なコンテキストは、私がこのコードをこの数週間で継承したばかりであり、私が行っていることは、別のアプリケーションを独自の依存関係マネージャーから require.js に変換した既存の方法に基づいているということです。したがって、「なぜグローバル変数を使用しているのですか」などのコメントで狙撃する前に、それを考慮に入れるように求めていると思います。具体的な代替案があれば、それを楽しみにしています。