Inclusa la definizione della classe JavaScript da un altro file in Node.js


115

Sto scrivendo un semplice server per Node.js e sto usando la mia classe chiamata Userche assomiglia a:

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));
    }
};

e poi più avanti nel processo ne creo molte istanze:

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

Posso spostare la Userdefinizione della mia classe in un altro file javascript e "includerla" in qualche modo?

Risposte:


202

Puoi semplicemente fare questo:

user.js

class User {
    //...
}

module.exports = User

server.js

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

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

Questo si chiama CommonJS modulo .

Esporta più valori

A volte può essere utile esportare più di un valore. Ad esempio potrebbero essere classi, funzioni o costanti:

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()

Moduli ES

Dalla versione 14 di Node.js è possibile utilizzare moduli ES con CommonJS. Maggiori informazioni a riguardo nella documentazione ESM .

Ecco un esempio dello stesso comportamento implementato con ESM:

package.json

{
  "type": "module"
}

user.js

export default class User {}

server.js

import User from './user.js'

let user = new User()

Nota

⚠️ Non utilizzare globali, crea potenziali conflitti con il codice futuro.


e se, l'utente avesse alcuni parametri di input, come module.exports = function User (data). Quindi il var user = new User (); sarebbe stato cambiato in var user = new User (data) ;?
Grafica C

Sì. Userè la normale funzione js.
Paul Rumkin

2
Non è necessario creare l'utente costante in server.js. Cambia l'ultima riga di users.js in module.exports = new User();Ciò creerà una nuova istanza di Utente ogni volta che il modulo è richiesto. Poi si può semplicemente richiedere il modulo per ogni variabile in questo modo: let user = require('./user.js');.
Nadav

1
@ Barnack Ci sono diverse mie risposte. Quale è sbagliato e quale è corretto?
Paul Rumkin

1
@pashaRumkin Crea un'istanza dell'oggetto localmente, ma ho ricevuto TypeError: <ClassName> non è un costruttore
Md Alamin

13

Utilizzando ES6, puoi avere user.js:

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

E poi usalo in server.js

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

ottengo un SyntaxError: Unexpected token exportquando faccio come hai descritto ... ho la versione del nodov10.16.3
thomas

6

Modifica la definizione della tua classe per leggere in questo modo:

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

Quindi rinomina il file in user.js. Supponendo che si trovi nella directory principale del tuo script principale, puoi includerlo in questo modo:

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

Questa è la versione veloce e sporca. Leggi i moduli CommonJS se desideri saperne di più.


2
Cos'è successo al socket? dovrebbe essere var someUser = new user.User (socket);
Grafica C

5

Un altro modo oltre a quelli forniti qui per ES6

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;
    }    

}

e includere lo stesso di

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


1

Voglio solo sottolineare che la maggior parte delle risposte qui non funziona, sono nuovo a NodeJS e IDK se nel tempo il metodo "module.exports.yourClass" è cambiato, o se le persone hanno semplicemente inserito la risposta sbagliata.

// 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();
  • Questo è il metodo che sto utilizzando attualmente. Mi piace questa sintassi, perché module.exports si trova sulla stessa riga della dichiarazione della classe e questo pulisce un po 'il codice. L'altro modo in cui puoi farlo è così:
//  Ninja Framework File


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


module.exports.Ninja = Ninja;
  • Due sintassi diverse ma, alla fine, lo stesso risultato. È solo una questione di anestetici di sintassi.

0

Invece di myFile.js scrivi i tuoi file come myFile.mjs. Questa estensione viene fornita con tutte le chicche di es6, ma voglio dire che ti consiglio webpack e Babel

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.