본문으로 바로가기

프론트엔드 개발환경의 이해 : Webpack

category Frontend 2021. 3. 10. 14:02

웹팩이 필요한 이유

모듈

모듈 패턴

export/ import가 있기 전에는 어떻게 모듈을 사용했을까?

간단한 예시를 보자

인자 두 개를 받아서 더한 값을 반환하는 sum 함수를 가지고 있는 math 모듈

math 모듈을 받아서 사용하는 app.js

그리고 index.html로 이루어져있다

// math.js

function sum(a,b){
    return a+b;
}
// app.js
console.log(sum(1,2));

export/import에 익숙해진 나는 이게 어떻게 돌아가는지 이해가 되질 않았다

app에서 import하질 않았는데 어떻게 sum을 쓸 수 있지?

답은 html에 있었다

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

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

자바스크립트를 차례로 로드하면서 전역 객체 window에 sum이 할당된 것

그래서 app에서 window에 할당된 sum을 사용할 수 있는 것이었다

이 때 순서가 바뀌면 당연하게도 window에 sum이 할당되기 전에 sum을 불러오기 때문에 사용할 수 없다

전역 객체에 할당되는 것은 매우 좋지 않다 여러 모듈을 사용하면서 이름이 중복되어 예기치 못한 에러가 날 수도 있기 때문

그래서 주로 사용한 것이 네임스페이스 패턴과 IIFE를 활용한 모듈 패턴이다

var math = math || {};

(function (){
    function sum(a,b){
        return a+b;
    }
    math.sum =sum;
})();
console.log(math.sum(1,2));

이런 식의 패턴을 사용해주게 되면 전역 객체에 할당된 변수들이 오염될 걱정 없이 사용할 수 있다

모듈

이제 정식으로 지원하는 우리가 흔히 접할 수 있는 모듈을 보자

export function sum(a,b){
    return a+b;
}
import {sum} from './math.js';

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

html에서 모듈을 불러올 때는 이 js가 모듈을 사용한다는 것을 명시해야한다

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<script type="module" src="src/app.js"></script>
</body>
</html>

하지만 이러한 모듈 시스템을 모든 브라우저가 지원하지 않는다

그렇기 때문에 웹팩의 도움을 받아야한다

'Frontend' 카테고리의 다른 글

주요 로더와 순서  (0) 2021.03.16
프론트엔드 개발환경의 이해 : Webpack (2)  (0) 2021.03.14
프론트엔드 개발환경의 이해 : NPM  (0) 2021.03.09
MVC 패턴  (0) 2021.03.06
유효성 검사는 백에서? 프론트에서?  (2) 2021.02.28