RequireJS: как определить модули, которые содержат один "класс"?


У меня есть несколько "классов" JavaScript, каждый из которых реализован в своем собственном файле JavaScript. Для разработки эти файлы загружаются индивидуально, а для производства они объединены, но в обоих случаях мне нужно вручную определить порядок загрузки, убедившись, что B приходит после A, если B использует A. я планирую использовать RequireJS как реализация CommonJS Modules / AsynchronousDefinition чтобы решить эту проблему для меня автоматически.

есть лучший способ сделать это, чем определить модули, каждый из которых экспортирует один класс? Если нет, то как вы назовете то, что модуль экспортирует? Модуль "сотрудник", экспортирующий класс "сотрудник", как в примере ниже, не чувствует сухой достаточно для меня.

define("employee", ["exports"], function(exports) {
    exports.Employee = function(first, last) {
        this.first = first;
        this.last = last;
    };
});

define("main", ["employee"], function (employee) {
    var john = new employee.Employee("John", "Smith");
});
2 66

2 ответа:

The предложение AMD позволяет просто вернуть значение для экспортируемого объекта. Но обратите внимание, что это особенность предложения AMD, это просто предложение API, и это затруднит перевод модуля обратно в обычный модуль CommonJS. Я думаю, что это нормально, но полезная информация, чтобы знать.

таким образом, вы можете сделать следующее:

Я предпочитаю модули, которые экспортируют функцию конструктора, чтобы начать с имени верхнего регистра, поэтому неоптимизированная версия этого модуля также будет в сотрудниках.js

define("Employee", function () {
    //You can name this function here,
    //which can help in debuggers but
    //has no impact on the module name.
    return function Employee(first, last) {
        this.first = first; 
        this.last = last;
    };
});

теперь в другом модуле вы можете использовать модуль Employee следующим образом:

define("main", ["Employee"], function (Employee) {
    var john = new Employee("John", "Smith");
});

в дополнение к ответу jrburke обратите внимание, что вам не нужно возвращать функцию конструктора напрямую. Для большинства полезных классов вы также захотите добавить методы через прототип, который вы можете сделать следующим образом:

define('Employee', function() {
    // Start with the constructor
    function Employee(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    // Now add methods
    Employee.prototype.fullName = function() {
        return this.firstName + ' ' + this.lastName;
    };

    // etc.

    // And now return the constructor function
    return Employee;
});

на самом деле это именно тот шаблон, который показан в этот пример на requirejs.org.