Entonces, hasta ahora, he creado clases y módulos de node.js
la siguiente manera:
var fs = require('fs');
var animalModule = (function () {
/**
* Constructor initialize object
* @constructor
*/
var Animal = function (name) {
this.name = name;
};
Animal.prototype.print = function () {
console.log('Name is :'+ this.name);
};
return {
Animal: Animal
}
}());
module.exports = animalModule;
Ahora, con ES6, puede crear clases "reales" como esta:
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
Ahora, en primer lugar, me encanta esto :) pero plantea una pregunta. ¿Cómo se usa esto combinado con node.js
la estructura del módulo de '?
Supongamos que tiene una clase en la que desea utilizar un módulo por motivos de demostración, digamos que desea utilizar fs
para que crees tu archivo:
Animal.js
var fs = require('fs');
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
¿Sería esta la forma correcta?
Además, ¿cómo expones esta clase a otros archivos dentro de mi proyecto de nodo? ¿Y aún podría extender esta clase si la usa en un archivo separado?
Espero que algunos de ustedes puedan responder estas preguntas :)
javascript
node.js
ecmascript-6
Marc Rasmussen
fuente
fuente
animalModule
tiene sentido en un módulo de nodo que tiene su propio alcance de módulo de todos modos.Respuestas:
Sí, tu ejemplo funcionaría bien.
En cuanto a exponer sus clases, puede
export
una clase como cualquier otra cosa:O el más corto:
Una vez importado a otro módulo, puede tratarlo como si estuviera definido en ese archivo:
fuente
module.exports
se utiliza normalmente para una exportación anónima, mientras queexport
se utiliza para una exportación con nombre. Esta es una cortesía de codificación básica (podría decirse), que puede ayudar a otros a saber cómo importar su clase, módulo, etcétera.module.exports = Animal;
sería la respuesta o el equivalente más directo a la pregunta y es válido junto con elconst Animal = require('./animal');
código de llamada. ¿Puede actualizar su respuesta para incluirla?Simplemente trate el nombre de la clase ES6 de la misma manera que hubiera tratado el nombre del constructor en la forma ES5. Son uno y lo mismo.
La sintaxis de ES6 es simplemente azúcar sintáctica y crea exactamente el mismo prototipo subyacente, función de constructor y objetos.
Entonces, en su ejemplo de ES6 con:
Puede tratarlo
Animal
como el constructor de su objeto (lo mismo que lo hubiera hecho en ES5). Puede exportar el constructor. Puede llamar al constructor connew Animal()
. Todo es igual para usarlo. Solo la sintaxis de la declaración es diferente. Incluso todavía hay unAnimal.prototype
que tiene todos tus métodos. La forma ES6 realmente crea el mismo resultado de codificación, solo que con una sintaxis más elegante / agradable.En el lado de la importación, esto se usaría así:
Este esquema exporta el constructor Animal como la
.Animal
propiedad que le permite exportar más de una cosa de ese módulo.Si no necesita exportar más de una cosa, puede hacer esto:
Y luego importarlo con:
fuente
module.exports = Animal
es la única solución que funciona.require()
de lo que muestra su exportación, por lo que sería por eso que uno funcionaría y el otro no. Debe hacer coincidir cómo funciona la importación con cómo se define la exportación. Más detalles para explicar esto se agregaron a mi respuesta.La forma de ES6 de require es
import
. Puedeexport
su clase e importarla en otro lugar usando laimport { ClassName } from 'path/to/ClassName'
sintaxis.fuente
The ES6 way
es algo engañoso.import
overrequire
solo por el bien de la coherencia de sintaxis.import
interopera con los módulos CommonJS no es probable que termine funcionando en Node, por lo que podría requerir cambios de código en el futuro para ser compatible con Node sin Babel. .Usando clases en el nodo -
Aquí estamos solicitando el módulo ReadWrite y llamando a makeObject (), que devuelve el objeto de la clase ReadWrite. Que estamos usando para llamar a los métodos. index.js
ReadWrite.js
Aquí hacemos un método makeObject, que asegura que se devuelva un objeto, solo si un objeto no está disponible.
Para obtener más explicaciones, vaya a https://medium.com/@nynptel/node-js-boiler-plate-code-using-singleton-classes-5b479e513f74
fuente
En el archivo de clase, puede usar:
o puedes usar esta sintaxis
Por otro lado, para usar esta clase en cualquier otro archivo, debe seguir estos pasos. Primero requiere ese archivo usando esta sintaxis:
const anyVariableNameHere = require('filePathHere');
Luego crea un objeto
const classObject = new anyVariableNameHere();
Después de esto, puede usar
classObject
para acceder a las variables de clase realesfuente