webpack은 여러 개 파일을 하나의 파일로 합쳐주는 번들러(bundler)다.
로더(Lodaer)는 웹팩이 웹 애플리케이션을 해석할 때 자바스크립트 파일이 아닌 HTML, CSS, Image, Font 등을 변환하여 자바스크립트에서 직접 로딩할 수 있도록 해준다.
커스텀 로더 만들기
로더를 사용하기 전에 커스텀 로더를 만들어서 확인해 보자.
cumstomLoader.js 생성
cumstomLoader.js1 2 3 4
| module.exports = function customLoader (content) { console.log("커스텀 로더 작동"); return content; };
|
webpack.config.js파일의 module 객체에 추가
webpack.config.js1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const path = require("path");
module.exports = { mode: "development", entry: { main: "./src/app.js" }, output: { filename: "[name].js", path: path.resolve("./dist"), }, module: { rules: [{ test: /\.js$/, use: [path.resolve("./src/customLoader.js")] }], } }
|
- test에는 로딩에 적용할 파일을 적용한다. 정규화 표현식을 이용해서
.js
확장자의 모든 파일을 처리
- user에는 이 패턴에 해당하는 방금 만든
cumstomLoader.js
경로를 지정
커스텀 로더 실행
1 2 3 4 5 6 7
| $ npm run build
> frontend-dev-env@1.0.0 build C:\workGit\frontend-dev-env > webpack
커스텀 로더 작동 커스텀 로더 작동
|
터미널에 ‘커스텀 로더 작동’ 문자열이 나오고, cumstomLoader()
함수가 동작한 것을 확인할 수 있다.
css-loader
CSS 파일을 자바스크립트에서 불러와 사용하려면 CSS 모듈 변환하는 작업이 필요한데, css-loder가 CSS 모듈 변화 작업을 진행하여 사용할 수 있게 한다.
css-loader 설치
1
| $ npm install -D css-loader
|
style.css
style.css1 2 3
| body { background-color: green; }
|
app.js
webpack.config.js에 추가
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const path = require("path");
module.exports = { mode: "development", entry: { main: "./src/app.js" }, output: { filename: "[name].js", path: path.resolve("./dist"), }, module: { rules: [{ test: /\.css$/, use: ["css-loader"], }], } }
|
- 웹팩은 엔트리 포인트 부터 검색하여 css 파일을 찾으면
css-loader
가 처리 한다.
css-loader 변환 확인
dist/main.js
파일에 background-color: green
검색하면 css 코드가 자바스크립트로 변환된 것을 확인할 수 있다.
style-loader
css-loader
로 변경된 style sheet는 Dom에 추가되어야만 브라우져가 해석할 수 있다. style-loader는 자바스크립트로 변경된 스타일을 동적으로 Dom 에 추가하는 로더이므로 css-loader
와 style-loader
는 함께 사용해야 된다.
style-loader 설치
1
| $ npm install -D style-loader
|
webpack.config.js에 추가
webpack.config.js1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const path = require("path");
module.exports = { mode: "development", entry: { main: "./src/app.js" }, output: { filename: "[name].js", path: path.resolve("./dist"), }, module: { rules: [{ test: /\.css$/, use: ["style-loader", "css-loader"], }], } }
|
rules.use
에 배열은 앞에서부터 순서대로 로더가 작동
style-loader 변환 확인
file-loader
webpack output에 파일을 옮겨주는 것이 file-loader이다.
file-loader 설치
1
| $ npm install -D file-loader
|
style.css
style.css1 2 3
| body { background-image: url(./dist/bg.png); }
|
webpack.config.js
webpack.config.js1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| const path = require("path");
module.exports = { mode: "development", entry: { main: "./src/app.js" }, output: { filename: "[name].js", path: path.resolve("./dist"), }, module: { rules: [ { test: /\.css$/, use: ["style-loader", "css-loader"], }, { test: /\.png$/, loader: "file-loader", options: { name: "[name].[ext]?[hash]", } } ], } }
|
publicPath
은 file-loader
가 처리하는 파일 모듈로 사용할 때 앞에 추가되는 문자열
name
은 ‘bg.png?c1771da01a4975d381c2b5583293a075’ 형식으로 파일 변경 요청
file-loader 변환 확인
url-loader
url-loader가 처리하는 옵션 중 fallback 기본값이 file-loader이다.
이미지를 Base64로 인코딩하여 문자열 형태로 소스에 넣어주는 형식으로 처리해 주는 게url-loader이다.
url-loader 설치
1
| $ npm install -D url-loader
|
app.js
app.js1 2 3 4 5 6 7 8
| import "./style.css" import small from './small.png';
document.addEventListener('DOMContentLoaded', () => { document.body.innerHTML = ` <img src="${small}" /> ` })
|
webpack.config.js
webpack.config.js1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| const path = require("path");
module.exports = { mode: "development", entry: { main: "./src/app.js" }, output: { filename: "[name].js", path: path.resolve("./dist"), }, module: { rules: [ { test: /\.css$/, use: ["style-loader", "css-loader"], }, { test: /\.(png|jpg|svg|gif)$/, use: { loader: "url-loader", options: { name: "[name].[ext]?[hash]", limit: 100000 } } } ], } }
|
`limit에 설정한 값에 따라 100kb 미만 파일은 Data url 형태로 변환.
아이콘처럼 사용 빈도수가 높은 이미지 파일을 사용하면 좋다.
url-loader 변환 확인
소스코드
참조