[javascript] Node.js에있는 다른 파일의 JavaScript 클래스 정의 포함

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클래스 정의를 다른 자바 스크립트 파일 로 이동 하고 어떻게 든 “포함”할 수 있습니까?



답변

간단하게 다음과 같이 할 수 있습니다.

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부터 CommonJS와 함께 ES 모듈을 사용할 수 있습니다. 자세한 내용은 ESM 설명서를 참조하십시오 .

다음은 ESM으로 구현 된 동일한 동작의 예입니다.

package.json

{
  "type": "module"
}

user.js

export default class User {}

server.js

import User from './user.js'

let user = new User()

노트

⚠️ 전역을 사용하지 마십시오. 향후 코드와 충돌 할 가능성이 있습니다.


답변

ES6를 사용하면 다음을 가질 수 있습니다 user.js.

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

그리고 그것을에서 사용하십시오 server.js

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


답변

다음과 같이 클래스 정의를 수정하십시오.

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

그런 다음 파일 이름을 user.js. 기본 스크립트의 루트 디렉토리에 있다고 가정하면 다음과 같이 포함 할 수 있습니다.

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

그것은 빠르고 더러운 버전입니다. 에 대해 읽어 CommonJS 모듈 좀 더 알아 보려면.


답변

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


답변

이것을 다음에 추가하면 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');


답변

여기서는 대부분의 답변이 작동하지 않는다는 점을 지적하고 싶습니다. “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는 클래스 선언과 같은 줄에 있고 코드를 약간 정리하기 때문입니다. 다른 방법은 다음과 같습니다.
//  Ninja Framework File


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


module.exports.Ninja = Ninja;
  • 두 가지 다른 구문이지만 결국 동일한 결과입니다. 구문 마취의 문제입니다.

답변

myFile.js 대신 myFile.mjs와 같은 파일을 작성하십시오. 이 확장은 es6의 모든 장점과 함께 제공되지만 webpack과 Babel에게 추천합니다.