beadss / jpa-study

jpa슽터디입니다
1 stars 2 forks source link

웹 프론트엔드 개발의 구원자 Webpack #16

Open beadss opened 5 years ago

beadss commented 5 years ago

webpack이란 무엇인가

자바 스크립트 애플리케이션을 위한 모듈 번들러

Gulp, Grunt와의 차이점

image image

gulp, grunt는 태스크 관리 툴로서 자체적으로 수행하는건 태스크 관리 뿐이다. 여러가지 플러그인들을 사용해서 transfile, bundle, uglify 등을 처리한다. 반면에 webpack은 모듈 번들러로써 번들링 기능이 기본이고, 번들링 과정에서 필요한 기능들을 플러그인으로 추가하는 형태이다.

태스크 관리 툴은 좀 더 범용적으로 사용할 수 있지만 기능에 제한이 있고, 모듈 번들러는 범위가 좁은 대신 기능이 강력하다고 생각하면 편하다.

Dependency Tree

Webpack은 모듈간의 의존관계를 분석할 수 있는 기능이 존재한다. 의존관계 분석 기능은 Webpack의 모든 기능의 기반이기 때문에 태스크 관리 툴과의 가장 큰 차이점이라고 볼 수 있다. gulp 등 태스크 관리 툴은 의존 관계를 분석하는 기능이 없기 때문에 단순한 파일 변환 및 묶기 기능만을 수행할 수 있다.

webpack.config.js

gulp에 gulpfile.js가 있다면 Webpack에는 webpack.config.js가 있다.

Entry(엔트리 포인트라고 표현하기도 함)

module.exports = {
    /** 입력 파일 설정 **/
    entry: './path/file.js'
}

Output

module.exports = {
  entry: './path/to/my/entry/file.js',
  /** 출력 파일 설정 **/
  output: {
    path: './dest/path',
    filename: 'bundle.js'
  }
};

Loaders

https://webpack.js.org/configuration/module/#rule-loader

module.exports = {
  entry: './path/to/my/entry/file.js',
  output: {
    path: './dest/path',
    filename: 'my-first-webpack.bundle.js'
  },
  /** loader 설정 **/
  module: {
    rules: [
      {test: /\.(js|jsx)$/, use: 'babel-loader'}
    ]
  }
};

Plugins

const HtmlWebpackPlugin = require('html-webpack-plugin'); //installed via npm
const webpack = require('webpack'); //to access built-in plugins

module.exports = {
  entry: './path/to/my/entry/file.js',
  output: {
    filename: 'my-first-webpack.bundle.js',
    path: './dest/path',
  },
  module: {
    rules: [
      {test: /\.(js|jsx)$/, loader: 'babel-loader'
      }
    ]
  },
  plugins: [
    new webpack.optimize.UglifyJsPlugin(),
    new HtmlWebpackPlugin({template: './src/index.html'})
  ]
};

최적화

Chunk Hash

Webpack은 Chunk의 Hash값을 파일 명에 붙여줌으로써 Long Term 캐시를 노리는 기능을 제공한다. 내용이 바뀌지 않은 Chunk는 Hash값도 그대로이므로 브라우저와 서버에 캐시된 데이터를 사용할 수 있는 것이다. Webpack의 Chunk Hash 기능을 사용하면 내용이 변경 된 js 파일만 새로 다운받을 수 있게 된다.

Code Splitting

Webpack의 기초 용도는 수많은 모듈 js 파일들을 하나로 묶어서 브라우저 환경에 대응하기 위함이지만, 모든 것을 다 묶어버리면 아래의 문제들이 발생하므로 적절한 단위로 js 파일을 분할해주는 것이 좋다.

Split Chunks Plugin

위의 문제들을 해결하기 위한 방법 중 한가지는 공용으로 사용되는 모듈들을 분리해서 별도의 묶음 파일로 사용하는 것이다. 잘 변하지 않고 크기가 크다면 더더욱 별도의 묶음 파일로 분리해야한다.

Split Chunks Plugin은 이런 모듈들을 독립적인 js 파일로 분리해주는 역할을 수행한다.

주로 사용되는 용도

JS 지연 로딩(require.ensure() | import())

Split Chunks Plugin로 js 파일을 분리하더라도 한 페이지에서 그것을 모두 로딩하게 된다면, 초기 로딩 속도에 막대한 지장을 끼친다. SPA(single-page application) 같이 entry point가 하나인 경우 한 페이지에 모든 script 태그가 들어가게 되므로 더더욱 그렇다.

Webpack에서는 이러한 문제를 해결하기 위해, 필요한 순간에 개별로 bundling 된 모듈을 비동기로 로딩하는 기능을 제공한다.

require.ensure() & import() 공통 기능

require.ensure()

import()

Tree Shaking(Webpack2부터 지원됨)

지금까지 모듈을 모으고 나누고 압축하고 난독화하고 주석제거하는 등 많은 최적화 방식을 알아봤다. 그런데 마지막으로 한가지 더 최적화할 수 있는 구석이 있다. 바로 실제로 사용되지 않는 부분을 아예 제거해버리는 것! (Webpack이 알아서 다 해주는 것이 아니고, 신경써서 잘 써야한다!) (진짜 제대로 쓰려면 올바른 형태의 모듈로 개발해야한다. 사용하는 라이브러리들도 모두 올바른 형태여야한다..!)

등장 배경

작동 방식

사용법

그러나..

watch

Webpack watch가 수행되면 대상 파일들에 대해 감시가 시작되고, 파일에 변경이 일어나면 해당 파일만 다시 작업(loader, plugin 등)한 후 재 번들링을 수행해줍니다.

성능이 좋은 이유

주의사항