React と Webpack を使用してパッケージングを最適化するにはどうすればよいですか?
この記事では、React + Webpack の構築とパッケージ化の最適化について紹介し、参考にしていきます。
babel -react-optimize を使用して React コードを最適化します
未使用のライブラリをチェックし、インポート参照を削除します
lodash、echart などの使用ライブラリをオンデマンドでパッケージ化します
lodash は babel-plugin を使用して最適化できます-ロダッシュ。
は、babel-react-optimizeのbabel-plugin-transform-react-remove-prop-typesプラグインを使用することに注意してください。通常、コード内でコンポーネントの PropType を参照しなくても、まったく問題ありません。このプラグインをコンポーネントで使用すると、問題が発生する可能性があります。
詳細については、次を参照してください:
https://github.com/oliviertassinari/babel-plugin-transform-react-remove-prop-types#is-it-safe
Webpack のビルドとパッケージの最適化Webpackビルドとパッケージの存在 問題は主に次の 2 つの側面に焦点を当てています:
- Webpack のビルドが遅い
- Webpack のパッケージ化されたファイルのサイズが大きすぎる
Webpack.DDLPlugin および HappyPack ビルド速度を向上させます。詳細については、DMP DDLPlugin に関する Xiaoming のドキュメントを参照してください。元のテキストは次のとおりです:
Webpack.DLLPlugin
webpack.dll.config.js の追加
は主に DllPlugin プラグインを使用して、いくつかのサードパーティ リソースを個別にパッケージ化し、それらを manages.json 構成ファイルに配置します。
このように、コンポーネントでの更新後、これらのサードパーティ リソースは再構築されません
- 同時に、dll/vendors.js ファイルは独立して構成され、webpack.dll.config に提供されます。 .js
- package.json
- を変更します スクリプトに「dll」:「webpack --config webpack.dll.config.js --progress --colors」を追加します。
npm run dllを実行すると、dllディレクトリにvendor-manifest.jsonとvendor.dll.jsの2つのファイルが生成されます
webpack.dev.config.jsファイルを設定し、DllReferencePluginプラグインを追加して指定しますベンダーマニフェスト .json ファイル
new webpack.DllReferencePlugin({ context: join(__dirname, 'src'), manifest: require('./dll/vendor-manifest.json') })
html を変更します
<% if(htmlWebpackPlugin.options.NODE_ENV ==='development'){ %> <script src="dll/vendor.dll.js"></script> <% } %>
htmlWebpackPlugin プラグインの NODE_ENV パラメータを設定する必要があることに注意してください
Happypackマルチスレッド、キャッシュなどを通じてリビルド効率を向上させます。 https:// github.com/amireh/happypack
webpack.dev.config.js でさまざまなリソースに対して複数の HappyPack (1 js、1 less など) を作成し、id を設定します
new HappyPack({ id: 'js', threadPool: happyThreadPool, cache: true, verbose: true, loaders: ['babel-loader?babelrc&cacheDirectory=true'], }), new HappyPack({ id: 'less', threadPool: happyThreadPool, cache: true, verbose: true, loaders: ['css-loader', 'less-loader'], })
module.rules で happypack/loader として使用するように設定します。 ID を設定します
{ test: /\.js$/, use: [ 'happypack/loader?id=js' ], exclude: /node_modules/ }, { test: /\.less$/, loader: extractLess.extract({ use: ['happypack/loader?id=less'], fallback: 'style-loader' }) }
まず、バンドル全体、バンドルの構成要素、および各コンポーネントのサイズを分析する必要があります。
ここでは Webpack-bundle-analyzer をお勧めします。インストール後、プラグインを webpack.dev.config.js に追加するだけで、以下に示すように、各起動後に分析結果が Web サイト上で自動的に開かれます
plugins.push( new BundleAnalyzerPlugin());
さらに、パッケージ化プロセスはjson ファイルとして出力されます
webpack --profile --json -> stats.json
次に、分析のために次の 2 つの Web サイトに移動します
- webpack/analyse
- Webpack Chart
- 上記のチャート分析を通じて、バンドル全体のコンポーネントが明確に確認できます。 .js と対応するサイズ。
bundle.js サイズが過剰になる問題の解決策は次のとおりです:
- 本番環境で圧縮とその他のプラグインを有効にし、不要なプラグインを削除します
- ビジネスコードとサードパーティを分割しますライブラリとパブリック モジュール
- webpack gzip 圧縮を有効にする
- オンデマンドでロードする
- 実稼働環境で圧縮とその他のプラグインを有効にし、不要なプラグインを削除する
必ず webpack.DefinePlugin を起動し、運用環境の webpack.optimize.UglifyJsPlugin。
const plugins = [ new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production') }), new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false, drop_console: false //eslint-disable-line } }) ]
プロジェクトのビジネス コードは非常に頻繁に変更されるため、サードパーティ ライブラリのコードの変更頻度は比較的低くなります。ビジネス コードと 3 番目のライブラリが同じチャンクにパッケージ化されている場合、ビルドごとに、ビジネス コードが 1 行だけ変更された場合でも、サードパーティ ライブラリのコードが変更されなかった場合でも、チャンク全体のハッシュは前回とは異なります。これは私たちが望む結果ではありません。私たちが望んでいるのは、サードパーティ ライブラリのコードが変更されない場合、構築時に対応するハッシュが変更されないことを確認し、ブラウザ キャッシュを使用してページ読み込みのパフォーマンスを向上させ、ページ読み込みを短縮できるようにすることです。時間。
そのため、3 番目のライブラリのコードをベンダー チャンクに個別に分割し、ビジネス コードから分離することができます。このように、ビジネス コードがどのように変更されても、サードパーティのライブラリ コードが変更されない限り、対応するハッシュは変更されません。
まず、エントリは 2 つのアプリとベンダーの 2 つのチャンクを構成します
entry: { vendor: [path.join(__dirname, 'dll', 'vendors.js')], app: [path.join(__dirname, 'src/index')] }, output: { path: path.resolve(__dirname, 'build'), filename: '[name].[chunkhash:8].js' },
ここで、vendros.js は、ベンダーにどのサードパーティ ライブラリを含める必要があるかを独自に定義したものです。次のとおりです。
require('babel-polyfill'); require('classnames'); require('intl'); require('isomorphic-fetch'); require('react'); require('react-dom'); require('immutable'); require('redux');
次に、CommonsChunkPlugin を通じて 3 番目のライブラリを分割します
plugins.push( // 拆分第三方库 new webpack.optimize.CommonsChunkPlugin({ name: 'vendor' }), // 拆分 webpack 自身代码 new webpack.optimize.CommonsChunkPlugin({ name: 'runtime', minChunks: Infinity }) );
上面的配置有两个细节需要注意
使用 chunkhash 而不用 hash
单独拆分 webpack 自身代码
使用 chunkhash 而不用 hash
先来看看这二者有何区别:
hash 是 build-specific ,任何一个文件的改动都会导致编译的结果不同,适用于开发阶段
chunkhash 是 chunk-specific ,是根据每个 chunk 的内容计算出的 hash,适用于生产
因此为了保证第三方库不变的情况下,对应的 vendor.js 的 hash 也要保持不变,我们再 output.filename 中采用了 chunkhash
单独拆分 webpack 自身代码
Webpack 有个已知问题:
webpack 自身的 boilerplate 和 manifest 代码可能在每次编译时都会变化。
这导致我们只是在 入口文件 改了一行代码,但编译出的 vendor 和 entry chunk 都变了,因为它们自身都包含这部分代码。
这是不合理的,因为实际上我们的第三方库的代码没变,vendor 不应该在我们业务代码变化时发生变化。
因此我们需要将 webpack 这部分代码分离抽离
new webpack.optimize.CommonsChunkPlugin({ name: "runtime", minChunks: Infinity }),
其中的 name 只要不在 entry 即可,通常使用 "runtime" 或 "manifest" 。
另外一个参数 minChunks 表示:在传入公共chunk(commons chunk) 之前所需要包含的最少数量的 chunks。数量必须大于等于2,或者少于等于 chunks的数量,传入 Infinity 会马上生成 公共chunk,但里面没有模块。
拆分公共资源
同 上面的拆分第三方库一样,拆分公共资源可以将公用的模块单独打出一个 chunk,你可以设置 minChunk 来选择是共用多少次模块才将它们抽离。配置如下:
new webpack.optimize.CommonsChunkPlugin({ name: 'common', minChunks: 2, }),
是否需要进行这一步优化可以自行根据项目的业务复用度来判断。
开启 gzip
使用 CompressionPlugin 插件开启 gzip 即可:
// 添加 gzip new CompressionPlugin({ asset: '[path].gz[query]', algorithm: 'gzip', test: /\.(js|html)$/, threshold: 10240, minRatio: 0.8 })
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
以上がReact と Webpack を使用してパッケージングを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











React と WebSocket を使用してリアルタイム チャット アプリケーションを構築する方法 はじめに: インターネットの急速な発展に伴い、リアルタイム コミュニケーションがますます注目を集めています。ライブチャット アプリは、現代の社会生活や仕事生活に不可欠な部分になっています。この記事では、React と WebSocket を使用して簡単なリアルタイム チャット アプリケーションを構築する方法と、具体的なコード例を紹介します。 1. 技術的な準備 リアルタイム チャット アプリケーションの構築を開始する前に、次のテクノロジとツールを準備する必要があります。 React: 構築用の 1 つ

React フロントエンドとバックエンドの分離ガイド: フロントエンドとバックエンドの分離と独立したデプロイメントを実現する方法、特定のコード例が必要です 今日の Web 開発環境では、フロントエンドとバックエンドの分離がトレンドになっています。フロントエンド コードとバックエンド コードを分離することで、開発作業がより柔軟かつ効率的になり、チームのコラボレーションが促進されます。この記事では、React を使用してフロントエンドとバックエンドの分離を実現し、それによって分離と独立したデプロイの目標を達成する方法を紹介します。まず、フロントエンドとバックエンドの分離とは何かを理解する必要があります。従来の Web 開発モデルでは、フロントエンドとバックエンドが結合されています。

React と Flask を使用してシンプルで使いやすい Web アプリケーションを構築する方法 はじめに: インターネットの発展に伴い、Web アプリケーションのニーズはますます多様化および複雑化しています。使いやすさとパフォーマンスに対するユーザーの要件を満たすために、最新のテクノロジー スタックを使用してネットワーク アプリケーションを構築することがますます重要になっています。 React と Flask は、フロントエンドおよびバックエンド開発用の 2 つの非常に人気のあるフレームワークであり、うまく連携してシンプルで使いやすい Web アプリケーションを構築します。この記事では、React と Flask を活用する方法について詳しく説明します。

React と RabbitMQ を使用して信頼性の高いメッセージング アプリケーションを構築する方法 はじめに: 最新のアプリケーションは、リアルタイム更新やデータ同期などの機能を実現するために、信頼性の高いメッセージングをサポートする必要があります。 React はユーザー インターフェイスを構築するための人気のある JavaScript ライブラリであり、RabbitMQ は信頼性の高いメッセージング ミドルウェアです。この記事では、React と RabbitMQ を組み合わせて信頼性の高いメッセージング アプリケーションを構築する方法を紹介し、具体的なコード例を示します。 RabbitMQ の概要:

ReactRouter ユーザーガイド: フロントエンドルーティング制御の実装方法 シングルページアプリケーションの人気に伴い、フロントエンドルーティングは無視できない重要な部分になりました。 React エコシステムで最も人気のあるルーティング ライブラリとして、ReactRouter は豊富な機能と使いやすい API を提供し、フロントエンド ルーティングの実装を非常にシンプルかつ柔軟にします。この記事では、ReactRouter の使用方法と具体的なコード例を紹介します。 ReactRouter を最初にインストールするには、次のものが必要です

React と Google BigQuery を使用して高速データ分析アプリケーションを構築する方法 はじめに: 今日の情報爆発の時代において、データ分析はさまざまな業界で不可欠なリンクとなっています。中でも、高速かつ効率的なデータ分析アプリケーションを構築することは、多くの企業や個人が追求する目標となっています。この記事では、React と Google BigQuery を使用して高速データ分析アプリケーションを構築する方法を紹介し、詳細なコード例を示します。 1. 概要 React はビルドするためのツールです

React と Apache Kafka を使用してリアルタイム データ処理アプリケーションを構築する方法 はじめに: ビッグ データとリアルタイム データ処理の台頭により、リアルタイム データ処理アプリケーションの構築が多くの開発者の追求となっています。人気のあるフロントエンド フレームワークである React と、高性能分散メッセージング システムである Apache Kafka を組み合わせることで、リアルタイム データ処理アプリケーションを構築できます。この記事では、React と Apache Kafka を使用してリアルタイム データ処理アプリケーションを構築する方法を紹介します。

PHP、Vue、React: 最適なフロントエンド フレームワークを選択するには?インターネット技術の継続的な発展に伴い、フロントエンド フレームワークは Web 開発において重要な役割を果たしています。 PHP、Vue、React は 3 つの代表的なフロントエンド フレームワークであり、それぞれに独自の特徴と利点があります。使用するフロントエンド フレームワークを選択するとき、開発者はプロジェクトのニーズ、チームのスキル、個人の好みに基づいて情報に基づいた決定を下す必要があります。この記事では、PHP、Vue、React の 3 つのフロントエンド フレームワークの特徴と用途を比較します。
