У моїй системі я маю декілька "класів", завантажених у браузер окремими файлами під час розробки та об'єднаних разом для виробництва. Під час завантаження вони ініціалізують властивість для глобального об’єкта тут 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");
Замість того, щоб використовувати свій власний глобальний об'єкт, я розглядаю можливість створити для кожного класу власний модуль 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()
, якщо додати перший рядок var Employee = require("Employee");
, це спрацює , але я бачу це рішення гіршим за невикористання RequireJS / AMD, оскільки мені, розробнику, потрібно знати про цю нещодавно створену циркулярну залежність і щось робити з цим.
Чи є кращий спосіб вирішити цю проблему за допомогою RequireJS / AMD, чи я використовую RequireJS / AMD для чогось, для чого він не був розроблений?
function(exports, Company)
іfunction(exports, Employee)
. У будь-якому випадку, дякую за RequireJS, це неймовірно.