-
웹팩이 필요한 이유와 기본 동작 - 웹팩(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가 모듈 시스템을 사용한다
브라우져에 무관하게 모듈을 사용하고 싶을 때, 웹팩이 필요하다.
반응형'Front-end > 개발환경' 카테고리의 다른 글
로더 - 웹팩(Webpack) 기본편 | 김정환 (0) 2020.06.04 엔트리/아웃풋 - 웹팩(Webpack) 기본편 | 김정환 (0) 2020.06.02 Node.js에서 Firebase 사용하기 | KOSMO (0) 2020.03.11 프로젝트 생성 -NPM | 김정환 (0) 2020.03.10 Node.js 프로그래밍 | KOSMO (0) 2020.03.04