67 votes

RequireJS: Comment définir des modules qui contiennent une seule "classe"?

J'ai un certain nombre de JavaScript "classes" chaque mis en œuvre dans son propre fichier JavaScript. Pour le développement de ces fichiers sont chargés individuellement, et pour la production ils sont concaténés, mais dans les deux cas, j'ai pour définir manuellement un ordre de chargement, s'assurer que B vient après Un si B utilise A. je suis à la planification de l'utilisation de RequireJS comme une mise en œuvre de CommonJS Modules/AsynchronousDefinition pour résoudre ce problème automatiquement pour moi.

Est-il une meilleure façon de le faire que de définir des modules d'exportation classe? Si non, comment vous le nom de ce que le module d'exportation? Un module "employé" de l'exportation d'une catégorie "Employé", comme dans l'exemple ci-dessous, ne se sent pas SÉCHER assez pour moi.

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");
});

111voto

jrburke Points 5361

L' AMD proposition vous permet de retourner une valeur pour l'objet exporté. Mais remarque, qui est une caractéristique de l'AMD proposition, c'est juste une API proposition, et il sera plus difficile de traduire le module de retour régulier de CommonJS module. Je pense que c'est OK, mais l'info utile à savoir.

Ainsi, vous pouvez effectuer les opérations suivantes:

Je préfère les modules que l'exportation d'une fonction constructeur pour commencer avec une majuscule, le nom, de sorte que le non-version optimisée de ce module serait également en Employee.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;
    };
});

Maintenant dans un autre module, vous pouvez utiliser l'Employé module comme ceci:

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

102voto

Mark Whitaker Points 1654

Comme un ajout à jrburke réponse, notez que vous n'avez pas de retour de la fonction constructeur directement. Pour la plupart des classes utiles vous devrez également ajouter des méthodes via le prototype, vous pouvez le faire comme ceci:

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;
});

En fait, c'est exactement le modèle présenté dans cet exemple à requirejs.org.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X