Node.js ES6-Klassen mit require

Lesezeit: 7 Minuten

Benutzer-Avatar
Marc Rasmussen

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

Benutzer-Avatar
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

Benutzer-Avatar
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?

    – meilenweit

    15. Januar um 1:24

  • @milesmeow – Siehe developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/….

    – jfriend00

    15. Januar um 1:38

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.

class ReadWrite {
    constructor() {
        console.log('Read Write'); 
        this.x;   
    }
    static makeObject() {        
        if (!this.x) {
            this.x = new ReadWrite();
        }
        return this.x;
    }
    read(){
    return "read"
    }

    write(){
        return "write"
    }


    async readWrite() {
        try {
            const obj = ReadWrite.makeObject();
            const result = await Promise.all([ obj.read(), obj.write()])
            console.log(result);
            check();
            return result
        }
        catch(err) {
            console.log(err);

        }
    }
}
module.exports = ReadWrite;

Weitere Erklärungen finden Sie unter https://medium.com/@nynptel/node-js-boiler-plate-code-using-singleton-classes-5b479e513f74

In der Klassendatei können Sie entweder verwenden:

module.exports = class ClassNameHere {
 print() {
  console.log('In print function');
 }
}

oder Sie können diese Syntax verwenden

class ClassNameHere{
 print(){
  console.log('In print function');
 }
}

module.exports = ClassNameHere;

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

1252310cookie-checkNode.js ES6-Klassen mit require

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy