JS

webpack (1)

728x90

webpack 에 대해서 여태까지 어설프게만 알고 있었는데

이참에 한번 제대로 싹 정리를 해보고

개념도 확실하게 익힐겸 포스팅을 작성하게 되었다.

 

 

 

* Module

JS 를 사용해서 개발을 하다보면 module 이란 용어를 듣게 된다.

JS 에서 module 이란 각각의 개별 파일을 말하는 것이다.

 

module 단위로 JS 를 관리하다 보면, 생기는 문제 중 하나가 

JS 파일에 정의된 변수명이 겹칠 수 있다는 것이다.

 

이런 문제를 해결하기 위해 등장한것이 

ES6 이후 등장한 import, export 구문이다.

 

* Bundle

bundle 은 영어로 묶는다는 뜻이다. 

webpack 의 정의를 보면, 

"webpack is a static module bundler for modern JavaScript applications" 라고 되어 있다.

 

웹의 개발 규모가 커지면 자연스레 작성하고 관리해야할 파일이 많아지는데,

이런 파일들을 일일이 다 받아오면, 받아오는 사용자 입장에서는 페이지 로딩 시간이 길어지고,

서버 입장에서는, 전송해줘야할 파일이 많아져서 서버 성능에도 영향을 줄 수 있다.

 

그래서 webpack 은 이런 다수의 파일들을 하나로 묶는(bundle) 역할을 하는 bundler 역할을 담당한다.

 

 

* Webpack Core Concepts

 

Webpack 을 이해하려면 몇가지 핵심 개념을 익히고 가야한다.

 

-1) Entry

Webpack 은 앞서 언급했듯 module bundler 라 하였는데, 각각의 module 을 묶어서 번들링할때, 의존성 그래프 라는 것을 만든다. 이 의존성 그래프의 시작점이 바로 Entry 이다.

가장 기본적인 Entry 설정 방식은 아래 같은 형식으로 작성한다

 

- webpack.config.js

module.exports = {
    Entry: {
        main: "./src/main.js"
    }
}
cs

이렇게 작성하면 앞으로 이 웹팩을 사용하는 프로젝트 내의 모든 js 파일의 시작점은

main.js 가 된다.

 

 

-2) Output

Output 은 단어에서 유추가능하듯, 웹팩 번들링에 대한 결과물이 위치할 곳을 지정하는 값이다.

아래와 같은 형식으로 코드를 작성하며, 

path 는 번들링의 결과물이 담길 파일을 지정하는 것이고,

filename 은 번들링의 결과물이될 파일의 이름을 지정한 것이다.

 

- webpack.config.js

module.exports = { 
  output: {
        path: "./dist",
        filename: "bundle.js",
  },
}
cs

 

 

 

이를 html 에서 불러오고자 한다면, 아래 같이 작성해야 한다.

<script src="./dist/bundle.js"></script>
cs

 

 

 

-3) loader

기본적으로 웹팩은 자바스크립트만 이해할 수 있다.

웹 리소스에 해당하는 다른 요소들 (이미지, 폰트, 스타일시트 등) 은 웹팩이 이해하지 못한다.

이 요소들을 이해시키기 위해서 필요한게 로더 이다.

로더를 설정할때는, test, use 라는 키값으로 구성된 객체를 선언해야 하며,

test 는 로드할 파일을 정규표현식으로 지정해야하며,

use 는 이 파일에 적용할 로더를 지정해야 한다.

 

대표적인 로더를 몇가지 살펴보면,

(1). babel-loader

: babel 은 ES6 코드를 ES5 로 바꾸는 패키지이다. 이 로더는 아래 같은 형식으로 작성이 가능하다.

 

- webpack.config.js

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: "babel-loader",
        },
      },
    ],
  },
}
cs

 

 

(2). css-loader, style-loader

: css 파일을 웹팩에게 이해시키기 위한 css-loader 와 css-loader 를 통해서 css 파일들을 번들링하여 만든 js 파일을 DOM 에 동적으로 할당하기 위한 로더가 style-loader 이다. DOM 에 할당되어야만 브라우저가 해석이 가능하다.

 

-webpack.config.js

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ["css-loader""style-loader"]
      },
    ],
  },
}
cs

 

 

-4) Plugin

플러그인은 이미 번들링된 결과물에 대해서 처리작업을 해주는 역할을 한다

특정 텍스트를 추출한다던가, 번들링 된 자바스크립트 파일을 난독화 한다던가 하는 용도로 쓴다.

 

대표적인 것 몇개만 보면,

(1). ExtractTextPlugin

: 이 플러그인은, 텍스트를 추출해서 파일로 만드는 플러그인이다.

이 플러그인은 보통, sass 파일, css 파일을 하나의 bundle.js 에 번들링해서 결과물을 내지 않고,

따로 style.css 파일로 만들기 위한 용도로 쓰였다.

프로젝트의 규모가 커지고, sass, css 파일이 매우 커지면 하나의 bundle.js 에 담는 것 보다 bundle.js, style.css 로 나눠서 하는게 나을 수 도 있기 때문이다.

그러나, 이 플러그인은 현재 deprecated 되고, mini-css-extract-plugin 이라는 이름으로 대체되었다.

(텍스트를 추출하는 큰 범위보다 css 로 축소해서 경량화 하려고 바뀐것 같다)

 

css 와 sass 를 사용하는 경우 아래 같은 코드로 작성할 수 있다.

 

- webpack.config.js

module.exports = {
  plugins: [new MiniCssExtractPlugin({ filename: "style.css" })],
  module: {
    rules: [
      {
        test: /\.(scss)$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
          },
          "css-loader",
          "sass-loader",
        ],
      },
    ],
  },
};
cs

 

 

 

다음 포스팅은 웹팩 개발 서버에 대해서 알아본다.

 

 

 

- Reference

https://ko.javascript.info/modules-intro

https://www.opentutorials.org/module/4566

https://jeonghwan-kim.github.io/series/2019/12/10/frontend-dev-env-webpack-basic.html

github.com/webpack-contrib/mini-css-extract-plugin

 

728x90

'JS' 카테고리의 다른 글

prisma 2 query 문제  (0) 2020.09.09
GraphQL Server 구성  (1) 2020.09.07
Prisma Migration 관련 오류  (0) 2020.09.03
Prisma 란?  (0) 2020.08.30
CSP (Content Security Policy) 란?  (0) 2020.08.30