Donc jusqu'à présent, j'ai créé des classes et des modules de node.js
la manière suivante:
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;
Maintenant avec ES6, vous pouvez créer des classes "réelles" comme ceci:
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
Maintenant, tout d'abord, j'adore ça :) mais cela soulève une question. Comment utilisez-vous cela combiné avec node.js
la structure des modules de?
Disons que vous avez une classe où vous souhaitez utiliser un module à des fins de démonstration, dites que vous souhaitez utiliser fs
donc vous créez votre fichier:
Animal.js
var fs = require('fs');
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
Serait-ce la bonne manière?
De plus, comment exposez-vous cette classe à d'autres fichiers dans mon projet de nœud? Et seriez-vous toujours en mesure d'étendre cette classe si vous l'utilisez dans un fichier séparé?
J'espère que certains d'entre vous pourront répondre à ces questions :)
la source
animalModule
est assez inutile dans un module de nœud qui a de toute façon sa propre portée de module.Réponses:
Oui, votre exemple fonctionnerait bien.
Quant à exposer vos classes, vous pouvez
export
une classe comme n'importe quoi d'autre:Ou le plus court:
Une fois importé dans un autre module, vous pouvez le traiter comme s'il était défini dans ce fichier:
la source
module.exports
est généralement utilisé pour une exportation anonyme, tandis queexport
pour une exportation nommée. C'est une courtoisie de codage de base (vous pourriez dire), qui peut aider les autres à savoir comment importer votre classe, module et autres, etc.module.exports = Animal;
serait la réponse ou l'équivalent le plus direct de la question et est valide avec leconst Animal = require('./animal');
code d'appel. Pouvez-vous mettre à jour votre réponse pour l'inclure?Traitez simplement le nom de la classe ES6 de la même manière que vous auriez traité le nom du constructeur à la manière ES5. Ils sont identiques.
La syntaxe ES6 n'est que du sucre syntaxique et crée exactement le même prototype sous-jacent, la même fonction constructeur et les mêmes objets.
Donc, dans votre exemple ES6 avec:
Vous pouvez simplement traiter
Animal
comme le constructeur de votre objet (comme vous l'auriez fait dans ES5). Vous pouvez exporter le constructeur. Vous pouvez appeler le constructeur avecnew Animal()
. Tout est pareil pour son utilisation. Seule la syntaxe de la déclaration est différente. Il y a même toujours unAnimal.prototype
qui a toutes vos méthodes dessus. La manière ES6 crée vraiment le même résultat de codage, juste avec une syntaxe plus sophistiquée / plus agréable.Du côté de l'importation, cela serait alors utilisé comme ceci:
Ce schéma exporte le constructeur Animal en tant que
.Animal
propriété qui vous permet d'exporter plus d'un élément de ce module.Si vous n'avez pas besoin d'exporter plus d'une chose, vous pouvez le faire:
Et puis importez-le avec:
la source
module.exports = Animal
est la seule solution qui fonctionne.require()
de ce que votre exportation montre, c'est pourquoi l'un fonctionnerait et l'autre pas. Vous devez faire correspondre la façon dont l'importation fonctionne avec la façon dont l'exportation est définie. Plus de détails pour expliquer cela ajouté à ma réponse.La manière ES6 d'exiger est
import
. Vous pouvezexport
votre classe et l'importer ailleurs en utilisant laimport { ClassName } from 'path/to/ClassName'
syntaxe.la source
The ES6 way
est quelque peu trompeur.import
overrequire
juste pour des raisons de cohérence syntaxique.import
interagit avec les modules CommonJS n'est pas susceptible de fonctionner dans Node, donc cela pourrait nécessiter des changements de code à l'avenir pour être compatible avec Node sans Babel .Utilisation des classes dans Node -
Ici, nous avons besoin du module ReadWrite et appelons un makeObject (), qui renvoie l'objet de la classe ReadWrite. Ce que nous utilisons pour appeler les méthodes. index.js
ReadWrite.js
Ici, nous créons une méthode makeObject, qui s'assure qu'un objet est retourné, uniquement si un objet n'est pas disponible.
Pour plus d'explications, rendez-vous sur https://medium.com/@nynptel/node-js-boiler-plate-code-using-singleton-classes-5b479e513f74
la source
Dans le fichier de classe, vous pouvez soit utiliser:
ou vous pouvez utiliser cette syntaxe
En revanche, pour utiliser cette classe dans tout autre fichier, vous devez effectuer ces étapes. Exigez d'abord ce fichier en utilisant cette syntaxe:
const anyVariableNameHere = require('filePathHere');
Puis créez un objet
const classObject = new anyVariableNameHere();
Après cela, vous pouvez utiliser
classObject
pour accéder aux variables de classe réellesla source