Inclure la définition de classe JavaScript à partir d'un autre fichier dans Node.js


115

J'écris un serveur simple pour Node.js et j'utilise ma propre classe appelée Userqui ressemble à:

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

puis plus tard dans le processus, je l'instancie beaucoup:

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

Puis-je déplacer ma Userdéfinition de classe vers un autre fichier javascript et "l'inclure" d'une manière ou d'une autre?

Réponses:


202

Vous pouvez simplement faire ceci:

user.js

class User {
    //...
}

module.exports = User

server.js

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

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

C'est ce qu'on appelle le module CommonJS .

Exporter plusieurs valeurs

Parfois, il peut être utile d'exporter plus d'une valeur. Par exemple, il peut s'agir de classes, de fonctions ou de constantes:

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

Modules ES

Depuis la version 14 de Node.js, il est possible d'utiliser des modules ES avec CommonJS. En savoir plus à ce sujet dans la documentation ESM .

Voici un exemple du même comportement implémenté avec ESM:

package.json

{
  "type": "module"
}

user.js

export default class User {}

server.js

import User from './user.js'

let user = new User()

Remarque

⚠️ N'utilisez pas de globaux, cela crée des conflits potentiels avec le futur code.


Et si, l'utilisateur avait des paramètres d'entrée, comme module.exports = fonction Utilisateur (données). Puis le var user = new User (); aurait été changé en var user = new User (data) ;?
Graphiques C

Oui. Userest la fonction js habituelle.
Paul Rumkin

2
Vous n'avez pas besoin de créer l'utilisateur constant dans server.js. Modifiez la dernière ligne de users.js en module.exports = new User();Ceci créera une nouvelle instance de User à chaque fois que le module est requis. Ensuite , vous pouvez simplement exiger le module pour chaque variable comme ceci: let user = require('./user.js');.
Nadav

1
@Barnack Il y a plusieurs mes réponses. Quel est le problème et lequel est correct?
Paul Rumkin

1
@pashaRumkin Instancier l'objet localement, mais j'ai TypeError: <ClassName> n'est pas un constructeur
Md Alamin

13

En utilisant ES6, vous pouvez avoir user.js:

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

Et puis utilisez-le dans server.js

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

je reçois un SyntaxError: Unexpected token exportquand je fais ce que vous avez décrit ... j'ai la version de nœudv10.16.3
thomas

6

Modifiez votre définition de classe pour lire comme ceci:

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

Puis renommez le fichier en user.js. En supposant qu'il se trouve dans le répertoire racine de votre script principal, vous pouvez l'inclure comme ceci:

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

C'est la version rapide et sale. Lisez à propos des modules CommonJS si vous souhaitez en savoir plus.


2
Qu'est-il arrivé à socket? devrait-il être var someUser = new user.User (socket);
Graphiques C

5

Une autre façon en plus de celles fournies ici pour 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;
    }    

}

et inclure le même que

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


1

Je veux juste souligner que la plupart des réponses ici ne fonctionnent pas, je suis nouveau sur NodeJS et IDK si au fil du temps la méthode "module.exports.yourClass" a changé, ou si les gens ont simplement entré la mauvaise réponse.

// 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();
  • C'est la méthode que j'utilise actuellement. J'aime cette syntaxe, car module.exports se trouve sur la même ligne que la déclaration de classe et cela nettoie un peu le code. L'autre façon dont vous pouvez le faire est comme ceci:
//  Ninja Framework File


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


module.exports.Ninja = Ninja;
  • Deux syntaxes différentes mais, au final, le même résultat. Juste une question d'anesthésiques syntaxiques.

0

Au lieu de myFile.js, écrivez vos fichiers comme myFile.mjs. Cette extension est livrée avec tous les goodies d'es6, mais je veux dire que je vous recommande webpack et Babel

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.