번들링과 웹팩

최정석·2022년 7월 26일
1
post-thumbnail
🎁 번들링
  • 번들링은 여러 제품이나, 코드, 프로그램을 묶어서 패키지로 제공하는 행위를 의미한다
  • 프론트엔드 개발자 에게 번들이란
    사용자에게 웹 애플리케이션을 제공하기 위한 파일 묶음

🔝 Webpack
  • webpack은 2022년 7월 현재 프론트엔드 애플리케이션 배포를 위해서 가장 많이 사용하는 번들러
  • 한글화 공식문서
  • Webpack이란 여러 개의 파일을 하나의 파일로 합쳐주는 모듈 번들러
  • 모듈 번들러 등장 이유
    • JavaScript 코드의 양이 절대적으로 많이 증가했고, 또 대규모의 의존성 트리를 가지고 있는 대형 웹 애플리케이션이 등장하므로써 세분화된 모듈 파일이 폭발적으로 증가
    • JavaScript 언어의 특성에 따라 발생하기 쉬운 각 변수들의 스코프 문제를 해결해야 하고, 각 자원을 호출할 때에 생겨나는 네트워크 쪽의 코스트도 신경써줘야만 했다
    • 복잡성에 대응하기 위해 하나의 시작점(Ex. React App의 index.js 등)으로부터 의존성을 가지는 모듈을 모두 추적하여 하나의 결과물을 만들어내는 모듈 번들러가 등장
  • Webpack에서의 모듈은 JavaScript의 모듈에만 국한하지 않는다. HTML, CSS, 혹은 .jpg나 .png 같은 이미지 파일들도 전부 포함한 포괄적인 개념

🛠 Webpack을 이용하여 빌드하기
  • Webpack 설치하기
    npm install -D webpack webpack-cli
  • Webpack config 파일 작성
    // webpack.config.js
    const path = require('path');
    
    module.exports = {
      entry: './src/index.js',
      output: {
        path: path.resolve(__dirname, 'dist'), // './dist'의 절대 경로를 리턴합니다.
        filename: 'app.bundle.js',
      },
    };
  • css 로더 설치
    npm i -D css-loader style-loader
  • html-webpack-plugin 설치
    npm i -D html-webpack-plugin
    // html-webpack-plugin은 번들링 과정 중 html 파일을 자신이 원하는 형태로 가공하여 번들에 포함할 수 있게 돕습니다.
  • 번들링하기
    npx webpack
  • Webpack의 config 파일 예시
    module.exports = {
      target: ["web", "es5"], 
    // Webpack은 다양한 환경과 target을 컴파일합니다. target의 기본값은 web입니다. 
    // 적용하지 않으면 이 기본 값으로 적용됩니다. 
    // 이 부분에는 web 외에도 다양한 환경을 컴파일 할 수 있는데, 
    // esX를 넣으면 지정된 ECMAScript 버전으로 컴파일할 수 있습니다.
      entry: "./src/script.js",
    // Entry 속성은 Entry point라고도 하며, 
    // webpack이 내부의 디펜던시 그래프를 생성하기 위해 사용해야 하는 모듈입니다. 
    // Webpack은 이 Entry point를 기반으로 
    // 직간접적으로 의존하는 다른 모듈과 라이브러리를 찾아낼 수 있습니다.
      output: {
        path: path.resolve(__dirname, "docs"),
        filename: "app.bundle.js",
        clean: true
      },
    // Output 속성은 생성된 번들을 내보낼 위치와 이 파일의 이름을 지정하는 방법을 
    // webpack에 알려주는 역할을 합니다.
    // 기본 출력 파일의 경우에는 ./dist/main.js로 , 
    // 생성된 기타 파일의 경우에는 ./dist 폴더로 설정됩니다.
      module: {
        rules: [
          {
            test: /\.css$/,
            use: [MiniCssExtractPlugin.loader, "css-loader"],
            exclude: /node_modules/,
          },
        ],
      },
    // 여기서 test와 use 속성은 필수 속성입니다. 
    // 이런 속성을 넣어 규칙을 정하기 위해서는 module.rules 아래에 정의해야 합니다. 
    // 그저 rules 아래에 정의하면 webpack은 경고를 하게 됩니다.
      plugins: [
        new HtmlWebpackPlugin({
          template: path.resolve(__dirname, "src", "index.html"),
        }),
        new MiniCssExtractPlugin(),
      ],
    // Plugins를 사용하면 번들을 최적화하거나 에셋을 관리하고, 
    // 또는 환경변수 주입 등의 광범위한 작업을 수행할 수 있게 됩니다.
    // require()를 통해 플러그인을 먼저 요청
    // 다른 목적으로 플러그인을 여러 번 사용하도록 설정할 수 있기 때문에 
    // new 연산자를 사용해 호출하여 플러그인의 인스턴스를 만들어줘야 합니다.
      optimization: {
        minimizer: [
          new CssMinimizerPlugin(),
        ]
      }
    // Webpack은 버전 4부터는 선택한 항목에 따라 최적화를 실행합니다.
    // 최적화하기 위해 다양한 옵션이 지원이 되는데, 
    // 대표적으로 minimize와 minimizer 등을 사용합니다.
    // minimize : TerserPlugin 또는 optimization.minimize에 명시된 
    // plugins로 bundle 파일을 최소화(=압축)시키는 작업 여부를 결정
    // minimizer : defualt minimizer을 
    // 커스텀된 TerserPlugin 인스턴스를 제공해서 재정의할 수 있습니다.
    // 위의 예제에서는 mini-css-extract-plugin 에 관련된 번들을 
    // 최소화하도록 지시하고 있습니다.
    };

0개의 댓글