5페이지 - 자산 모듈
한 페이지를 이미지와 스타일로 묶어야 한다고 상상해 봅시다.
웹 페이지 사용
이 목적에 대한 Webpack 4 구성은 다음과 같습니다.
webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.svg$/,
use: [
'file-loader',
'svgo-loader'
]
},
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
}
]
}
};
src/index.js
import './styles.css';
// ...
src/styles.css
.logo {
background: url("/images/logo.svg") no-repeat;
background-size: cover;
width: 75px;
height: 65px;
}
출력:/dist/main.js
/dist/eb4c5fa504857.svg
따라서 모든svg 파일은 svgo으로 처리되고 file-loader에서 묶음 출력 경로로 발송됩니다.A 스타일이 다음과 같이 변환됩니다..logo {
background: url("eb4c5fa504857.svg") no-repeat;
background-size: cover;
width: 75px;
height: 65px;
}
그러나 잠시 후, 웹 페이지를 최적화하기 위해 css에 그림을 삽입하기를 희망할 수도 있습니다.file-loader
을 url-loader으로 교체합니다. {
test: /\.svg$/,
use: [
- 'file-loader',
+ 'url-loader',
'svgo-loader'
]
},
출력:/dist/main.js
번들 css는 다음과 같습니다.- background: url("eb4c5fa504857.svg") no-repeat;
+ background: url("data:image/svg+xml;base64,....") no-repeat;
다음에, 우리는 작은 svg (예, 8kb 이하) 만 연결하고,rest 파일을 출력 디렉터리에 보내기를 희망합니다.url-loader
의 limit
- 옵션: {
test: /\.svg$/,
use: [
- 'url-loader',
+ 'url-loader?limit=8192',
'svgo-loader'
]
},
이후 작은svg(8kb 이하)만 내연되고 나머지svg 파일은 출력 디렉터리에 전송되며 url-loader
은 file-loader
을 은식으로 사용합니다.문제가 해결됐어요...그러나 잠깐만, 웹팩 5와 자산 모듈 기능이 있으면 이 문제는
url-loader
과 file-loader
(url-loader
을 은밀하게 limit
보다 작은 파일-옵션)에 사용할 수 있다.웹페이지
우선, 우리는 자산 모듈을 사용해야 한다는 것을 명확하게 지정해야 한다.구성에서 다음을 지정합니다.
module.exports = {
// ...
+ experiments: {
+ asset: true
+ }
};
Asset Modules is an experimental feature at this moment and we are collecting a feedback from the users.
지금,svg 파일을
asset
으로 표시하기만 하면 됩니다.위에서 설명한 file-loader
및 url-loader
과 관련된 모든 내용은 적재기 없이 바로 사용할 수 있습니다. {
test: /\.svg$/,
- use: [
- 'url-loader?limit=8000',
- 'svgo-loader'
- ]
+ type: 'asset',
+ use: 'svgo-loader'
},
이렇게 하면 type: 'asset'
규칙과 일치하는 모듈에 다음 논리를 적용합니다. 모듈 크기가 8kb (기본값) 보다 작으면 패키지에 연결하고, 그렇지 않으면 파일을 출력 디렉터리에 보냅니다.Note that
use
-property is also taken into account (if specified)
아직 끝나지 않았습니다.
asset
을 제외하고 다른 모듈 유형도 있습니다.자산/내연
url-loader
처럼type: 'asset/inline'
규칙과 일치하는 모든 모듈은 데이터 URL로 패키지에 연결됩니다. {
test: /\.svg$/,
- type: 'asset',
+ type: 'asset/inline',
use: 'svgo-loader'
},
그 밖에 우리는 type: 'asset/inline'
에 사용자 정의 데이터 URL 생성기를 지정할 수 있다.예를 들어, 우리는 mini-svg-data-uri을svg 파일에 사용할 수 있다.이것은svg를 데이터 URL로 변환하지만 base64를 사용하지 않습니다.그것은 가방의 크기를 약간 줄였다.
+ const miniSVGDataURI = require('mini-svg-data-uri');
// ...
{
test: /\.svg$/,
type: 'asset/inline',
+ generator: {
+ dataUrl(content) {
+ content = content.toString();
+ return miniSVGDataURI(content);
+ }
+ },
use: 'svgo-loader'
},
css는 다음과 같이 변경됩니다.- background: url("data:image/svg+xml;base64,....") no-repeat;
+ background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg'....") no-repeat;
We even can use a custom data-url generator and the
use
-property
자산 / 자원
file-loader처럼.
type: 'asset/resource'
규칙을 준수하는 모든 모듈은 출력 디렉토리로 전송됩니다. {
test: /\.svg$/,
- type: 'asset/inline',
+ type: 'asset/resource',
- generator: {
- dataUrl(content) {
- content = content.toString();
- return miniSVGDataURI(content);
- }
- },
use: 'svgo-loader'
},
자산 모듈의 출력 경로
기본적으로 모든 유형의
asset/resource
모듈은 출력 디렉토리의 루트 디렉토리(기본값은 dist
)로 전송됩니다.그러나 output.assetModuleFilename
을 사용하면 다음과 같은 동작을 변경할 수 있습니다.module.exports = {
+ output: {
+ assetModuleFilename: 'assets/[name][ext]'
+ },
// ...
};
출력:/dist/main.js
/dist/assets/logo.svg
참고로 [name]
을 [hash]
으로 교체하면 자산 장기 캐시에 완벽한 기반을 마련할 수 있습니다.module.exports = {
output: {
- assetModuleFilename: 'assets/[name][ext]'
+ assetModuleFilename: 'assets/[hash][ext]'
},
// ...
};
출력:/dist/main.js
/dist/assets/eb4c5fa504857.svg
또한 특정 자산 규칙을 assetModuleFilename
으로만 변경할 수 있습니다.예를 들어 우리는svg 아이콘을 dist/icons
에 발사하고 나머지 자산 모듈을 dist/assets
에 발사할 수 있다. {
test: /\.svg$/,
type: 'asset/resource',
+ generator: {
+ filename: 'icons/[hash][ext]'
+ },
use: 'svgo-loader'
출력:/dist/main.js
/dist/assets/fd441ca8b6d00.png
/dist/icons/eb4c5fa504857.svg
자산 / 출처
raw-loader처럼.
type: 'asset/source'
규칙과 일치하는 모든 모듈은 변환 없이 내부 연결됩니다(있는 그대로).file.txt
hello world
webpack.config.js
module.exports = {
// ...
{
test: /\.svg$/,
type: 'asset/resource',
generator: {
filename: 'icons/[hash][ext]'
},
use: 'svgo-loader'
},
+ {
+ test: /\.txt$/,
+ type: 'asset/source'
+ },
// ...
index.js
import './styles.css';
+ import txt from './file.txt';
+ console.log(txt); // hello world
출력:/dist/main.js
/dist/icons/eb4c5fa504857.svg
자산.
asset/resource
과 asset/inline
을 합병하다.다음 논리에 따라 정책을 선택합니다. 모듈 크기가 8kb (기본값) 보다 크면 asset/resource
정책을 사용하고, 그렇지 않으면 asset/inline
정책을 사용합니다.module.exports = {
// ...
{
test: /\.svg$/,
- type: 'asset/resource',
+ type: 'asset'
- generator: {
- filename: 'icons/[hash][ext]'
- },
use: 'svgo-loader'
},
{
test: /\.txt$/,
type: 'asset/source'
},
// ...
asset/inline
정책 사용 제한 사항이 무시될 수 있습니다. {
test: /.svg$/,
type: 'asset',
+ parser: {
+ dataUrlCondition: {
+ maxSize: 20 * 1024 // 20kb
+ }
+ },
use: 'svgo-loader'
},
전체적으로 말하자면 웹 패키지 5 자산 모듈은 습관적인 로드 프로그램을 버릴 수 있다. 왜냐하면 그의 기능은 상자를 열면 바로 사용할 수 있기 때문이다.완전한 예는 here에서 찾을 수 있다.
5번 홈페이지는 언제 출판됩니까?
우리는 날짜를 모른다.내가 이 안내서를 썼을 때 웹 패키지 5는
beta.13
버전으로 사용자의 피드백을 수집하고 있었다.프로젝트를 웹 패키지 5로 이전할 수 있습니다. (생산, 위험 부담에 사용)너는 더 많은 here을 읽을 수 있다붓을 대다
나는 웹 패키지 5의 새로운 기능과 웹 패키지 자체를 계속 토론할 계획이다.어떤 문장은 더 크고, 어떤 문장은 더 작을 것이다.나의 홈페이지에서 매우 작은 주석을 볼 수 있다.
고마워요 고마워요
Reference
이 문제에 관하여(5페이지 - 자산 모듈), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/smelukov/webpack-5-asset-modules-2o3h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)