node es6 javascript commonjs requirejs

javascript - es6 - node js requirejs



RequireJS: ¿Cómo definir módulos que contienen una sola "clase"? (2)

Tengo varias "clases" de JavaScript, cada una implementada en su propio archivo JavaScript. Para el desarrollo esos archivos se cargan individualmente, y para la producción se concatenan, pero en ambos casos tengo que definir manualmente una orden de carga, asegurándome de que B viene después de A si B usa A. Estoy planeando usar RequireJS como una implementación de CommonJS Modules / AsynchronousDefinition para resolver este problema automáticamente.

¿Hay una mejor manera de hacerlo que definir módulos que exporten una sola clase? Si no, ¿cómo nombras lo que exporta el módulo? Un módulo "empleado" que exporta una clase "Empleado", como en el ejemplo siguiente, no se siente lo suficientemente DRY para mí.

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


Como una adición a la respuesta de jrburke, tenga en cuenta que no tiene que devolver la función del constructor directamente. Para las clases más útiles también querrás agregar métodos a través del prototipo, que puedes hacer de esta manera:

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

De hecho, este es exactamente el patrón que se muestra en este ejemplo en requirejs.org .


La propuesta de AMD le permite simplemente devolver un valor para el objeto exportado. Pero tenga en cuenta que es una característica de la propuesta de AMD, es solo una propuesta de API, y hará que sea más difícil traducir el módulo a un módulo CommonJS regular. Creo que está bien, pero información útil para saber.

Entonces puedes hacer lo siguiente:

Prefiero que los módulos que exportan una función de constructor comiencen con un nombre en mayúscula, por lo que la versión no optimizada de este módulo también estará 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; }; });

Ahora en otro módulo, puede usar el módulo Employee de la siguiente manera:

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