Do tej pory tworzyłem klasy i moduły w node.js
następujący sposób:
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;
Teraz z ES6 możesz tworzyć „rzeczywiste” klasy, takie jak to:
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
Przede wszystkim uwielbiam to :), ale rodzi pytanie. Jak to wykorzystać w połączeniu ze node.js
strukturą modułu?
Powiedzmy, że masz klasę, w której chcesz użyć modułu do celów demonstracyjnych, powiedz, że chcesz użyć fs
więc tworzysz swój plik:
Animal.js
var fs = require('fs');
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
Czy to byłby właściwy sposób?
Ponadto, jak udostępnić tę klasę innym plikom w moim projekcie węzła? Czy nadal byłbyś w stanie rozszerzyć tę klasę, jeśli używasz jej w osobnym pliku?
Mam nadzieję, że część z Was będzie w stanie odpowiedzieć na te pytania :)
javascript
node.js
ecmascript-6
Marc Rasmussen
źródło
źródło
animalModule
jest całkiem bezcelowe w module węzła, który i tak ma własny zakres modułu.Odpowiedzi:
Tak, twój przykład zadziała dobrze.
Jeśli chodzi o eksponowanie swoich zajęć, możesz je
export
traktować jak wszystko inne:Lub krócej:
Po zaimportowaniu do innego modułu możesz traktować go tak, jakby był zdefiniowany w tym pliku:
źródło
module.exports
jest zwykle używany do anonimowego eksportu, natomiastexport
jest używany do nazwanego eksportu. Jest to podstawowa zaleta kodowania (można by rzec), która może pomóc innym wiedzieć, jak zaimportować twoją klasę, moduł i tak dalej.module.exports = Animal;
byłaby odpowiedzią lub najbardziej bezpośrednim odpowiednikiem pytania i jest ważna wraz zconst Animal = require('./animal');
kodem wywołującym. Czy możesz zaktualizować swoją odpowiedź, aby ją uwzględnić?Po prostu potraktuj nazwę klasy ES6 tak samo, jakbyś traktował nazwę konstruktora w sposób ES5. Są jednym i tym samym.
Składnia ES6 jest po prostu cukrem składniowym i tworzy dokładnie ten sam podstawowy prototyp, funkcję konstruktora i obiekty.
A więc w przykładzie z ES6 z:
Możesz po prostu traktować
Animal
jak konstruktor swojego obiektu (tak samo, jak zrobiłbyś to w ES5). Możesz wyeksportować konstruktora. Możesz wywołać konstruktora za pomocąnew Animal()
. Korzystanie z niego jest takie samo. Jedynie składnia deklaracji jest inna. Nadal istnieje taki,Animal.prototype
który zawiera wszystkie twoje metody. Sposób ES6 naprawdę tworzy ten sam wynik kodowania, tylko z bardziej wyszukaną / ładniejszą składnią.Po stronie importu byłoby to używane w następujący sposób:
Ten schemat eksportuje konstruktora Animal jako
.Animal
właściwość, która pozwala wyeksportować więcej niż jedną rzecz z tego modułu.Jeśli nie musisz eksportować więcej niż jednej rzeczy, możesz to zrobić:
A następnie zaimportuj go za pomocą:
źródło
module.exports = Animal
to jedyne rozwiązanie, które działa.require()
niż to, co pokazuje twój eksport, więc dlatego jeden miałby działać, a drugi nie. Musisz dopasować sposób działania importu do sposobu zdefiniowania eksportu. Więcej szczegółów wyjaśniających to dodane do mojej odpowiedzi.Sposób wymagania ES6 to
import
. Możeszexport
swoją klasę i zaimportować ją gdzie indziej, używającimport { ClassName } from 'path/to/ClassName'
składni.źródło
The ES6 way
jest nieco mylące.import
overrequire
tylko ze względu na spójność składni.import
współpracuje z modułami CommonJS, nie jest prawdopodobny, co zakończy się działaniem w Node, więc może wymagać zmian w kodzie w przyszłości, aby był kompatybilny z Node bez Babel .Używanie klas w węźle -
Tutaj wymagamy modułu ReadWrite i wywołujemy metodę makeObject (), która zwraca obiekt klasy ReadWrite. Które używamy do wywoływania metod. index.js
ReadWrite.js
Tutaj tworzymy metodę makeObject, która zapewnia, że obiekt zostanie zwrócony, tylko jeśli obiekt nie jest dostępny.
Więcej wyjaśnień można znaleźć pod adresem https://medium.com/@nynptel/node-js-boiler-plate-code-using-singleton-classes-5b479e513f74
źródło
W pliku klasy możesz użyć:
lub możesz użyć tej składni
Z drugiej strony, aby użyć tej klasy w jakimkolwiek innym pliku, musisz wykonać następujące kroki. Najpierw wymagaj tego pliku przy użyciu następującej składni:
const anyVariableNameHere = require('filePathHere');
Następnie utwórz obiekt
const classObject = new anyVariableNameHere();
Następnie możesz użyć,
classObject
aby uzyskać dostęp do rzeczywistych zmiennych klasźródło