Last updated
Last updated
Webpack
은 모던 Javascript Application을 위한 Static Module Bundler입니다.
Webpack이 Application를 처리할 때, 내부적으로는 프로젝트에서 필요한 모든 모듈들을 매핑하고 1개 이상의 번들을 생성하는 를 만듭니다.
entry
프로퍼티는 webpack
내부에 위치한 dependency graph
의 시작점을 지정하기 위해 사용합니다.
webpack
은 entry
지점으로부터 직간접적으로 의존적인 모듈 및 라이브러리를 모두 찾아서 Dependencies Graph
에 추가합니다.
entry
의 기본값은 ./src/index.js
이며, webpack.config.js
에 entry
프로퍼티를 추가해서 다른 여러 시작점을 지정할 수 있습니다.
output
프로퍼티는 생성한 번들을 내보낼 경로나 내보낼 번들의 파일명을 지정하기 위해 사용합니다.
해당 프로퍼티를 지정하지 않을경우 기본적으로 main file의 경우 ./dist/main.js
경로에 생성되며, 다른 파일들은 ./dist
폴더안에 생성됩니다.
webpack
은 오직 JavaScript
와 JSON
파일만 이해할 수 있습니다. 그래서 다른 타입(ts, css, etc..)의 파일들을 처리할려면 loader
를 사용해야합니다.
loader
는 webpack
이 기본적으로 처리할 수 없는 타입의 파일들을 처리하여 내 애플리케이션에서 사용할 수 있고, dependency graph
에 추가할 수 있는 유효한 형태의 모듈로 변환할 수 있도록 도와줍니다.
high level에서, loaders
는 두 가지 프로퍼티를 가지고 있습니다.
test
프로퍼티는 어느 파일이 변환(transform)되어야 하는지를 나타냅니다.
use
프로퍼티는 해당 파일을 변환하기 위해서 어떤 loader
를 사용해야하는지 나타냅니다.
use
프로퍼티의 값으로 배열을 넘겨줄 수 있는데, 배열을 넘겨줄 경우 배열의 로더들을 뒤에서 부터 순차적으로 적용시킵니다.
Loaders
는 Node.js 런타임에서 동작하며 Node.js 환경에서 사용 가능한 모든 것을 할 수 있습니다.
위 코드를 webpack.config.js
에 추가하면 webpack
컴파일러는 import
, require
구문안에 .css
확장자 파일 경로가 선언되어 있으면 css-loader
를 사용하여 해당 파일을 처리한뒤, 번들에 추가합니다.
webpack.config.js
파일에rules
를 정의할 때rules
프로퍼티가 아닌module.rules
로 정의해야 합니다. 만약 잘못 설정 되었을 경우webpack
은 사용자에게 경고해줍니다.
loaders
는 특정 타입의 모듈을 변환하기 위해 사용되지만, plugins
은 번들 최적화, asset 관리, 환경 변수 주입과 같은 번들된 결과물에 대하여 광범위한 작업을 수행하기 위해 사용합니다.
plugin
을 사용하기 위해선, commonJs 방식(require()
)으로 플러그인을 가져온 뒤 해당 플러그인을 plugins
배열에 추가하면 됩니다.
대부분의 플러그인들은 옵션을 통해서 커스터마이징을 할 수 있습니다.
플러그인은 다양한 목적에 의해 여러번 사용될 수 있으므로, 플러그인을 호출 할 때 new
연산자와 함께 호출해서 인스턴스 형태로 만들어줘야합니다.
mode
옵션을 설정하면 웹팩은 해당 mode에 맞는 built-in 최적화를 알아서 해줍니다.
mode
는 development
, production
, none
으로 지정할 수 있으며, 기본값은 production
입니다.
mode
옵션을 사용하기 위해선, webpack.config.js
에 mode
프로퍼티를 설정 해주거나, webpack을 실행할 때 cli상에서 --mode
argument를 전달해주면 됩니다.
or
Note.
NODE_ENV
를 설정해도mode
가 자동으로 설정되지 않습니다.
JavaScript 애플리케이션을 웹 환경에서만 사용하는게 아니라, node.js
, webworker
, electron
등의 다양한 런타임 환경에서도 사용할 수 있습니다.
그런경우에는 webpack.config.js
파일에 target
옵션을 지정해서 해당 런타임 환경에 맞게 컴파일하도록 webpack
에게 알려줘야합니다.
번들러를 사용하면 여러개의 파일들을 한개 이상의 파일로 합칠 수 있기때문에 동시 연결 제한이 있는 http 1.1 프로토콜에서는 효율적이다.
전역 스코프 오염 걱정 없이 모듈(파일) 단위 스코프를 사용해서 개발할 수 있게 해준다
minify, uglify, auto-prefix, 변경된 파일만 filehash 변경 등 다양한 태스크들을 지정한 순서대로 빌드타임에 실행시켜준다.(gulp, grunt등의 task runner등과 동일)
webpack-dev-server를 이용해 손쉽게 hmr(hot module replacement) 환경에서 개발할 수 있게해준다
webpack
은 module bundler고, gulp
는 task runner의 목적으로 개발되었습니다.
webpack
은 gulp
의 task runner 기능 대부분을 다 수행가능하며, browserify
처럼 모듈 의존성 관리도 해주기때문에 tree shaking
과 같은 작업들도 가능하게 해줍니다.
webpack
은 gulp / grunt
+ browserify
의 기능들을 지원해줍니다.
package.json 파일의 sideEffects 프로퍼티 값을 통해 webpack 컴파일러에게 어떤 모듈의 sideEffect 포함 여부를 전달할 수 있습니다.
package.json에 명시되어 있는 sideEffects 프로퍼티 값에 어떤 모듈의 경로가 포함되어 있을 경우 해당 모듈에 대해 트리쉐이킹을 적용 하지 않습니다.
sideEffects 프로퍼티 값을 false로 넘기게 되면 모든 모듈들을 side-effect-free로 여기며 사용되지 않은 코드들을 지우는 트리쉐이킹 작업을 수행하게 됩니다.
webpack.config.js
파일안에서 플러그인을 사용하는 것은 간단하지만 탐구할 가치가 있는 많은 use case들이 있기 때문에 를 참고
각 모드를 설정할 경우, 웹팩이 정확히 어떤 옵션들을 켜주는지 궁금하면 를 참고해주세요.
target
옵션의 기본값은 web
이며, 해당 옵션에 지정할 수 있는 값들의 상세 정보는 를 참고해주세요.
를 사용해 모든 구문에서의 sideEffect 여부를 정확하게 파악하기는 어렵기 때문에
Option
Description
development
DefinePlugin
플러그인의 process.env.NODE_ENV
값을 development
로 설정. NamedChunksPlugin
, NamedModulesPlugin
플러그인 활성화
production
DefinePlugin
플러그인의 process.env.NODE_ENV
값을 production
로 설정. FlagDependencyUsagePlugin
, FlagIncludedChunksPlugin
, ModuleConcatenationPlugin
, NoEmitOnErrorsPlugin
, OccurrenceOrderPlugin
, SideEffectsFlagPlugin
, TerserPlugin
플러그인 활성화
none
기본 최적화 옵션들을 적용 안하게 설정