-
[Webpack] file-loader, url-loader개발/Javascript 2022. 8. 3. 18:00
Webpack 4
file-loader
module.rules에 다음과 같이 설정했었습니다.
별도로 file-loader를 설치해야 합니다.
{ test: /\.(png|jpg|gif|svg)$/, loader: 'file-loader', options: { publicPath: './dist/', name: '[name].[ext]?[hash]' } }
output.path 프로퍼티에 설정한 경로에 번들링된 파일이 위치하게 됩니다.
url-loader
이는 dataURI 스킴을 처리하는 로더입니다.
작고 여러 개인 이미지에 대한 http 요청을 줄여야 할 때 사용을 고려해볼 수 있습니다.
별도의 url-loader를 설치해야 합니다.
다음처럼 설정하면 2kb 미만의 이미지 파일은 base64로 인코딩 되어 html에서 관리됩니다.
2kb 이상의 파일은 dataURI로 처리되지 않고 파일로 처리됩니다.
{ test: /\.(png|jpg|gif|svg)$/, loader: 'url-loader', options: { publicPath: './dist/', name: '[name].[ext]?[hash]', limit: 2000 // 2kb } }
번들 파일을 보면 인코딩된 문자열을 확인할 수 있으며 output 폴더인 dist에도 해당 파일은 존재하지 않게 됩니다.
Webpack 5
raw-loader, url-loader, file-loader가 내장되어 있습니다.
각각 타입을 주어 처리할 수 있습니다.
file-loader로 처리하던 것을 asset/resource,
url-loader로 처리하던 것을 asset/inline,
raw-loader로 처리하던 것을 asset/source.
options 프로퍼티가 사라졌으므로 그 안에서 했던 설정도 다르게 해줘야 합니다.
publicPath가 필요하다면 generator 프로퍼티 안에 넣어주면 되는데,
굳이 넣지 않아도 되는 것 같습니다.
필요하다면 output.assetModuleFilename 프로퍼티 앞에 추가해주면 됩니다.
아래는 공식문서의 예제입니다.
const path = require('path'); module.exports = { entry: './src/index.js', output: { filename: 'main.js', path: path.resolve(__dirname, 'dist'), assetModuleFilename: 'images/[hash][ext][query]' }, module: { rules: [ { test: /\.png/, type: 'asset/resource' } ] }, };
여기에서는 다음과 같이 변경했습니다.
output: { path: path.resolve(__dirname, './dist'), filename: '[name].js', // 동적으로 entry의 키값을 가져온다 assetModuleFilename: '[name].[ext]?[hash]', }, // ... module: { rules: [ { test: /\.(jpg|png)/, type: 'asset/resource' }, ] }
파일 이름이 다음과 같이 설정됩니다.
특정 용량 미만일 경우 dataURL로 처리하고 싶다면 asset 타입을 사용하면 됩니다.
{ test: /\.(jpg|png)/, type: 'asset', parser: { dataUrlCondition: { maxSize: 4 * 1024, }, }, },
< 참고 >
https://webpack.kr/guides/asset-modules/#general-asset-type
https://webpack.kr/guides/asset-modules/
'개발 > Javascript' 카테고리의 다른 글
ESLint(feat. Prettier) (0) 2022.08.05 윈도우에서 NODE_ENV 사용하기 (0) 2022.08.04 package.json 모듈 업데이트 (0) 2022.08.03 [Jest] 간단한 유닛 테스트(feat.setTimeout()) (0) 2022.08.02 addEventListener에서의 this (0) 2022.07.19