Webpack 최적화 - 프로덕션 준비가 된 React 앱
15030 단어 webpackreactproductivityjavascript
이 블로그에 사용된 코드/구성은 this 저장소에서 사용할 수 있습니다.
React 애플리케이션을 위한 간단한 webpack.config.js는 다음과 같습니다.
const path = require('path');
const HtmlWebPackPlugin = require('html-webpack-plugin');
module.exports = {
output: {
path: path.resolve(__dirname, 'build'),
filename: 'bundle.js',
},
resolve: {
modules: [path.join(__dirname, 'src'), 'node_modules'],
alias: {
react: path.join(__dirname, 'node_modules', 'react'),
},
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
},
},
{
test: /\.css$/,
use: [
{
loader: 'style-loader',
},
{
loader: 'css-loader',
},
],
},
{ // If you are not using less ignore this rule
test: /\.less$/,
use: [
{
loader: 'style-loader',
},
{
loader: 'css-loader',
},
{
loader: 'less-loader',
},
],
},
],
},
plugins: [
new HtmlWebPackPlugin({
template: './index.html',
}),
],
};
기본적으로 위의 구성으로 webpack은 하나의 JS 번들 파일을 생성합니다. 대규모 프로젝트/애플리케이션의 경우 이 번들 크기가 매우 커집니다(MiB 단위). 따라서 단일 번들을 여러 청크로 분할하고 필요할 때만 로드하는 것이 필수적입니다.
React에서 lazy loading이 들어오는 곳입니다. 기본적으로 필요할 때만 구성 요소를 가져옵니다. 경로 수준의 지연 로딩 구성 요소는 좋은 시작입니다.
구성 요소를 지연 로드할 때 webpack은 추가 구성 없이 경로를 기반으로 여러 번들 파일을 생성합니다.
번들에 대한 해시 파일 이름을 사용할 수 있으며, 이는 해당 특정 청크에서 수정을 수행한 후 앱을 빌드할 때만 변경됩니다. 따라서 변경 사항이 없으면 동일한 해시가 유지되고 브라우저는 캐시에서 해당 번들 파일을 제공합니다. 다른 해시 옵션은 this을 참조하십시오.
output: {
path: path.resolve(__dirname, 'build'),
filename: '[name].[chunkhash].bundle.js',
}
웹팩에서 추가 구성 없이 경로를 기반으로 번들을 분할하는 것이 좋지만 여전히 기본 번들에는 모든 공급업체 코드(node_modules)가 포함되어 있습니다. 몇 가지 구성을 추가하여 webpack에 번들을 추가로 추가하는 방법을 알려줄 수 있습니다.
optimization: {
splitChunks: {
cacheGroups: {
vendors: {
test: /node_modules\/(?!antd\/).*/,
name: "vendors",
chunks: "all",
},
// This can be your own design library.
antd: {
test: /node_modules\/(antd\/).*/,
name: "antd",
chunks: "all",
},
},
},
runtimeChunk: {
name: "manifest",
},
}
구성을 살펴보겠습니다.
optimization.splitChunks.cacheGroups
는 청크를 정의하는 곳입니다. 여기서는 vendors
(Ant Design은 UI 구성 요소 라이브러리임)를 제외하고 node_modules
의 모든 종속성에 대해 청크 이름antd
을 사용했고 Ant 디자인 종속성에만 청크 이름antd
을 사용했습니다.공급업체를 분리하는 이유는 프로젝트가 성숙해지면 새 종속성을 자주 추가하지 않기 때문에 청크 파일 이름 해시가 모든 빌드에 대해 변경되지 않고 브라우저가 이 공급업체 청크를 제공할 수 있기 때문입니다. 캐시에서.
antd는 구성 요소를 자주 추가/업데이트하는 자체 설계 라이브러리가 될 수 있으므로 이 청크의 변경 사항이 공급업체 청크 해시에 영향을 미치지 않아야 하기 때문에 벤더 청크에서 antd를 분리했습니다.
또한 웹팩이 유지 관리하는 매니페스트를 추출하여 애플리케이션을 실행하는 데 필요한 정보를 포함했습니다.
빌드 출력을 확인했다면 공급업체 청크가 노란색으로 강조 표시되고 [big]으로 표시됩니다. Webpack은 번들 크기가 244KiB보다 큰 경우 경고하도록 구성되어 있습니다. 어쨌든 번들을 gzip으로 압축하고 네트워크를 통해 전송해야 하므로 이 경고를 무시해도 됩니다. 이 gzip 인코딩은 netlify, serve과 같은 일부 정적 파일 서버에서 기본적으로 수행되며 다른 서버AWS CloudFront에서 구성하기 쉽습니다.
어쨌든, gzip을 압축하고 웹팩이 계산을 위해 gzip 파일을 사용하도록 지시하려면 아래 구성을 추가할 수 있습니다.
const CompressionPlugin = require('compression-webpack-plugin');
plugins: [
new CompressionPlugin({
test: /\.js(\?.*)?$/i,
}),
],
performance: {
hints: "warning",
// Calculates sizes of gziped bundles.
assetFilter: function (assetFilename) {
return assetFilename.endsWith(".js.gz");
},
}
요약하자면,
전체 웹팩 구성을 볼 수 있습니다here.
그게 다야, 여러분, 이 블로그를 읽어주셔서 감사합니다. 도움이 되었기를 바랍니다. 귀하의 질문과 제안에 의견을 보내주십시오.
참조:
Reference
이 문제에 관하여(Webpack 최적화 - 프로덕션 준비가 된 React 앱), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/nikhilkumaran/webpack-optimizations-production-ready-react-app-1jl3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)