Dans mon système, j'ai un certain nombre de "classes" chargées dans le navigateur, chacune dans un fichier séparé pendant le développement, et concaténées ensemble pour la production. Lorsqu'elles sont chargées, elles initialisent une propriété sur un objet global, ici G
comme dans cet exemple :
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");
Au lieu d'utiliser mon propre objet global, j'envisage de faire en sorte que chaque classe ait sa propre Module AMD sur la base de La suggestion de James Burke :
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");
});
Le problème est qu'avant, il n'y avait pas de dépendance de temps de déclaration entre Employee et Company : vous pouviez mettre la déclaration dans l'ordre que vous vouliez, mais maintenant, en utilisant RequireJS, cela introduit une dépendance, qui est ici (intentionnellement) circulaire, donc le code ci-dessus échoue. Bien sûr, dans addEmployee()
en ajoutant une première ligne var Employee = require("Employee");
serait faire en sorte que cela fonctionne Mais je considère cette solution comme inférieure à la non-utilisation de RequireJS/AMD, car elle exige de moi, le développeur, d'être conscient de cette dépendance circulaire nouvellement créée et de faire quelque chose à ce sujet.
Y a-t-il une meilleure façon de résoudre ce problème avec RequireJS/AMD, ou est-ce que j'utilise RequireJS/AMD pour quelque chose pour lequel il n'a pas été conçu ?