Einfügen einer JavaScript-Klassendefinition aus einer anderen Datei in Node.js.


114

Ich schreibe einen einfachen Server für Node.js und verwende meine eigene Klasse mit dem Namen User:

function User(socket) {
    this.socket = socket;
    this.nickname = null;

    /* ... just the typical source code like functions, variables and bugs ... */

    this.write = function(object) {
        this.socket.write(JSON.stringify(object));
    }
};

und dann später im Prozess instanziiere ich es viel:

var server = net.createServer(function (socket) {
    /* other bugs */
    var user = new User(socket);
    /* more bugs and bad practise */
});

Kann ich meine UserKlassendefinition in eine andere Javascript-Datei verschieben und sie irgendwie "einschließen"?

Antworten:


201

Sie können dies einfach tun:

user.js

class User {
    //...
}

module.exports = User

server.js

const User = require('./user.js')

// Instantiate User:
let user = new User()

Dies wird als CommonJS- Modul bezeichnet.

Exportieren Sie mehrere Werte

Manchmal kann es nützlich sein, mehr als einen Wert zu exportieren. Zum Beispiel können es Klassen, Funktionen oder Konstanten sein:

user.js

class User {}

exports.User = User
exports.ROLE_ADMIN = 'admin'
exports.ROLE_USER = 'user'
export.isValidUser = function isValidUser() {
    // ...
}

server.js

const {User, ROLE_ADMIN, ROLE_USER, isValidUser} = require('./user.js')

// Instantiate User:
let user = new User()

ES-Module

Seit Node.js Version 14 ist es möglich, ES-Module mit CommonJS zu verwenden. Weitere Informationen hierzu finden Sie in der ESM-Dokumentation .

Hier ist ein Beispiel für dasselbe Verhalten, das mit ESM implementiert wurde:

package.json

{
  "type": "module"
}

user.js

export default class User {}

server.js

import User from './user.js'

let user = new User()

Hinweis

⚠️ Verwenden Sie keine Globals, da dies zu potenziellen Konflikten mit dem zukünftigen Code führen kann.


Was wäre, wenn der Benutzer einige Eingabeparameter hätte, z. B. module.exports = function User (data). Dann ist der var user = new User (); Was hätte in var user = new User (data) geändert werden sollen?
C Grafiken

Ja. Userist übliche js Funktion.
Paul Rumkin

2
Sie müssen die Konstante User nicht in server.js erstellen. Ändern Sie die letzte Zeile von users.js in module.exports = new User();Dies erstellt jedes Mal eine neue Instanz von User, wenn das Modul benötigt wird. Dann können Sie einfach das Modul für jede Variable wie folgt benötigen : let user = require('./user.js');.
Nadav

1
@Barnack Es gibt mehrere meiner Antworten. Was ist falsch und was ist richtig?
Paul Rumkin

1
@ PashaRumkin Objekt lokal instanziieren, aber ich habe TypeError: <ClassName> ist kein Konstruktor
Md Alamin

13

Mit ES6 können Sie user.js:

export default class User {
  constructor() {
    ...
  }
}

Und dann benutze es in server.js

const User = require('./user.js').default;
const user = new User();

Ich bekomme eine, SyntaxError: Unexpected token exportwenn ich tue, was du beschrieben hast ... Ich habe eine Knotenversionv10.16.3
Thomas

6

Ändern Sie Ihre Klassendefinition so, dass sie wie folgt lautet:

exports.User = function (socket) {
  ...
};

Benennen Sie dann die Datei in um user.js. Angenommen, es befindet sich im Stammverzeichnis Ihres Hauptskripts, können Sie es folgendermaßen einfügen:

var user = require('./user');
var someUser = new user.User();

Das ist die schnelle und schmutzige Version. Lesen Sie mehr über CommonJS-Module, wenn Sie mehr erfahren möchten.


2
Was ist mit der Steckdose passiert? sollte es var someUser = neuer Benutzer sein.User (Socket);
C Grafiken

5

Ein anderer Weg zusätzlich zu den hier für ES6 bereitgestellten

module.exports = class TEST{
    constructor(size) {
        this.map = new MAp();
        this.size = size;

    }

    get(key) {
        return this.map.get(key);
    }

    length() {
        return this.map.size;
    }    

}

und schließen Sie das gleiche wie ein

var TEST= require('./TEST');
var test = new TEST(1);


1

Ich möchte nur darauf hinweisen, dass die meisten Antworten hier nicht funktionieren. Ich bin neu bei NodeJS und IDK, wenn sich die Methode "module.exports.yourClass" im Laufe der Zeit geändert hat oder wenn Leute einfach die falsche Antwort eingegeben haben.

// MyClass

module.exports.Ninja = class Ninja{
    test(){
        console.log('TESTING 1... 2... 3...');
    };
}
//Using MyClass in seprate File


const ninjaFw = require('./NinjaFw');

let ninja = new ninjaFw.Ninja();
ninja.test();
  • Dies ist die Methode, die ich derzeit verwende. Ich mag diese Syntax, weil module.exports in derselben Zeile wie die Klassendeklaration steht und das den Code ein wenig aufräumt. Der andere Weg, wie Sie es tun können, ist wie folgt:
//  Ninja Framework File


class Ninja{
    test(){
        console.log('TESTING 1... 2... 3...');
    };
}


module.exports.Ninja = Ninja;
  • Zwei verschiedene Syntax, aber am Ende das gleiche Ergebnis. Nur eine Frage der Syntaxanästhetika.

0

Anstelle von myFile.js schreiben Sie Ihre Dateien wie myFile.mjs. Diese Erweiterung enthält alle Extras von es6, aber ich meine, ich empfehle Ihnen Webpack und Babel

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.