私のシステムでは、開発中にブラウザにそれぞれ個別のファイルがロードされ、本番用に連結された多数の「クラス」があります。G
ロードされると、次の例のように、グローバルオブジェクトのプロパティを初期化します。
var G = {};
G.Employee = function(name) {
this.name = name;
this.company = new G.Company(name + "'s own company");
};
G.Company = function(name) {
this.name = name;
this.employees = [];
};
G.Company.prototype.addEmployee = function(name) {
var employee = new G.Employee(name);
this.employees.push(employee);
employee.company = this;
};
var john = new G.Employee("John");
var bigCorp = new G.Company("Big Corp");
bigCorp.addEmployee("Mary");
私自身のグローバルオブジェクトを使用する代わりに、James Burkeの提案に基づいて、各クラスを独自のAMDモジュールにすることを検討しています。
define("Employee", ["Company"], function(Company) {
return function (name) {
this.name = name;
this.company = new Company(name + "'s own company");
};
});
define("Company", ["Employee"], function(Employee) {
function Company(name) {
this.name = name;
this.employees = [];
};
Company.prototype.addEmployee = function(name) {
var employee = new Employee(name);
this.employees.push(employee);
employee.company = this;
};
return Company;
});
define("main", ["Employee", "Company"], function (Employee, Company) {
var john = new Employee("John");
var bigCorp = new Company("Big Corp");
bigCorp.addEmployee("Mary");
});
問題は、以前は従業員と会社の間に宣言時の依存関係がなかったことです。宣言は任意の順序で配置できましたが、今ではRequireJSを使用すると、依存関係が導入されます。これは(意図的に)循環しているため、上記のコードは失敗します。もちろん、では、最初の行をaddEmployee()
追加すると機能しますが、このソリューションは、開発者である私がこの新しく作成された循環依存関係を認識して何かを行う必要があるため、RequireJS/AMDを使用しない場合よりも劣ると思います。var Employee = require("Employee");
RequireJS / AMDでこの問題を解決するためのより良い方法はありますか、それとも私はRequireJS / AMDを設計されていないものに使用していますか?