본문 바로가기
프로그래밍 개발/프론트엔드 개발자 기본 지식

Webpack 웹팩

by Jinseok Kim 2022. 4. 12.
반응형

Webpack

 

  • 웹팩 공식문서에서는 웹팩을 자바스크립트 애플리케이션을 위한 정적 모듈 번들러라고 소개하고 있습니다. 여기서 번들러란 의존성이 있는 모듈들을 하나의 파일로 통합시켜주는 도구라고 말할 수 있습니다.

 

특징

 

  1. 한번에 많은 요청을 하지 않아도 됩니다.
  2. 예를 들어 한 웹페이지에서 사용하는 자바스크립트 파일이 10개정도 된다고 가정해본다면 웹 페이지가 로드될 때 자바스크립트 파일 10개롤 모두 네트워크를 통해 요청해서 받아와야 해서 네트워크 병목현상이 발생할 수 있습니다. (물론 10개의 파일 정도로 병목현상이 발생하지는 않고 단순한 예시이다.)
  3. 모듈 단위로 개발하여 유지보수성을 높일 수 있습니다.
  4. 하나의 파일에 모든 자바스크립트 코드가 있다고 할때 그 코드가 몇 천 라인, 몇 만 라인인지는 모르지만 우리가 수정해야 할 코드에 접근하는데 어려움을 느낄 수 있는데  번들러를 사용하면 우리도 이해하기 쉽도록 코드를 모듈 단위로 구분해 가독성과 유지보수성을 효율적으로 개선할 수 있습니다.

 

 

웹팩 설치

 

이제 웹팩을 설치해 바벨과 연결하고  바벨만 따로 사용할 수도 있지만 웹팩과 연결하면 바벨이 코드들을 트랜스파일링 하면서 웹팩을 통해 모듈들을 번들링할 수 있기 때문에 굉장히 효율적입니다.

 

다음과 같이 웹팩과 css나 이미지 등을 사용할 수 있게 도와주는 모듈들을 설치해줍니다.

$npm i -D webpack webpack-cli webpack-dev-server
$npm i -D babel-loader css-loader file-loader
$npm i -D html-webpack-plugin mini-css-extract-plugin
$npm i -D sass sass-loader


각 모듈은 다음과 같은 역할을 한다.

  • webpack: 웹팩 모듈
  • webpack-cli: 터미널에서 웹팩 명령어를 사용할 수 있게 도와줍니다.
  • webpack-dev-server: nodemon과 같이 웹팩 환경에서 개발서버를 생성
  • babel-loader: 웹팩과 바벨을 연동
  • css-loader: 웹팩이 css파일을 읽을 수 있도록 도와줌
  • file-loader: 웹팩이 파일을 로딩할 수 있도록 도와줌 (이미지를 로딩하는데 사용)
  • html-webpack-plugin: 번들링된 html파일에 css와 js파일들을 추가해줍니다.
  • mini-css-extract-plugin: style-loader를 대체하며 html내의 style태그 대신 별도의 css파일로 생성해줍니다.
  • sass-loader: 웹팩이 sass파일을 읽을 수 있도록 도와줍니다.

 

sass도 사용하기 위해 sass-loader를 추가했습니다. 이제 본격적인 웹팩 설정을 하면 됩니다.

 

 

 

 

웹팩 설정

 

public/index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>

웹팩에서 기준으로 사용할 html파일을 생성해줍니다.

 

 

 

src/index.js

const root = document.getElementById('root');
root.innerHTML = '웹팩 설정하기!';

웹팩에서 기준으로 사용할 js파일 또한 생성해줍니다.

 

 

 

webpack.config.js

const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

const prod = process.env.NODE_ENV === 'production';

module.exports = {
  // 모드에 따라 웹팩에서 내장 최적화 제공
  mode: prod ? 'production' : 'development',

  // 소스 맵 생성 여부 및 방법 설정
  devtool: prod ? 'hidden-soure-map' : 'eval',

  // 번들링을 시작할 파일
  entry: {
    index: './src/index.js',
  },

  // 다양한 모듈들(js, image, css 등)을 처리하는 방법 결정
  module: {
    rules: [
      {
        // 처리할 모듈 형식 결정
        test: /.js$/,
        // 이 모듈에 사용할 loader
        use: 'babel-loader',
        // 제외할 파일들
        exclude: /node_modules/,
      },
      {
        test: /\.(sc|c)ss$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              publicPath: '/dist/static/style/',
            },
          },
          'css-loader',
          'sass-loader',
        ],
      },
      {
        test: /\.(png|jpg|svg)$/,
        use: [
          {
            loader: 'file-loader',
            options: {
              outputPath: 'static/images',
            },
          },
        ],
      },
    ],
  },

  // 빠르게 개발할 수 있도록 개발서버 제공
  devServer: {
    historyApiFallback: true,
    inline: true,
    port: 3000,
    hot: true,
    publicPath: '/',
  },

  // 번들링 된 파일이 생성될 위치 설정
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'static/js/bundle.js',
  },

  // 적용할 플러그인 목록
  plugins: [
    new HtmlWebpackPlugin({ template: `./public/index.html` }),
    new webpack.HotModuleReplacementPlugin(),
    new MiniCssExtractPlugin({ filename: 'static/style/main.css' }),
  ],
};

 

  • mode: production, development, none 세가지 옵션을 사용할 수 있는데 사용한 옵션에 따라 웹팩에서 내부적으로 최적화를 해준다. 보통 개발시에는 development, 배포시에는 production을 사용합니다.
  • devtool: 소스맵 생성 스타일을 결정할 수 있다. 여러 옵션들이 있으며 배포시에는 소스맵을 숨기는게 좋으므로 hidden-soure-map을 사용했습니다.
  • entry: 번들링을 시작할 파일을 결정할 수 있다. 멀티 페이지 번들링시 여러 파일을 설정할 수도 있습니다.
  • module: 다양한 모듈들을 처리하는 방법들을 결정한다. js파일, ts파일을 포함한 이미지파일, 스타일 파일 등 웹팩을 통해 번들링 되는 모든 파일들의 처리 방법을 설정하며 좀전에 설정한 바벨 또한 이 곳에서 설정한다. module을 설정할 때 중요한 부분은 loader를 읽을때 오른쪽에서 왼쪽으로 loader가 실행되기 때문에 sass-loader의 경우 css-loader보다 오른쪽에 위치시켜야합니다. (typescript의 경우에는 babel-loader 오른쪽에 ts-loader를 위치시켜야 한다.)
  • devServer: 개발 서버에 대한 설정을 할 수 있다. 에러처리, 포트 설정, 기본 path 등 여러 옵션을 설정할 수 있으며 자세한 옵션은 다음 페이지를 참고하면 좋습니다.
  • output: 웹팩을 통해 최종적으로 번들링 된 파일을 저장할 위치를 설정합니다.
  • plugins: 웹팩에 적용할 플러그인들을 설정합니다.

 

 

이제 프로젝트에서 웹팩을 실행시키기 위한 명령어도 설정해야 합니다.

 

 

package.json

"scripts": {
    "dev": "webpack-dev-server --open --hot",
    "build": "NODE_ENV=production webpack --mode production --env=build"
  }

 

다음과 같이 개발서버를 실행하기 위한 dev명령어와 빌드를 위한 build명령어를 설정해 줬습니다.

이제 설정한 이미지, sass가 모두 동작하는지 확인하기 위해 이미지 파일과 sass파일도 추가시켜 줬습니다.

 

 

 

 

style.scss

body {
  background-color: #b2dfdb;
}

 

배경색을 민트색으로 지정해줬다.

 

 

 

 

src/index.js

import './style.scss';
import image from './image.jpg';

const root = document.getElementById('root');

const img = document.createElement('img');
img.src = image;
img.alt = 'image';

root.appendChild(img);

 

그리고는 scss파일과 이미지파일이 적용되는지 확인해야 하기 때문에 사진을 넣어줄 수 있습니다.

 

 

  • 사실 평소에 웹팩과 바벨을 처음부터 커스텀 셋팅을 할 일이 많지 않다.
  • 대부분 React + Nextjs 조합을 통해 개발을 진행했기 때문이다. 그래도 웹팩과 바벨에 대한 개념과 원리를 알게 되면 추후에 복잡한 개발환경 설정에도 도움이 될 수 있다.
반응형

'프로그래밍 개발 > 프론트엔드 개발자 기본 지식' 카테고리의 다른 글

HTML/CSS  (0) 2022.04.12
Babel 바벨  (0) 2022.04.12
Npm  (0) 2022.04.12
ECMAScript2015(ES6)  (0) 2022.04.10
DOM API (Web API) and Concept  (0) 2022.04.10

댓글