Node.js'deki başka bir dosyadan JavaScript sınıf tanımını dahil etme


115

Node.js için basit bir sunucu yazıyorum ve Useraşağıdaki gibi görünen kendi sınıfımı kullanıyorum :

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

ve daha sonra süreçte bunu çok fazla örneklendiriyorum:

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

UserSınıf tanımımı başka bir javascript dosyasına taşıyıp bir şekilde "dahil edebilir miyim "?

Yanıtlar:


202

Bunu basitçe yapabilirsiniz:

user.js

class User {
    //...
}

module.exports = User

server.js

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

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

Buna CommonJS modülü denir .

Birden çok değeri dışa aktar

Bazen birden fazla değeri dışa aktarmak faydalı olabilir. Örneğin, sınıflar, işlevler veya sabitler olabilir:

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 Modülleri

Node.js sürüm 14'ten beri ES Modüllerini CommonJS ile kullanmak mümkündür. ESM belgelerinde bunun hakkında daha fazlasını okuyun .

İşte ESM ile uygulanan aynı davranışın bir örneğidir:

package.json

{
  "type": "module"
}

user.js

export default class User {}

server.js

import User from './user.js'

let user = new User()

Not

⚠️ Küresel kullanmayın, gelecekteki kodla potansiyel çatışmalar yaratır.


ne olursa olsun, Kullanıcının module.exports = function User (data) gibi bazı girdi parametreleri vardı. Daha sonra var user = new User (); var user = new User (data) ;?
C grafikleri

Evet. Userolağan js işlevidir.
Paul Rumkin

2
Server.js'de sabit Kullanıcı oluşturmanız gerekmez. Users.js'nin son satırını şu şekilde değiştirin module.exports = new User();Bu, modül her gerektiğinde yeni bir Kullanıcı örneği oluşturacaktır. O zaman sadece böyle her bir değişken için modül gerektirebilir: let user = require('./user.js');.
Nadav

1
@Barnack Birkaç cevabım var. Hangisi yanlış ve hangisi doğru?
Paul Rumkin

1
@pashaRumkin Nesneyi yerel olarak örnekleyin, ancak TypeError aldım: <ClassName> yapıcı değil
Md Alamin

13

ES6 kullanarak şunlara sahip olabilirsiniz user.js:

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

Ve sonra kullan server.js

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

i bir olsun SyntaxError: Unexpected token exportbenim yaptığım zaman anlatıldığı gibi ... ben düğüm sürümüne sahipv10.16.3
Thomas

6

Sınıf tanımınızı şu şekilde okuyacak şekilde değiştirin:

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

Ardından dosyayı olarak yeniden adlandırın user.js. Ana betiğinizin kök dizininde olduğunu varsayarsak, şu şekilde ekleyebilirsiniz:

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

Bu hızlı ve kirli versiyon. Daha fazla bilgi edinmek istiyorsanız, CommonJS Modülleri hakkında okuyun .


2
Sokete ne oldu? var someUser = new user.User (soket) olmalı;
C grafikleri

5

ES6 için burada sağlananlara ek olarak başka bir yol

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

}

ve aynısını içerir

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


1

Buradaki yanıtların çoğunun işe yaramadığını belirtmek isterim, zaman içinde "module.exports.yourClass" yöntemi değiştiyse veya insanlar yanlış yanıtı girdiyse NodeJS ve IDK'da yeniyim.

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

  • Şu anda kullandığım yöntem bu. Bu sözdizimini seviyorum, çünkü module.exports, sınıf bildirimi ile aynı satırda duruyor ve bu da kodu biraz imo temizliyor. Bunu yapmanın diğer yolu şudur:
//  Ninja Framework File


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


module.exports.Ninja = Ninja;

  • İki farklı sözdizimi ama sonuçta aynı sonuç. Sadece bir sözdizimi uyuşmazlığı meselesi.

0

MyFile.js yerine dosyalarınızı myFile.mjs gibi yazın. Bu uzantı es6'nın tüm güzellikleriyle birlikte gelir, ancak sizi webpack ve Babel'e tavsiye ediyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.