Termasuk definisi kelas JavaScript dari file lain di Node.js

115

Saya sedang menulis server sederhana untuk Node.js dan saya menggunakan kelas saya sendiri yang disebut Useryang terlihat seperti:

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

dan kemudian dalam prosesnya, saya sering memberi contoh:

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

Dapatkah saya memindahkan Userdefinisi kelas saya ke file javascript lain dan "menyertakan" entah bagaimana?

martin
sumber

Jawaban:

202

Anda cukup melakukan ini:

user.js

class User {
    //...
}

module.exports = User

server.js

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

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

Ini disebut modul CommonJS .

Ekspor banyak nilai

Terkadang bisa bermanfaat untuk mengekspor lebih dari satu nilai. Misalnya bisa berupa kelas, fungsi atau konstanta:

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

Modul ES

Sejak Node.js versi 14 dimungkinkan untuk menggunakan Modul ES dengan CommonJS. Baca lebih lanjut tentang itu di dokumentasi ESM .

Ini adalah contoh perilaku yang sama yang diterapkan dengan ESM:

package.json

{
  "type": "module"
}

user.js

export default class User {}

server.js

import User from './user.js'

let user = new User()

Catatan

⚠️ Jangan gunakan global, ini menciptakan potensi konflik dengan kode masa depan.

Paul Rumkin
sumber
bagaimana jika, Pengguna memiliki beberapa parameter input, seperti module.exports = function User (data). Kemudian var user = new User (); apa yang telah diubah menjadi var user = new User (data) ;?
Grafik C
Iya. Useradalah fungsi js biasa.
Paul Rumkin
2
Anda tidak perlu membuat Pengguna konstan di server.js. Ubah baris terakhir users.js menjadi module.exports = new User();Ini akan membuat instance Pengguna baru setiap kali modul diperlukan. Maka Anda hanya dapat memerlukan modul untuk setiap variabel seperti ini: let user = require('./user.js');.
Nadav
1
@Barnack Ada beberapa jawaban saya. Mana yang salah dan mana yang benar?
Paul Rumkin
1
@pashaRumkin Instantiate objek secara lokal, tetapi saya mendapat TypeError: <ClassName> bukan konstruktor
Md Alamin
13

Menggunakan ES6, Anda dapat memiliki user.js:

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

Dan kemudian gunakan di server.js

const User = require('./user.js').default;
const user = new User();
yedidyak
sumber
saya mendapatkan SyntaxError: Unexpected token exportketika saya melakukan seperti yang Anda jelaskan ... saya memiliki versi nodev10.16.3
thomas
6

Ubah definisi kelas Anda menjadi seperti ini:

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

Kemudian ganti nama file menjadi user.js. Dengan asumsi itu ada di direktori root dari skrip utama Anda, Anda dapat memasukkannya seperti ini:

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

Itu versi cepat dan kotor. Baca tentang Modul CommonJS jika Anda ingin mempelajari lebih lanjut.

sevenflow
sumber
2
Apa yang terjadi dengan soket? haruskah itu var someUser = new user.User (socket);
Grafik C
5

Cara lain selain yang disediakan di sini untuk 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;
    }    

}

dan menyertakan sama seperti

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

Jika Anda menambahkan ini ke user.js:

exports.User = User;

maka di dalam server.jskamu bisa melakukan:

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

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

Cara lainnya adalah:

global.User = User;

maka ini akan cukup di server.js:

require('./user.js');
pimvdb.dll
sumber
1

Saya hanya ingin menunjukkan bahwa sebagian besar jawaban di sini tidak berfungsi, saya baru mengenal NodeJS dan IDK jika sepanjang waktu metode "module.exports.yourClass" berubah, atau jika orang memasukkan jawaban yang salah.

// 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();
  • Ini adalah metode yang saya gunakan saat ini. Saya suka sintaks ini, karena module.exports berada di baris yang sama dengan deklarasi kelas dan yang membersihkan kode sedikit imo. Cara lain Anda dapat melakukannya adalah seperti ini:
//  Ninja Framework File


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


module.exports.Ninja = Ninja;
  • Dua sintaks berbeda tetapi, pada akhirnya, hasilnya sama. Hanya soal sintaksis anestesi.
Aft3rL1f3
sumber
0

Alih-alih myFile.js tulis file Anda seperti myFile.mjs. Ekstensi ini hadir dengan semua kebaikan es6, tapi maksud saya saya merekomendasikan Anda kepada Anda webpack dan Babel

Ernesto
sumber