ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2020/11/16 - TIL(Common JS - require/exports)
    Develop/Node.js 2020. 11. 16. 20:47

     

     

     

     

    Common Js란

    CommonJS는 2009년에 만들어진 표준으로, 자바스크립트를 모듈화 하기 위한 일종의 규칙힙니다.

    Node.js는 모듈 시스템의 표준인 CommonJS를 채택하였고 기본적으로 CommonJS방식을 따르고 있습니다.

     

     

    Node.js  Module

    Node.js는 module 단위로 각 기능을 분할할 수 있습니다. module은 파일과 1대 1의 대응 관계를 가지며 하나의 module은 자신만의 독립적인 실행 영역(Scope)을 가지게 됩니다.

    module은 module.exports 또는 export 객체를 통하여 정의하고 외부로 공개합니다. 그리고 공개된 module은 require함수를 통해 임포트 합니다.

     

     

     

    exports

    모듈 안에 선언한 항목을 외부에 공개하여 다른 모듈들이 사용할 수 있게 하기 위하여 exports객체를 사용합니다.

    //circle.js
    const {PI} = Math;
    
    exports.area = (r) => PI * r * r;
    
    exports.circumference = (r) => 2 * PI * r;

     

    circle.js는 독립적인 파일 스코프를 갖는 모듈입니다. circle모듈에서 area와 circumference를 exports객체의 메소드로 정의하였습니다. 변수 PI는 모듈에서만 유효한 private변수가 되고, area와 circumference 메소드는 외부에 공개됩니다.

     

     

    // app.js
    const circle = require('./circle.js'); // == require('./circle')
    
    console.log(`지름이 4인 원의 면적: ${circle.area(4)}`); //지름이 4인 원의 면적: 50.26548245743669
    console.log(`지름이 4인 원의 둘레: ${circle.circumference(4)}`); //지름이 4인 원의 둘레: 25.132741228718345

    require 함수를 사용하여 circle모듈을 import 할 수 있습니다.

    위의 코드에서 circle모듈은 객체로 변환되어 circle.area, circle.circumference와 같은 형식으로 공개된 circle모듈을 참조합니다.

     

     

     

    module.exports

    exports객체는 프로퍼티 또는 메소드를 여러 개 정의할 수 있었지만, module.exports는 하나의 값(원시 타입, 함수, 객체)만 할당할 수 있습니다.

     

    //circle.js
    const {PI} = Math;
    
    module.exports = function(r){
      return {
        area() {return PI * r * r}
        circumference() {return 2 * PI * r}
      }
    };

     

    // app.js
    const circle = require('./circle.js');
    const myCircle = circle(4);
    
    console.log(`지름이 4인 원의 면적: ${myCircle.area(4)}`); //지름이 4인 원의 면적: 50.26548245743669
    console.log(`지름이 4인 원의 둘레: ${myCircle.circumference(4)}`); //지름이 4인 원의 둘레: 25.132741228718345

    require 함수를 통해 circle 모듈을 임포트 하여 circle변수에 할당하였습니다. 이때 circle변수는 circle모듈에서 module.exports에 할당한 객체를 반환하는 함수입니다.

     

     

     

     

    exports와 module.exports의 차이

     

    export

    • 모듈 정의 방식
      exports객체는 값을 할당할 수 없고 공개할 대상을 exports객체에 프로퍼티 또는 메소드로 추가한다.
    • require 함수의 호출 결과
      exports 객체에 추가한 프로퍼티와 메소드가 담긴 객체가 전달된다.

     

    module.exports

    • 모듈 정의 방식
      module.exports 객체에 하나의 값만을 할당한다.
    • require 함수의 호출 결과
      module.exports 객체에 할당한 값이 전달된다.

     

     

Designed by Tistory.