webpack学習(四)—code spliting
3843 ワード
何が
まず、第三者クラスは単独で包装します.第三者クラスの内容は基本的に変わらないので、業務コードと分離してもいいです.そうすると、クラスコードをクライアントにキャッシュして、要求を減らすことができます. は必要に応じてロードします. 共通モジュールは単独で包装します.コードの中にはいくつかの汎用モジュールがあるかもしれません.例えば、パチンコ、改ページ、共通の方法などです.他の業務コードモジュールはしばしばこれらの共通モジュールを参照しています. 以下、詳細に説明する.
どうやって
第三者クラス
私達のプロジェクトではよく第三のクラスの倉庫を使います.例えばは、 は、 必要に応じてロードするルーティングの割り当てが不合理であれば、多くの小さなファイルが包装されます.各ファイルは数 は、
問題
共通モジュール包装
この問題はネットで資料を調べましたが、特に良い案が見つかりませんでした.以下のように自分のためのいくつかの試みです.
同様に
しかし、このような方式はプロジェクトが複雑に依存している場合の効果はあまり理想的ではなく、ある部分のコードを一回だけ読み込むことができません.もっといい案がある人は教えてください.
(本文は終わり)
code splitting
ですか?まず、
code splitting
とは何ですか?私たちは包装する時、大きなbundle.js
(またはindex
)のファイルを生成します.このように、すべてのモジュールはこのbundle.js
ファイルに包装されます.最終的に作成されたファイルは比較的大きいです.code splitting
とは、ファイルをブロックに分割すること(chunk
)を意味し、webpack
は、いくつかの分割点(split point
)を定義し、これらの分割点に基づいてファイルをブロック化し、必要に応じてロードすることができるようにする.code splitting
の意味webpack
は、定義された分割点をサポートし、require.ensure
を介して必要に応じてロードする.2
で行うと、共通モジュールが重複して包装されます.この時は共通モジュールを個別に包装してもいいです.どうやって
code spliting
を行いますか?第三者クラス
私達のプロジェクトではよく第三のクラスの倉庫を使います.例えば
jquery
、bootstrap
などです.マルチエントランスを配置して、第三者のクラスを個別に包装してもいいです.以下の通りです.// entry
entry: {
index: './index',
vendor: ['jquery', 'bootstrap']
},
// plugins
plugins: [
new webpack.optimize.CommonsChunkPlugin("vendor", "vendor.bundle.js"),
]
説明CommonsChunkPlugin
は2つのパラメータを提供し、第1のパラメータは対応するchunk
名(chunk
はファイルブロック、entry
に対応する属性名)、第2のパラメータは生成されたファイル名である.このプラグインは2つのことをしました.vendor
が構成するモジュール(jquery
、bootstrap
)をvendor.bundle.js
にラッピングする.index
に存在するjquery
を、bootstrap
モジュールをファイルから削除する.このようにindex
には、純粋なトラヒックコードのみが残されている.backbone
に基づく単一ページアプリケーションを例にとると、router
において構成が必要に応じてロードされ得る.router.js
var Router = Backbone.Router.extend({
routes: {
'a': 'a',
'b': 'b'
},
a: function() {
require.ensure(['./a'], (require) => {
let a = require('./a');
//do something
})
},
b: function() {
require.ensure(['./b'], (require) => {
let b = require('./b');
//do something
})
}
})
上記のように、2つのファイルが表示され、a.js
とb.js
とが表示され、必要に応じてロードされます.a
にアクセスするときだけ、a.js
はロードされ、b
は同じ原理である.しかし、このやり方には二つの問題があります.k
しかないかもしれませんが、多くのネットワーク要求があります.a
モジュールおよびb
モジュールがc
モジュールを参照しているような、汎用モジュールの重複パッケージ化を引き起こすことがある.a
import 'c' from './c'
b
import 'c' from './c'
このように、パッケージ化されたa.js
およびb.js
の両方にc
モジュールのコードが含まれており、コードの冗長性が生じることが分かります.問題
1
については、webpack
が提供するプラグインによって解決することができる.// plugins :
plugins: [
new webpack.optimize.AggressiveMergingPlugin()
]
問題2
について:以下に説明するように解決することができる.共通モジュール包装
この問題はネットで資料を調べましたが、特に良い案が見つかりませんでした.以下のように自分のためのいくつかの試みです.
同様に
entry
およびcommonsChunkPlugin
を用いて処理される.以下のとおりです// entry
entry: {
index: './index',
common: ['./c', './d'], // c,d
vendor: ['jquery', 'bootstrap']
},
// plugin
plugins: [
new webpack.optimize.CommonsChunkPlugin(["common", "vendor"], "[name].js") //[name] 'common' 'vendor'
]
このようにすればcommon.js
とvendor.js
の2つのファイルが包装される.common
は汎用機能モジュールである.しかし、このような方式はプロジェクトが複雑に依存している場合の効果はあまり理想的ではなく、ある部分のコードを一回だけ読み込むことができません.もっといい案がある人は教えてください.
(本文は終わり)