137 votes

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

J'écris un serveur simple pour Node.js et j'utilise ma propre classe appelée User ce qui 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));
    }
};

et 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 mon User dans un autre fichier javascript et l'"inclure" d'une manière ou d'une autre ?

245voto

Pasha Rumkin Points 1020

Vous pouvez simplement faire cela :

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 CommonJS module.

Exportation de valeurs multiples

Il peut parfois être utile d'exporter plus d'une valeur. Par exemple, il peut s'agir de classes, de fonctions ou de constantes. Il s'agit d'une version alternative de la même fonctionnalité :

user.js

class User {}

exports.User = User //  Spot the difference

server.js

const {User} = require('./user.js') //  Destructure on import

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

Modules ES

Depuis la version 14 de Node.js, il est possible d'utiliser les modules ES avec CommonJS. Pour en savoir plus, consultez le Documentation ESM .

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

0 votes

Et si l'utilisateur avait des paramètres d'entrée, comme module.exports = function User(data). Alors le var user = new User() ; aurait été changé en var user = new User(data); ?

0 votes

Oui. User est la fonction habituelle de js.

2 votes

Vous n'avez pas besoin de créer la constante User dans server.js. Changez la dernière ligne de users.js en module.exports = new User(); Cela créera une nouvelle instance de User chaque fois que le module sera requis. Ensuite, vous pouvez simplement demander le module pour chaque variable comme ceci : let user = require('./user.js'); .

16voto

yedidyak Points 342

En utilisant ES6, vous pouvez avoir user.js :

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

Et ensuite l'utiliser dans server.js

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

0 votes

Je reçois un SyntaxError: Unexpected token export quand je fais comme vous l'avez décrit... j'ai la version du noeud. v10.16.3

6voto

sevenflow Points 357

Modifiez votre définition de classe pour qu'elle se lise comme suit :

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

Ensuite, 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. Lire la suite Modules CommonJS si vous souhaitez en savoir plus.

2 votes

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

5voto

Gaurav Rawat Points 611

Un autre moyen en plus de ceux fournis 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 les mêmes que

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

2voto

pimvdb Points 66332

Si vous ajoutez ceci à user.js :

exports.User = User;

alors dans server.js vous pouvez faire :

var userFile = require('./user.js');
var User = userFile.User;

http://nodejs.org/docs/v0.4.10/api/globals.html#require

Un autre moyen est :

global.User = User;

alors cela serait suffisant dans server.js :

require('./user.js');

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X