언제까지고 CRA를 쓸 순 없으니까..
https://webpack.js.org/concepts/
webpack은 자바스크립트 번들러
concepts 파트는 config파일을 통해 웹팩에 어떤 설정 등을 할 수 있는지 가볍게 설명해주는 부분이다. 뭘 할 수 있는지 알아야 나중에 찾아볼 수도 있지 않을까 하는 마음으로...
webpack.config.js
웹팩 설정파일로 여러 설정 등을 할 수 있다. 4.0.0이후로 필수적인 것은 아니지만 직접 구성할 수 있음.
// webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/js/main.js',
output: {
path: './bundle/',
filename: 'my-bundle.js'
},
module: {
rules: [
{ test: /\.txt$/, use: 'raw-loader' }
]
},
plugins: [
// 아래 플러그인은 만들어진 번들 파일들을 자동으로 template에 지정된 html파일에 추가해준다.
new HtmlWebpackPlugin({ template: './src/index.html' })
],
mode: 'development',
}
./src/index.js
entry: {
one: './src/one/index.js',
another: {
dependOn: 'one',
import: './another-basic'
},
others: './src/others/index.js'
}
./dist/main.js
{test: string, use: string}[]
로 설정해줄 수 있다.!
를 사용하여 로더를 지정해줄 수도 있음import module from '로더이름!대상파일'
!
, !!
, -!
를 가장 앞에 붙여서. 로더에 대한 활성화 여부를 결정할 수 있다config
파일에 rules
에 지정하는 것을 추천new
키워드로 인스턴스를 만들어서 사용const webpack = require('webpack');
에 내장되어 있음development
, production
, none
production
위 핵심 내용 말고도 module.exports에 정의해줄 수 있는 것들이 많다.
https://webpack.js.org/configuration/
이런 configuration 파일 내에서도 역시 node.js CommonJs 기반이라 필요한 플러그인이나 파일을 require()
을 통해 로드할 수 있다.
일반적으로 webpack.config.js
의 module.exports 에는 단일 객체를 할당하지만 배열을 전달하여 여러 설정을 export할 수도 있다. 이 경우는 보통 라이브러리를 만들면서 여러 모듈을 타겟(output.libraryTarget
으로 구분)으로 할 때, 아니면 배포 환경을 다양하게 정의하고 싶어 target
를 이용하여 나타낼 때 사용하게 된다.
common js(cjs), esm, amd 처럼 webpack에도 처리할 수 있는 모듈 포맷이 존재한다.
기본적으로 esm, cjs, amd, assets, webAssembly 모듈을 지원하여 이 포맷으로 작성된 모듈들의 의존성을 분석할 수 있다.
추가로 편리한 개발을 위해 사용하는 전처리기나 typescript같은 언어들도 지원한다. loader 항목을 통해 지정해줄 수 있으며 기본적으로 로더를 제공하고 있다. (물론 직접 만들어서 쓸 수도 있다.)
각 모듈의 path는 절대/상대/모듈(기본으로 지정된 디렉터리 내부) 경로로 지정해 줄 수 있고, 이때 사용되는 enhanced-resolve
는 이런 접근들을 캐싱하여 추가로 요청해야할 때 더 빨리 처리할 수 있도록 한다.
웹팩이 내가 작성한 코드들과 패키지, 모듈을 합치는 과정에서 생기는 정보들은(상호작용이라고 표현) manifest 파일의 메타데이터로 관리된다. 이후 실제 이 파일들을 실행할 때 각 모듈을 해석할 때 이 정보를 이용한다.
뭔가 수정했을 때 모듈 전체를 다시 불러오지 않고도 수정된 부분을 적용할 수 있다 → live reload의 역할이 가능하게 함
HMR 런타임이 업데이트된 내용이 있는지 먼저 확인하고 수정된 부분에 대해서만 알아서 업데이트를 진행한 후에 어플리케이션 런타임에 업데이트를 진행한다. → 어플리케이션 런타임 입장에서는 모듈을 다시 업데이트하지 않음
헷갈리면 안되는게 번들링 자체와는 다르다. 코드가 수정되면 당연히 번들링은 다시 진행된다.
https://betterprogramming.pub/the-battle-of-bundlers-6333a4e3eda9#:~:text=webpack and Rollup both require,is why you use path
https://bundlers.tooling.report/
자세한 내용은 위 글들에 있지만 정리하자면 번들러 근본인 웹팩은 다른 번들러들에 비해서 제공해주는 것도 많고 기능도 많다. 정말 기본적인 것을 제공하면서 추가적인 기능과 예외적인 상황에 대한 처리를 다양하게 쌓아올릴 수 있는 형태다. 그래서 덕분에 일일이 config 해줘야하지만 그만큼 다양한 상황을 개발자 마음대로 다룰 수 있다는 것을 의미한다. 그래서 보통
을 대부분 추천한다.