webpackコード断片化の実装

webpackコード断片化の実装

背景

高性能なアプリケーションを実現する上で最も重要なポイントの 1 つは、ユーザーが可能な限り毎回必要なリソースのみを読み込むようにすることです。優先度が高すぎないリソースは、遅延読み込みなどのテクノロジを使用して段階的に取得し、ページの最初の画面速度を確保する必要があります。コード シャーディングは、webpck パッケージング ツールに固有のテクノロジです。この機能により、コードを特定の形式に分割できるため、ユーザーは一度にすべてのコードをロードする必要はなく、必要に応じてロードできます。

コモンズチャンクプラグイン

このプラグインは webpack4 では推奨されなくなりましたが、それでも理解しておく必要があります。このプラグインは、複数のチャンクから共通部分を抽出できます。共通モジュールの抽出は、複数のプロジェクトにさまざまな利点をもたらします。

  • 開発プロセスではモジュールのパッケージ化の繰り返しが削減され、開発速度が向上します。
  • 全体的なリソース サイズを削減します。
  • 適切にセグメント化されたコードにより、クライアント キャッシュをより効果的に使用できます。

このプラグインのデフォルトのルールでは、モジュールが 2 つのエントリ チャンクで使用されている限り、そのモジュールは抽出されます。たとえば、a と b が react を使用している限り、react が抽出されます。しかし、まだいくつか欠点があります:

  • CommonChunkPlugin は 1 つのベンダーのみを抽出できます。複数のベンダーを抽出する場合は、複数のプラグインを構成する必要があり、重複する構成コードが大量に追加されます。
  • 先ほど述べたメインフェストでは、実際にはブラウザにもう 1 つのリソースが読み込まれるため、ページのレンダリング速度が低下します。
  • いくつかの内部設計上の欠陥により、CommonChunkPlugin は共通モジュールを抽出するときに元のチャンク内のモジュールの依存関係を破壊し、それ以上の最適化を実行することが困難になります。

分割チャンク

これは、CommonChunkPlugin のコード分割機能を改善し、再設計して実装した webpack の新機能です。CommonChunkPlugin よりも強力であるだけでなく、よりシンプルで使いやすくなっています。コードは次のとおりです

モジュール.エクスポート = {
    エントリ: './foo.js',
    出力: {
        ファイル名: 'foo.js',
        パブリックパス: '/dist/'
    },
    モード: '開発'、
    最適化:
        分割チャンク: {
            チャンク: 'すべて'、
        }
    }
}

// .js で始まる
'react' から React をインポートします。
'./bar.js' をインポートします。
document.write('foo.js', React.version);

//バー.js
'react' から react をインポートします。
console.log('bar.js', React.version);

splitChunk のデフォルトの抽出条件は次のとおりです。

  • 抽出されたチャンクは共有することも、node_modules ディレクトリから取得することもできます。これは理解しやすいです。複数回参照されるモジュールや node_modules にあるモジュールは共通モジュールである傾向があり、抽出に適しています。
  • 抽出された js チャンクは、対応するサイズ、たとえば 30KB より大きいサイズになります。CSS チャンクのサイズが 50KB より大きい場合も、比較的簡単に理解できます。抽出されたリソースのサイズが小さすぎる場合、最適化の効果は平均的になります。
  • オンデマンド読み込みプロセス中、並行して要求されるリソースの最大数は 5 以下です。オンデマンド読み込みとは、スクリプト タグを動的に挿入してスクリプトを読み込むことを意味します。通常、各リクエストにはリンクを確立して解放するコストがかかるため、同時に多くのリソースをロードすることは望ましくありません。そのため、抽出ルールは、並列リクエストがあまり多くない場合にのみ有効になります。
  • 最初の読み込み時に、並行して要求されるリソースの最大数は 3 以下です。これは前の項目と似ていますが、ページが初めて読み込まれるときはパフォーマンス要件が高くなることが多いため、ここでのデフォルトのしきい値も低くなります。

構成

分割チャンク: {
    チャンク: 'async'、
    最小サイズ: {
        ジャバスクリプト: 30000,
        スタイル: 50000,
    },
    最大サイズ: 0,
    最小チャンク数: 1,
    最大非同期リクエスト: 5,
    最大初期リクエスト数: 3,
    自動名前区切り文字: '~',
    名前: 真、
    キャッシュグループ:
        ベンダー:
            テスト: /[\\/]node_modules[\\/]/,
            優先度: -10、
        },
        デフォルト: {
            最小チャンク数: 2,
            優先度: -20、
            既存のチャンクを再利用: true
        }
    }
}

マッチングパターン
チャンクには、async(デフォルト)、initial、all の 3 つの値があります。 async は非同期チャンクのみを抽出し、initial はエントリチャンクのみで動作し、all は両方のモードを同時に有効にします (推奨)

一致する条件
minSize、minChunks、maxAsyncRequests、maxInitialRequests

名前
デフォルトは true です。つまり、新しく生成されたチャンクは、cacheGroups とスコープに従って自動的に名前が付けられ、automaticNameDelimiter によって区切られます。

キャッシュグループ
これは、チャンクを分割するためのルールとして理解できます。デフォルトでは、ベンダーとデフォルトの 2 つのルールがあります。ベンダー
これは、node_modules 内のすべての修飾されたモジュールを抽出するために使用され、複数回参照されるモジュールには default が使用されます。これらのルールを追加または変更できます。ルールを無効にする場合は、false に設定することもできます。モジュールが同時に複数の cacheGroups に準拠する場合、優先度構成項目を使用して優先度が決定されます。

リソースを非同期に読み込む

非同期リソース読み込みによって解決される主な問題は、モジュールが多すぎてリソース サイズが大きすぎる場合に、一時的に使用されていない一部のモジュールの読み込みが遅れる可能性があることです。この方法では、ページが初めてレンダリングされるときにユーザーがダウンロードするリソースが可能な限り小さくなり、後続のモジュールは必要に応じて読み込まれるようにトリガーされるため、一般的にオンデマンド読み込みと呼ばれます。
webpack には、import (webapck2 以降) と require.ensure (webapck1) という 2 つの非同期読み込みメソッドがあります。import と es6 モジュールの違いは、トップレベルの読み込みを必要とせず、使用するとすぐに読み込むことができることです。これは単なる単純な関数呼び出しなので、ここではこれ以上の説明はありません。

要約する

コードを分割する方法はいくつかあります(CommonChunkPlugin または SplitChunks、および非同期リソースの読み込み)。これらの方法を利用することで、リソース サイズを効果的に削減できると同時に、キャッシュをより有効に活用して、ユーザーにとってより使いやすいエクスペリエンスを提供できます。

webpack コードスライシングの実装に関するこの記事はこれで終わりです。より関連性の高い webpack コードスライシングのコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。皆様、今後とも 123WORDPRESS.COM を応援してください。

以下もご興味があるかもしれません:
  • Electron-vueはwebpackを使用して複数ページのエントリファイルをパッケージ化します
  • Webpack プロジェクトでローダー プラグインをデバッグする方法
  • Webpackプラグインを書いてnpmに公開するための80行のコード
  • Webpackを使用して複数ページのプログラムを構築するための実装手順
  • Webpack コンポーネントの使用状況統計を実装するための 50 行のコード
  • webpack -v エラー解決

<<:  MySQL ステートメントを使用した簡単な追加、削除、変更、クエリ操作の例

>>:  VMware に CentOS7 をインストールし (静的 IP アドレスを設定)、Docker コンテナ経由で mySql データベースをインストールする (非常に詳細なチュートリアル)

推薦する

Vueのログインとログアウトの詳細な説明

目次ログインビジネスプロセスログイン機能の実装要約するまず、エフェクトの実装プロセスを見てみましょう...

MySQLデータベースの増分バックアップのアイデアと方法

MySQL データベースの増分バックアップを実行するには、データベース構成ファイル /etc/my....

js を使用してネットワークカメラを呼び出し、一般的なエラーを処理します

最近、業務上の理由により、Web ページ上のさまざまなネットワーク カメラにアクセスしてデバッグする...

スライダー効果を実装するミニプログラム

この記事の例では、スライディングブロック効果を実現するための小さなプログラムの具体的なコードを参考ま...

シンプルなショッピングカート機能を実現するjs

この記事の例では、簡単なショッピングカート機能を実現するためのjsの具体的なコードを参考までに共有し...

Linux で Oracle データベースをバックアップするためのスケジュールされたタスクの設定に関するチュートリアル

1. データベースの文字セットを確認するデータベースの文字セットは、Linux で設定された環境変数...

JS はシンプルなカレンダー効果を実装します

この記事では、シンプルなカレンダー効果を実現するためのJSの具体的なコードを参考までに紹介します。具...

JavaScriptはクリックトグル機能を実装します

この記事の例では、クリックして切り替える機能を実装するためのJavaScriptの具体的なコードを参...

MYSQL ロック解除とロックテーブルの紹介

MySQL ロックの概要他のデータベースと比較すると、MySQL のロック メカニズムは比較的単純で...

HTMLで細い線のテーブルを作成する簡単な例

この細線の表を作成する方法については、Baidu で検索すると、表に対して border="...

WebページでjQueryを参照する方法

CDN(コンテンツ配信ネットワーク)を通じて参照できます。 jQuery は Google と Mi...

JavaScript タイマーの種類の概要

目次1.setInterval() 2.タイムアウトを設定する() 1.setInterval()指...

CentOS 7 で Docker のポート転送をファイアウォールと互換性のあるように設定する方法

CentOS 7 では、次のようなコマンドを使用してホスト ポートをコンテナー ポートにマッピングす...

体験をデザインする: ボタンには何があるか

<br />最近、UCDChina は「インターフェース上のテキストに注意を払う」という...

JavaScript axiosのインストールとパッケージ化のケースの詳細な説明

1. axiosプラグインをダウンロードする cnpm インストール axios -S 2. mai...