ライブラリのコード分離
5172 ワード
一般的なアプリケーションでは、フレームワーク/機能の要件を満たすためにサードパーティ製ライブラリが使用されます.これらのライブラリの特定のバージョンを使用し、頻繁に変更することはありません.しかし、一方でアプリケーションコードは頻繁に変更されています.
サードパーティ製コードをアプリケーションにバンドルするのは非効率です.ブラウザはキャッシュヘッダに基づいてキャッシュできるため、キャッシュされたリソースファイルをキャッシュし、その内容が変更されない場合にcdnを再呼び出す必要はありません.これを利用して、アプリケーションコードがどのように変化しても、サードパーティファイルのハッシュ値を一定に保つことを望んでいます.
サードパーティ製パッケージとアプリケーションコードのパッケージを個別にパッケージ化する場合にのみ、これを行うことができます.
このサンプルプログラムmomentjs、一般的な時間フォーマットライブラリを見てみましょう.
以下に示すように、あなたのアプリケーションに
indexファイルでrequire
index.js
Webpackと次の構成でアプリケーションをパッケージ化できます.
webpack.config.js
アプリケーションで
これは理想的な効果ではありません.
マルチエントランス
では、
webpack.config.js
次に
そのため、プラグインを使用する必要があります.
これは非常に複雑なプラグインです.異なるパッケージからすべての共通モジュールを抽出し、共通パッケージに追加できます.パブリックパッケージが存在しない場合は、新しいパッケージがパブリックパッケージとして作成されます.
Webpackの構成を以下のように変更することで、
webpack.config.js
再実行
暗黙汎用vendorブロック
webpack.config.js
インベントリファイル
しかし、現在アプリケーションコードを変更し、
これは、vendorファイルのhash値がコンストラクションのたびに変更されるため、ブラウザキャッシュを使用していないことを意味します.これにより、ブラウザはファイルを再ロードする必要があります.
私たちが直面している問題は、構築のたびに、webpackが実行時コードを生成し、webpackの作業に役立つことです.単一のパケットのみがある場合、実行時コードはパケットに保持されます.しかし、複数のbundleを生成すると、実行時のコードが共通モジュールに抽出され、私たちの「vendor」ファイルになります.
このようなことを阻止するためには、ランタイムコードを別のリストファイルに抽出する必要があります.別のパッケージを作成する追加のオーバーヘッドがあっても、「vender」ファイルの長期キャッシュよりもメリットが大きいのは明らかです.
webpack.config.js
以上のwebpack構成に基づいて、
長期パケットキャッシュは、ハッシュポリシー「chunkhash」によって実現されることに留意されたい.もっと勉強しなさい
上一篇:CSSのコード分離
サードパーティ製コードをアプリケーションにバンドルするのは非効率です.ブラウザはキャッシュヘッダに基づいてキャッシュできるため、キャッシュされたリソースファイルをキャッシュし、その内容が変更されない場合にcdnを再呼び出す必要はありません.これを利用して、アプリケーションコードがどのように変化しても、サードパーティファイルのハッシュ値を一定に保つことを望んでいます.
サードパーティ製パッケージとアプリケーションコードのパッケージを個別にパッケージ化する場合にのみ、これを行うことができます.
このサンプルプログラムmomentjs、一般的な時間フォーマットライブラリを見てみましょう.
以下に示すように、あなたのアプリケーションに
moment
をインストールします.npm install --save moment
indexファイルでrequire
moment
を依存として出力し、現在の時間を以下に示します.index.js
var moment = require('moment');
console.log(moment().format());
Webpackと次の構成でアプリケーションをパッケージ化できます.
webpack.config.js
var path = require('path');
module.exports = function(env) {
return {
entry: './index.js',
output: {
filename: '[chunkhash].[name].js',
path: path.resolve(__dirname, 'dist')
}
}
}
アプリケーションで
webpack
を実行し、実行する構造パッケージをチェックすると、moment
とindex.js
がbundle.js
にパッケージ化されていることがわかります.これは理想的な効果ではありません.
index.js
のコードが変更されると、パケット全体が再構築されます.ブラウザは、ほとんど変更されていない場合でも、新しく構築されたパッケージのコピーをロードする必要があります.マルチエントランス
では、
moment
に別のエントリポイントを追加し、vendor
と名前を付けて最適化してみましょう.webpack.config.js
var path = require('path');
module.exports = function(env) {
return {
entry: {
main: './index.js',
vendor: 'moment'
},
output: {
filename: '[chunkhash].[name].js',
path: path.resolve(__dirname, 'dist')
}
}
}
次に
webpack
を実行すると、2つのパッケージが作成されていることがわかります.この2つのパケットをチェックすると、moment
のコードが2つのパケットに存在することがわかります!そのため、プラグインを使用する必要があります.
CommonsChunkPlugin
これは非常に複雑なプラグインです.異なるパッケージからすべての共通モジュールを抽出し、共通パッケージに追加できます.パブリックパッケージが存在しない場合は、新しいパッケージがパブリックパッケージとして作成されます.
Webpackの構成を以下のように変更することで、
CommonsChunkPlugin
プラグインを使用できます.webpack.config.js
var webpack = require('webpack');
var path = require('path');
module.exports = function(env) {
return {
entry: {
main: './index.js',
vendor: 'moment'
},
output: {
filename: '[chunkhash].[name].js',
path: path.resolve(__dirname, 'dist')
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor' // Specify the common bundle's name.
})
]
}
}
再実行
webpack
.moment
コードはvendorパケットにのみ存在する.暗黙汎用vendorブロック
CommonsChunkPlugin
インスタンスを構成してvendorライブラリのみを受け入れることができます.webpack.config.js
var webpack = require('webpack');
var path = require('path');
module.exports = function() {
return {
entry: {
main: './index.js'
},
output: {
filename: '[chunkhash].[name].js',
path: path.resolve(__dirname, 'dist')
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: function (module) {
// this assumes your vendor imports exist in the node_modules directory
return module.context && module.context.indexOf('node_modules') !== -1;
}
})
]
};
}
インベントリファイル
しかし、現在アプリケーションコードを変更し、
webpack
を再実行すると、vendorファイルのhash値が変更されたことがわかります.vendor
パッケージ・パッケージとmain
パッケージの個別パッケージ化を実現しても、アプリケーションコードが変更された場合vendor
パッケージは依然として変化していることがわかります.これは、vendorファイルのhash値がコンストラクションのたびに変更されるため、ブラウザキャッシュを使用していないことを意味します.これにより、ブラウザはファイルを再ロードする必要があります.
私たちが直面している問題は、構築のたびに、webpackが実行時コードを生成し、webpackの作業に役立つことです.単一のパケットのみがある場合、実行時コードはパケットに保持されます.しかし、複数のbundleを生成すると、実行時のコードが共通モジュールに抽出され、私たちの「vendor」ファイルになります.
このようなことを阻止するためには、ランタイムコードを別のリストファイルに抽出する必要があります.別のパッケージを作成する追加のオーバーヘッドがあっても、「vender」ファイルの長期キャッシュよりもメリットが大きいのは明らかです.
webpack.config.js
var webpack = require('webpack');
var path = require('path');
module.exports = function(env) {
return {
entry: {
main: './index.js',
vendor: 'moment'
},
output: {
filename: '[chunkhash].[name].js',
path: path.resolve(__dirname, 'dist')
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
names: ['vendor', 'manifest'] // Specify the common bundle's name.
})
]
}
};
以上のwebpack構成に基づいて、
vendor
,main
およびmanifest
の3つのパケットが生成することが分かる.長期パケットキャッシュは、ハッシュポリシー「chunkhash」によって実現されることに留意されたい.もっと勉強しなさい
上一篇:CSSのコード分離