Bisher habe ich also Klassen und Module in erstellt node.js folgender Weg:
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;
Mit ES6 können Sie jetzt “tatsächliche” Klassen wie folgt erstellen:
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
Nun, zuallererst liebe ich das :), aber es wirft eine Frage auf. Wie verwenden Sie dies kombiniert mit node.js‘s Modulstruktur?
Angenommen, Sie haben eine Klasse, in der Sie ein Modul zu Demonstrationszwecken verwenden möchten. Sagen Sie, Sie möchten es verwenden fs
so erstellen Sie Ihre Datei:
Tier.js
var fs = require('fs');
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
Wäre das der richtige Weg?
Wie stellen Sie diese Klasse auch anderen Dateien in meinem Knotenprojekt zur Verfügung? Und könnten Sie diese Klasse immer noch erweitern, wenn Sie sie in einer separaten Datei verwenden?
Ich hoffe, einige von euch können diese Fragen beantworten 🙂
Behandeln Sie den ES6-Klassennamen einfach genauso, wie Sie den Konstruktornamen auf ES5-Weise behandelt hätten. Sie sind ein und dasselbe. Die ES6-Syntax ist nur syntaktischer Zucker und erstellt genau den gleichen zugrunde liegenden Prototyp, die gleiche Konstruktorfunktion und die gleichen Objekte.
– jfriend00
8. März 2017 um 23:58 Uhr
Das IIFE, das Ihr erschafft animalModule ist in einem Knotenmodul, das sowieso einen eigenen Modulbereich hat, ziemlich sinnlos.
– Bergi
9. März 2017 um 0:53
Rossipedia
Ja, dein Beispiel würde gut funktionieren.
Was die Offenlegung Ihrer Klassen betrifft, können Sie export eine Klasse wie alles andere:
class Animal {...}
module.exports = Animal;
Oder kürzer:
module.exports = class Animal {
};
Einmal in ein anderes Modul importiert, können Sie es so behandeln, als wäre es in dieser Datei definiert:
var Animal = require('./Animal');
class Cat extends Animal {
...
}
Sie können auch so etwas wie module.exports = class Animal {} machen.
– Paulus
8. März 2017 um 23:59 Uhr
das stimmt, ich vergesse immer wieder, dass man bei der aufgabe dinge benennen kann.
– Rossipedia
9. März 2017 um 1:28 Uhr
Es kommt auf den Codestil und die Klarheit an. module.exports wird typischerweise für einen anonymen Export verwendet, while export wird für einen benannten Export verwendet. Dies ist eine grundlegende Codierungshöflichkeit (man könnte sagen), die anderen dabei helfen kann, zu wissen, wie sie Ihre Klasse, Ihr Modul usw. importieren.
– greg.arnott
5. September 2017 um 4:11 Uhr
module.exports = Animal; wäre die Antwort oder das direkteste Äquivalent zur Frage und gilt zusammen mit const Animal = require('./animal'); im Aufrufcode. Können Sie Ihre Antwort aktualisieren, um sie aufzunehmen?
– Sonne
20. September 2017 um 20:25 Uhr
Beachten Sie, dass class Animal {...} module.exports = Animal und module.exports = class Animal {...} sind nicht gleich: In letzterer Variante können Sie nicht verwenden new Animal() in der erforderlichen Datei, da der Klassenname nur innerhalb der Klasse zugänglich ist.
– würdig
5. Mai 2019 um 11:38 Uhr
jfriend00
Behandeln Sie den ES6-Klassennamen einfach genauso, wie Sie den Konstruktornamen auf ES5-Weise behandelt hätten. Sie sind ein und dasselbe.
Die ES6-Syntax ist nur syntaktischer Zucker und erstellt genau den gleichen zugrunde liegenden Prototyp, die gleiche Konstruktorfunktion und die gleichen Objekte.
Also, in Ihrem ES6-Beispiel mit:
// animal.js
class Animal {
...
}
var a = new Animal();
module.exports = {Animal: Animal};
Du kannst einfach behandeln Animal wie der Konstruktor Ihres Objekts (dasselbe, wie Sie es in ES5 getan hätten). Sie können den Konstruktor exportieren. Sie können den Konstruktor mit aufrufen new Animal(). Für die Verwendung ist alles gleich. Nur die Deklarationssyntax ist anders. Es gibt sogar noch einen Animal.prototype das hat alle Ihre Methoden drauf. Der ES6-Weg erzeugt wirklich das gleiche Codierungsergebnis, nur mit schickerer/schönerer Syntax.
Auf der Importseite würde dies dann so verwendet werden:
const Animal = require('./animal.js').Animal;
let a = new Animal();
Dieses Schema exportiert den Animal-Konstruktor als die .Animal -Eigenschaft, mit der Sie mehr als eine Sache aus diesem Modul exportieren können.
Wenn Sie nicht mehr als eine Sache exportieren müssen, können Sie dies tun:
// animal.js
class Animal {
...
}
module.exports = Animal;
Und dann importieren Sie es mit:
const Animal = require('./animal.js');
let a = new Animal();
Ich weiß nicht warum, aber das hat bei mir einfach nicht funktioniert. module.exports = Animal ist die einzig funktionierende Lösung.
– Sam
11. Juli 2018 um 22:09 Uhr
@Sam – Was mein Export zeigt, muss anders sein require() als das, was Ihr Export zeigt, also würde das eine funktionieren und das andere nicht. Sie müssen die Funktionsweise des Imports mit der Definition des Exports abgleichen. Weitere Details zur Erläuterung wurden meiner Antwort hinzugefügt.
– jfriend00
11. Juli 2018 um 22:30 Uhr
@jfriend00 – wie würden Sie private Methoden und Daten deklarieren?
Die ES6-Methode ist erforderlich import. Du kannst export Ihre Klasse und importieren Sie sie woanders mit import { ClassName } from 'path/to/ClassName'Syntax.
import fs from 'fs';
export default class Animal {
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
import Animal from 'path/to/Animal.js';
Es wäre gut klarzustellen, dass dies eine Option, aber keine Voraussetzung ist. Dies ist die ES6-Modulsyntax, aber Sie können weiterhin eine ES6-Klasse mit den normalen CommonJS-Exporten von Node verwenden. Es ist nicht erforderlich, die ES6-Exportsyntax mit Klassen zu verwenden. Rufen Sie es an The ES6 way ist etwas irreführend.
– loganfsmyth
9. März 2017 um 3:16 Uhr
Das stimmt, es ist eine persönliche Präferenz. Ich persönlich würde verwenden import Über require Nur wegen der Syntaxkonsistenz.
– Fan-Jin
9. März 2017 um 5:21 Uhr
Ja, es ist ein solider Ansatz und ich mache es auch, behalte nur im Hinterkopf, dass die Art und Weise von Babel ist import mit CommonJS-Modulen interagiert, ist unwahrscheinlich, was am Ende in Node funktionieren wird, daher könnten in Zukunft Codeänderungen erforderlich sein, um mit Node ohne Babel kompatibel zu sein.
– loganfsmyth
9. März 2017 um 6:07 Uhr
ES6-Module (Import und Export) sind in Node 10 noch experimentell und müssen beim Starten von node
– Dekoration
20. September 2018 um 10:51 Uhr
Um den Punkt von @ Dorking zu ergänzen. Node 10.15.3 ist die LTS-Version (Long Term Support) und wird bis April 2020 verfügbar sein. Weitere Details hier: nodejs.org/en/about/releases
– gtzilla
25. Mai 2019 um 1:13 Uhr
Klassen im Knoten verwenden –
Hier benötigen wir das ReadWrite-Modul und rufen ein makeObject() auf, das das Objekt der ReadWrite-Klasse zurückgibt. Womit wir die Methoden aufrufen. index.js
const ReadWrite = require('./ReadWrite').makeObject();
const express = require('express');
const app = express();
class Start {
constructor() {
const server = app.listen(8081),
host = server.address().address,
port = server.address().port
console.log("Example app listening at http://%s:%s", host, port);
console.log('Running');
}
async route(req, res, next) {
const result = await ReadWrite.readWrite();
res.send(result);
}
}
const obj1 = new Start();
app.get("https://stackoverflow.com/", obj1.route);
module.exports = Start;
ReadWrite.js
Hier erstellen wir eine makeObject-Methode, die sicherstellt, dass ein Objekt zurückgegeben wird, nur wenn ein Objekt nicht verfügbar ist.
Andererseits müssen Sie diese Schritte ausführen, um diese Klasse in einer anderen Datei zu verwenden. Fordern Sie zuerst diese Datei mit dieser Syntax an: const anyVariableNameHere = require('filePathHere');
Erstellen Sie dann ein Objekt const classObject = new anyVariableNameHere();
Danach können Sie verwenden classObject um auf die eigentlichen Klassenvariablen zuzugreifen
12523100cookie-checkNode.js ES6-Klassen mit requireyes
Behandeln Sie den ES6-Klassennamen einfach genauso, wie Sie den Konstruktornamen auf ES5-Weise behandelt hätten. Sie sind ein und dasselbe. Die ES6-Syntax ist nur syntaktischer Zucker und erstellt genau den gleichen zugrunde liegenden Prototyp, die gleiche Konstruktorfunktion und die gleichen Objekte.
– jfriend00
8. März 2017 um 23:58 Uhr
Das IIFE, das Ihr erschafft
animalModule
ist in einem Knotenmodul, das sowieso einen eigenen Modulbereich hat, ziemlich sinnlos.– Bergi
9. März 2017 um 0:53