본 게시물은 "생활코딩 - Webpack" 강의를 요약정리한 글입니다.
: 여러개의 파일을 하나의 파일로 묶어주는 개발 자동화 도구
(생산성 향상)
각기 다른 파일에서 동일한 이름의 함수/변수를 생성시 충돌로 인해 application이 깨질 위험성이 있었음.
➡ 여러 개의 파일을 묶어주는 Bundler
의 탄생
: Javascript파일에 JS코드 뿐만 아니라 CSS, 이미지까지 모듈
로 몰아넣을 수 있음.
, 웹개발에서 필요한 다양한 확장기능을 제공.
src 디렉토리
ㄴ hello.js (var word ="hello")
ㄴ world.js (var word ="world")
위 모듈들을 html파일에서 script 태그로 각각 로드한 뒤 공통되는 변수명을 사용했을 때 결과는?
나중에 로드한 파일의 변수의 값만 불러오는 문제가 생김.
: export로 모듈을 내보내고, import로 해당 모듈을 불러오는 방식(ES6)
*문제점
👉 공식문서 참고
$ npm init
: entry파일과 output파일을 직접 CLI에 명시하여 webpack 실행.(번거로움)
$npx webpack --entry ./src/index.js --output ./public/index_bundle.js
➡ index_bundle.js 파일이 생성됨
: 설정파일을 만들어서 해당 내용대로 webpack 실행되도록 세팅해준다.
- webpack.config.js 파일 생성
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'index_bundle.js',
path: path.resolve(__dirname, 'public'),
},
};
- $ npx webpack
➡ 웹팩이 자동으로 configuration 파일을 찾아서 적혀진 내용대로 파일을 번들링해준다.
웹팩은 모드별(개발 모드/프로덕션 모드)로 각각 디폴트 세팅이 있음
(➡ webpack.config.js, webpack.config.prod.js 파일을 따로 만들어서 개발용/배포용 따로 활용하기도 함)
: 웹팩을 잘 안다는 것은 얼마나 다양한 로더를 잘 알고 있는가라고 할 수 있을 정도로 로더
는 매우 중요
로더의 역할은,
asset을 가공해서 원하는 형태로 뾰로롱 🎠 만들어주는 역할
ex) .js, .css, .sass, .cjs, .png, .jpg... ➡ 로더
로 프로세스 ➡ .js,.css, .jpg, .png
(style-loader, css-loader로 실습)
$ npm install --save-dev(=-D) style-loader css-loader
css-loader
는 style.css 파일을 js형태로 만들어줌.(추출)style-loader
는 번들링된 .js 태그를 html 페이지에 style 태그에 inject 한다.(주입)+팁 ) loader는 체이닝 기법으로 앞의 로더부터 순차적/연쇄적으로 맞물려서 실행된다. 즉, 앞의 로더가 실행한 것을 기반으로 다음 로더가 실행된다. So, raw file을 js로 추출하는 로더 먼저 적고, 뒤에 번들링된 파일을 html에 주입시키는 로더를 불러야 한다. (순서 중요)
를 참고하여 공식 로더와 커뮤니티 로더들을 한번 훑어보면 도움이 된다.
: output의 디폴트는 번들링된 하나의 js파일만 생성되는 것.
만약 파일을 여럿으로 나누어 번들링 하고 싶다면?
configuration의 output을 직접 수정해준다.
entry 둘로 쪼개고
output에는 [name]예약어를 사용.
entry: {
index: './src/index.js',
about: './src/about.js'
},
output: {
filename: '[name]_bundle.js',
path: path.resolve(__dirname, 'public'),
},
👉 공식문서/plugins/html webpack plugin
: html 파일 자동 생성 기능
The HtmlWebpackPlugin simplifies creation of HTML files to serve your webpack bundles. This is especially useful for webpack bundles that include a hash in the filename which changes every compilation. You can either let the plugin generate an HTML file for you, supply your own template using lodash templates, or use your own loader.
$ npm install --save-dev html-webpack-plugin
기존에는 html파일을 매뉴얼로 생성했다면 이제는 html파일을 src 디렉토리로 옮겨준다.(템플릿 역할)
그리고 config파일에 플러그인을 require 해준다.
var HtmlWebpackPlugin = require('html-webpack-plugin');
...
module.exports = {
...,
plugins: [new HtmlWebpackPlugin()]
}
html webpack plugin 공식문서 의 options에서 필요한 속성들을 찾고 추가한다. (template, filename, chunks)
plugins: [
new HtmlWebpackPlugin({
template: "./src/index.html",
filename: "index.html",
chunks: ["index"],
}),
new HtmlWebpackPlugin({
template: "./src/about.html",
filename: "about.html",
chunks: ["about"],
}),
],
➡ index.html, about.html 파일 각각 생성되고, chunks에 각각 index/about을 명시해줬기 때문에 index.html-index.js만 로드 / about.html-about.js만 로드된다.
$npx webpack --watch
$npm install lodash
index.js에 import _ from "lodash";
로 불러온 뒤 _.join, _.map
등 다양한 메서드로 여러가지 모듈들에 사용할 수 있음.
DevServer
- save 하면 자동으로 브라우저에 리로드(live reload
)
- 모듈 수정시 수정된 부분만 컴팩트하게 바뀌는 기능(hot module replacement
) :: 입력해둔 다른 정보 그대로 유지되므로 매우 편리
Code splitting
- 여러 파일을 하나로 번들링 하다보면 파일이 너무 커질 수 있음 ➡ 코드를 쪼개어줌
Lazy Loading
- 스플리팅된 코드를 필요할 때만 불러와서 사용하는 것