ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 웹팩이 필요한 이유와 기본 동작 - 웹팩(Webpack) 기본편 | 김정환
    Front-end/개발환경 2020. 3. 19. 20:24
    반응형

    [출처 : https://www.inflearn.com]

    1. 배경

    문법 수준에서 모듈을 지원하기 시작한 것은 ES2015부터이다. import/export 구문이 없었던 모듈 이전 상황을 살펴보는 것이 웹팩 등장 배경을 설명하는 데 수월하다.

     

    math.js :

    function sum(a, b){
      return a+b
    }

    app.js :

    console.log(sum(1,2));

    index.html : 

    <script src="/math.js"></script>
    <script src="/app.js"></script>

    => index.html을 실행하면 console 창에 3이 찍힌다.

     

    위와 같이 하면 전역 스코프가 오염되는 문제가 있다. math.js의 sum 함수는 어플리케이션이 돌아가는 어느 곳에서나 sum 함수에 접근할 수 있게 된다.

    예를 들어 자바스크립트는 함수에도 할당할 수 있기에 전역 스코프가 오염되면 어플리케이션은 예측할 수 없게 되고 결국 런타임 에러가 발생한다.

     

    1-1. IIFE 방식의 모듈

    # IIFE(즉시 실행 함수 표현)은 정의되자마자 즉시 실행되는 자바스크립트 함수를 말한다.

    (function(){
      ...
    })();

    정의하자마자 실행하게 되면 함수 안에 독립적인 스코프가 생성되고, 그 안에서 정의했던 이름들은 함수 외부에서 접근할 수 없기에 전역 스코프가 오염되는 문제를 예방하게 된다.

     

    math.js :

    var math = math || {};
    
    (function(){
      function sum(a, b){
        return a + b;
      }
      math.sum = sum;
    })();

    app.js : 

    console.log(math.sum(1,2));

    1-2. 다양한 모듈 스펙

    # CommonJS는 자바스크립트를 사용하는 모든 환경에서 모듈을 하는 것이 목표다. exports 키워드로 모듈을 만들고 require() 함수로 불러 들이는 방식이다. 대표적으로 서버 사이드 플래폼인 Nodejs에서 이를 사용한다.

     

    math.js :

    exports function sum(a, b) { return a+b;}

    app.js : 

    const sum = require('./math.js');
    sum(1, 2);  // 3

    # AMD(Asynchronous Module Definition)는 비동기로 로딩되는 환경에서 모듈을 사용하는 것이 목표다. 주로 브라우져 환경이다.

     

    # UMD(Universal Module Definition)는 AMD 기반으로 CommonJS 방식까지 지원하는 통합 형태다.

     

    # 바벨이나 웹팩을 이용해서 ES2015 모듈 시스템을 사용하는 것이 일반적이다.

     

    math.js :

    exports function sum(a, b) { return a+b;}

    app.js : 

    import * as math from './math.js';  // 방식 1. 모든 exports를 math라는 객체로 가져온다.
    import {sum} from './math.js';  // 방식 1. sum 함수만 math라는 객체로 가져온다.
    
    math.sum(1, 2);  // 3

     

    # app.js 는 math.js를 가져오기 때문에 의존관계가 있다.

     

    1-3. 브라우져의 모듈 지원

    IE를 포함한 몇 몇 브라우져에서는 여전히 모듈을 사용하지 못한다.

    크롬(버전 61부터 모듈 시스템을 지원한다.) 브라우져에서 모듈 사용은 다음과 같다.

     

    index.html :

    <script type="module" src="/app.js"></script>  // app.js가 모듈 시스템을 사용한다

    브라우져에 무관하게 모듈을 사용하고 싶을 때, 웹팩이 필요하다.

    반응형

    댓글

Luster Sun