Então, até agora, criei classes e módulos node.js
da seguinte maneira:
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;
Agora, com o ES6, você é capaz de criar classes "reais" assim:
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
Agora, em primeiro lugar, adoro isto :) mas levanta uma questão. Como você usa isso combinado com node.js
a estrutura do módulo de?
Digamos que você tenha uma classe na qual deseja usar um módulo para fins de demonstração, digamos que deseja usar fs
então você cria seu arquivo:
Animal.js
var fs = require('fs');
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
Esse seria o caminho certo?
Além disso, como você expõe essa classe a outros arquivos dentro do meu projeto de nó? E você ainda seria capaz de estender esta classe se estiver usando em um arquivo separado?
Espero que alguns de vocês sejam capazes de responder a essas perguntas :)
javascript
node.js
ecmascript-6
Marc Rasmussen
fonte
fonte
animalModule
é bastante inútil em um módulo de nó que tem seu próprio escopo de módulo de qualquer maneira.Respostas:
Sim, seu exemplo funcionaria bem.
Quanto a expor suas aulas, você pode fazer
export
uma aula como qualquer outra coisa:Ou o mais curto:
Depois de importado para outro módulo, você pode tratá-lo como se estivesse definido naquele arquivo:
fonte
module.exports
é normalmente usado para uma exportação anônima, enquantoexport
é usado para uma exportação nomeada. Esta é uma cortesia básica de codificação (você pode dizer), que pode ajudar outras pessoas a saber como importar sua classe, módulo e outros etc.module.exports = Animal;
seria a resposta ou o equivalente mais direto da pergunta e é válido junto com oconst Animal = require('./animal');
código de chamada. Você pode atualizar sua resposta para incluí-lo?Apenas trate o nome da classe ES6 da mesma forma que trataria o nome do construtor da maneira ES5. Eles são um e o mesmo.
A sintaxe ES6 é apenas um açúcar sintático e cria exatamente o mesmo protótipo subjacente, função de construtor e objetos.
Então, em seu exemplo ES6 com:
Você pode apenas tratar
Animal
como o construtor do seu objeto (o mesmo que faria no ES5). Você pode exportar o construtor. Você pode chamar o construtor comnew Animal()
. Tudo é igual para usá-lo. Apenas a sintaxe da declaração é diferente. Ainda existe umAnimal.prototype
que contém todos os seus métodos. A maneira ES6 realmente cria o mesmo resultado de codificação, apenas com uma sintaxe mais sofisticada / agradável.No lado da importação, isso seria usado assim:
Este esquema exporta o construtor Animal como a
.Animal
propriedade que permite exportar mais de uma coisa desse módulo.Se você não precisa exportar mais de uma coisa, pode fazer o seguinte:
E, em seguida, importe-o com:
fonte
module.exports = Animal
é a única solução que funciona.require()
do que sua exportação mostra, então é por isso que um funcionaria e o outro não. Você tem que combinar como a importação funciona com a forma como a exportação é definida. Mais detalhes para explicar isso foram adicionados à minha resposta.A maneira ES6 de exigir é
import
. Você podeexport
sua classe e importá-la para outro lugar usando aimport { ClassName } from 'path/to/ClassName'
sintaxe.fonte
The ES6 way
é um pouco enganoso.import
overrequire
apenas por uma questão de consistência de sintaxe.import
interopera com os módulos CommonJS provavelmente não vai funcionar no Node, portanto, pode exigir alterações de código no futuro para ser compatível com o Node sem Babel .Usando classes no nó -
Aqui, estamos exigindo o módulo ReadWrite e chamando makeObject (), que retorna o objeto da classe ReadWrite. Que estamos usando para chamar os métodos. index.js
ReadWrite.js
Aqui estamos fazendo um método makeObject, que garante que um objeto seja retornado, apenas se um objeto não estiver disponível.
Para obter mais explicações, acesse https://medium.com/@nynptel/node-js-boiler-plate-code-using-singleton-classes-5b479e513f74
fonte
No arquivo de classe, você pode usar:
ou você pode usar esta sintaxe
Por outro lado, para usar esta classe em qualquer outro arquivo, você precisa seguir estas etapas. Primeiro, exija esse arquivo usando esta sintaxe:
const anyVariableNameHere = require('filePathHere');
Em seguida, crie um objeto
const classObject = new anyVariableNameHere();
Depois disso, você pode usar
classObject
para acessar as variáveis de classe reaisfonte