Node.jsの別のファイルからJavaScriptクラス定義を含める


115

私はNode.js用の単純なサーバーを作成しており、User次のような独自のクラスを使用しています。

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

そして、後でプロセスの多くでそれをインスタンス化しています:

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

Userクラス定義を別のjavascriptファイルに移動して、どうにかして「含める」ことができますか?

回答:


202

あなたは単にこれを行うことができます:

user.js

class User {
    //...
}

module.exports = User

server.js

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

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

これはCommonJSモジュールと呼ばれます。

複数の値をエクスポートする

複数の値をエクスポートすると便利な場合があります。たとえば、クラス、関数、定数などです。

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モジュール

Node.jsバージョン14以降、ESモジュールをCommonJSで使用することができます。詳細については、ESMのドキュメントをご覧ください。

以下は、ESMで実装された同じ動作の例です。

package.json

{
  "type": "module"
}

user.js

export default class User {}

server.js

import User from './user.js'

let user = new User()

注意

⚠️グローバルを使用しないでください。将来のコードと競合する可能性があります。


仮に、userにmodule.exports = function User(data)のようないくつかの入力パラメーターがあったとします。次に、var user = new User(); 誰がvar user = new User(data);に変更されているでしょうか?
Cグラフィックス

はい。User通常のjs関数です。
Paul Rumkin、2014年

2
server.jsで定数Userを作成する必要はありません。users.jsの最後の行を次のように変更しmodule.exports = new User();ます。モジュールが必要になるたびに、Userの新しいインスタンスが作成されます。次に、次のように各変数のモジュールを単純に要求できますlet user = require('./user.js');
Nadav 2017

1
@Barnack私の答えはいくつかあります。どちらが間違っていますか、どちらが正しいですか?
ポールラムキン

1
@pashaRumkinオブジェクトをローカルでインスタンス化しますが、TypeErrorが発生しました:<ClassName>はコンストラクタではありません
Md Alamin

13

ES6を使用すると、次のことが可能になりますuser.js

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

そしてそれを server.js

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

私はSyntaxError: Unexpected token exportあなたが説明したように私がするときを得ます...私はノードバージョンを持っていますv10.16.3
トーマス

6

次のように読み取るようにクラス定義を変更します。

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

次に、ファイルの名前をに変更しますuser.js。メインスクリプトのルートディレクトリにあると想定すると、次のように含めることができます。

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

それは、速くて汚いバージョンです。詳細については、CommonJS Modulesをお読みください。


2
ソケットはどうなりましたか?var someUser = new user.User(socket);である必要があります。
Cグラフィックス

5

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

}

と同じものを含める

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

1

これを次のように追加するとuser.js

exports.User = User;

それからserver.jsあなたはすることができます:

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

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

別の方法は:

global.User = User;

次にこれで十分でしょうserver.js

require('./user.js');

1

ここでほとんどの回答が機能しないことを指摘したいのですが、 "module.exports.yourClass"メソッドが変更された場合、または人々が間違った回答を入力しただけの場合は、NodeJSとIDKを初めて使用します。

// 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();
  • これは私が現在使用している方法です。私はこの構文が好きです。module.exportsはクラス宣言と同じ行にあり、コードを少し掃除します。もう1つの方法は次のとおりです。
//  Ninja Framework File


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


module.exports.Ninja = Ninja;
  • 2つの異なる構文ですが、最終的には同じ結果になります。構文麻酔の問題です。

0

myFile.jsの代わりに、myFile.mjsのようにファイルを記述します。この拡張機能にはes6のすべての優れた機能が含まれていますが、webpackとBabelをお勧めします

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.