require가있는 Node.js ES6 클래스


103

그래서 지금까지 node.js다음과 같은 방식으로 클래스와 모듈을 만들었습니다 .

    var fs = require('fs');

var animalModule = (function () {
    /**
     * Constructor initialize object
     * @constructor
     */
    var Animal = function (name) {
        this.name = name;
    };

    Animal.prototype.print = function () {
        console.log('Name is :'+ this.name);
    };

    return {
        Animal: Animal
    }
}());

module.exports = animalModule;

이제 ES6를 사용하여 다음과 같이 "실제"수업을 만들 수 있습니다.

class Animal{

 constructor(name){
    this.name = name ;
 }

 print(){
    console.log('Name is :'+ this.name);
 }
}

자, 우선, 나는 이것을 좋아합니다 :) 그러나 그것은 질문을 제기합니다. 이것을 node.js의 모듈 구조 와 결합하여 어떻게 사용 합니까?

데모를 위해 모듈을 사용하려는 클래스가 있다고 가정 해 보겠습니다. fs

따라서 파일을 만듭니다.


Animal.js

var fs = require('fs');
class Animal{

 constructor(name){
    this.name = name ;
 }

 print(){
    console.log('Name is :'+ this.name);
 }
}

이것이 올바른 방법일까요?

또한이 클래스를 내 노드 프로젝트 내의 다른 파일에 어떻게 노출합니까? 이 클래스를 별도의 파일에서 사용하는 경우에도이 클래스를 확장 할 수 있습니까?

여러분 중 일부가이 질문에 답할 수 있기를 바랍니다. :)


3
ES5 방식으로 생성자 이름을 처리 한 것과 동일하게 ES6 클래스 이름을 처리하십시오. 그들은 하나이고 동일합니다. ES6 구문은 단지 구문 적 설탕이며 정확히 동일한 기본 프로토 타입, 생성자 함수 및 객체를 생성합니다.
jfriend00

당신을 만드는 IIFE는 animalModule어쨌든 자체 모듈 범위를 가진 노드 모듈에서 꽤 무의미합니다.
Bergi

답변:


156

예, 귀하의 예는 잘 작동합니다.

클래스 노출에 관해서는 export다른 클래스와 마찬가지로 클래스를 사용할 수 있습니다.

class Animal {...}
module.exports = Animal;

또는 더 짧습니다.

module.exports = class Animal {

};

다른 모듈로 가져 오면 해당 파일에 정의 된 것처럼 처리 할 수 ​​있습니다.

var Animal = require('./Animal');

class Cat extends Animal {
    ...
}

8
module.exports = class Animal {}
Paul

그것은 사실입니다. 저는 당신이 할당하는 동안 이름을 지을 수 있다는 것을 계속 잊었습니다.
rossipedia

코드 스타일과 명확성이 중요합니다. module.exports일반적으로 익명 내보내기에 export사용되는 반면 명명 된 내보내기에 사용됩니다. 이것은 클래스, 모듈 등을 가져 오는 방법을 다른 사람들이 아는 데 도움이 될 수있는 기본적인 코딩 예의입니다.
greg.arnott 2017-09-05

7
module.exports = Animal;질문에 대한 답변 또는 가장 직접적인 동등 물 const Animal = require('./animal');이며 호출 코드 와 함께 유효 합니다. 답변을 업데이트하여 포함 할 수 있습니까?
일요일

1
고마워 친구, 나는 2 시간 동안 클래스 가져 오기가 올바르게 작동하도록 싸우고 있습니다.
kiwicomb123

11

ES5 방식으로 생성자 이름을 처리 한 것과 동일하게 ES6 클래스 이름을 처리하십시오. 그들은 하나이고 동일합니다.

ES6 구문은 단지 구문 적 설탕이며 정확히 동일한 기본 프로토 타입, 생성자 함수 및 객체를 생성합니다.

따라서 ES6 예제에서 다음을 사용하십시오.

// animal.js
class Animal {
    ...
}

var a = new Animal();

module.exports = {Animal: Animal};

Animal객체의 생성자처럼 취급 할 수 있습니다 (ES5에서했던 것과 동일). 생성자를 내보낼 수 있습니다. 를 사용하여 생성자를 호출 할 수 있습니다 new Animal(). 그것을 사용하는 모든 것이 동일합니다. 선언 구문 만 다릅니다. Animal.prototype당신의 모든 방법이 아직까지 있습니다 . ES6 방식은 실제로 더 멋지고 더 좋은 구문으로 동일한 코딩 결과를 생성합니다.


가져 오기 측에서는 다음과 같이 사용됩니다.

const Animal = require('./animal.js').Animal;

let a = new Animal();

이 체계는 Animal 생성자를 .Animal 를 해당 모듈에서 둘 이상의 것을 내보낼 수 속성으로 내 보냅니다.

둘 이상의 항목을 내보낼 필요가없는 경우 다음을 수행 할 수 있습니다.

// animal.js
class Animal {
    ...
}

module.exports = Animal;

그리고 다음을 사용하여 가져옵니다.

const Animal = require('./animal.js');

let a = new Animal();

나는 이유를 모르지만 이것은 나를 위해 작동하지 않았습니다. module.exports = Animal작동하는 유일한 솔루션입니다.
Sam

1
@Sam-내 내보내기에 표시되는 내용은 내 보낸 내용이 표시하는 내용과 달라야 require()하므로 하나는 작동하고 다른 하나는 작동하지 않습니다. 가져 오기가 작동하는 방식과 내보내기가 정의 된 방식을 일치시켜야합니다. 이것을 설명하는 자세한 내용이 내 대답에 추가되었습니다.
jfriend00

6

ES6의 require 방법은 import. export클래스를 import { ClassName } from 'path/to/ClassName'구문을 사용하여 다른 곳으로 가져올 수 있습니다 .

import fs from 'fs';
export default class Animal {

  constructor(name){
    this.name = name ;
  }

  print(){
    console.log('Name is :'+ this.name);
  }
}

import Animal from 'path/to/Animal.js';

4
이것이 선택 사항이지만 필수 사항은 아니라는 점을 명확히하는 것이 좋습니다. 이것은 ES6 모듈 구문이지만 Node의 일반 CommonJS 내보내기와 함께 ES6 클래스를 계속 사용할 수 있습니다. ES6 내보내기 구문을 클래스와 함께 사용할 필요는 없습니다. 그것을 부르는 The ES6 way것은 다소 오해의 소지가 있습니다.
loganfsmyth

2
그것은 사실입니다. 그것은 개인적인 선호입니다. 개인적 으로 구문 일관성을 위해 importover를 사용 require합니다.
Fan Jin

2
예, 그것은 견고한 접근 방식이며 나도 그렇게합니다 import.Babel이 CommonJS 모듈과 상호 운용 되는 방식 은 Node에서 작동하지 않을 가능성이 높으므로 Babel이없는 Node와 호환되도록 향후 코드 변경이 필요할 수 있습니다. .
loganfsmyth

4
ES6 모듈 (가져 오기 및 내보내기)은 Node 10에서 아직 실험적이며 노드를 시작할 때
켜야

@dorking의 요점에 추가합니다. Node 10.15.3은 LTS (장기 지원) 버전이며 2020 년 4 월까지 제공됩니다. 추가 세부 정보 : nodejs.org/en/about/releases
gtzilla

1

노드에서 클래스 사용-

여기서는 ReadWrite 모듈이 필요하고 ReadWrite 클래스의 객체를 반환하는 makeObject ()를 호출합니다. 메서드를 호출하는 데 사용하고 있습니다. index.js

const ReadWrite = require('./ReadWrite').makeObject();
const express = require('express');
const app = express();

class Start {
  constructor() {
    const server = app.listen(8081),
     host = server.address().address,
     port = server.address().port
    console.log("Example app listening at http://%s:%s", host, port);
    console.log('Running');

  }

  async route(req, res, next) {
    const result = await ReadWrite.readWrite();
    res.send(result);
  }
}

const obj1 = new Start();
app.get('/', obj1.route);
module.exports = Start;

ReadWrite.js

여기에서는 객체를 사용할 수없는 경우에만 객체가 반환되도록하는 makeObject 메서드를 만듭니다.

class ReadWrite {
    constructor() {
        console.log('Read Write'); 
        this.x;   
    }
    static makeObject() {        
        if (!this.x) {
            this.x = new ReadWrite();
        }
        return this.x;
    }
    read(){
    return "read"
    }

    write(){
        return "write"
    }


    async readWrite() {
        try {
            const obj = ReadWrite.makeObject();
            const result = await Promise.all([ obj.read(), obj.write()])
            console.log(result);
            check();
            return result
        }
        catch(err) {
            console.log(err);

        }
    }
}
module.exports = ReadWrite;

자세한 설명은 https://medium.com/@nynptel/node-js-boiler-plate-code-using-singleton-classes-5b479e513f74 로 이동 하십시오.


0

클래스 파일에서 다음 중 하나를 사용할 수 있습니다.

module.exports = class ClassNameHere {
 print() {
  console.log('In print function');
 }
}

또는이 구문을 사용할 수 있습니다.

class ClassNameHere{
 print(){
  console.log('In print function');
 }
}

module.exports = ClassNameHere;

반면에 다른 파일에서이 클래스를 사용하려면이 단계를 수행해야합니다. 먼저 다음 구문을 사용하여 해당 파일을 요구합니다. const anyVariableNameHere = require('filePathHere');

그런 다음 개체를 만듭니다. const classObject = new anyVariableNameHere();

그런 다음 classObject실제 클래스 변수에 액세스하는 데 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.