[解決済み] Webpackでベンダースクリプトを個別にバンドルし、必要に応じて要求する方法とは?
質問
可能なはずのことをしようとしているのですが、webpackのドキュメントを見ただけでは、どうすればいいのかよくわかりません。
私は、互いに依存するかどうかわからないいくつかのモジュールでJavaScriptライブラリを書いています。その上、jQueryはすべてのモジュールで使用され、そのうちのいくつかはjQueryプラグインを必要とするかもしれません。このライブラリは、いくつかの異なるウェブサイトで使用され、それらのモジュールの一部または全部を必要とする可能性があります。
モジュール間の依存関係を定義するのはとても簡単でしたが、サードパーティーの依存関係を定義するのは、予想以上に難しいようです。
実現したいこと 各アプリに2つのバンドルファイルを用意し、1つには必要なサードパーティの依存関係を、もう1つには私のライブラリから必要なモジュールを入れたいのです。
例 : 私のライブラリに以下のようなモジュールがあるとします。
- a (requires: jquery, jquery.plugin1)
- b (requires: jquery, a)
- c (requires: jquery, jquery.ui, a, b)
- d (requires: jquery, jquery.plugin2, a)
そして、モジュール a、b、c を必要とするアプリ(ユニークなエントリーファイルとして見てください)があります。この場合、Webpack は以下のファイルを生成する必要があります。
- ベンダバンドル : jquery、jquery.plugin1、jquery.ui が含まれます。
- ウェブサイトバンドル : モジュールa,b,c付きです。
結局のところ、私はjQueryをグローバルにすることで、すべてのファイルでrequireする必要がなくなることを望んでいる(たとえば、メインファイルでのみrequireすることができる)。そして、jQueryプラグインは、それらが必要とされる場合に、$グローバルを拡張するだけでよい(それらを必要としない他のモジュールで利用可能であれば問題ない)。
これが可能だとして、この場合のwebpackの設定ファイルの例はどのようなものでしょうか?設定ファイル上でローダー、エクスターナル、プラグインの組み合わせをいくつか試しましたが、それらが何をしているのか、どれを使えばいいのかがよくわかりません。ありがとうございます。
解決方法は?
webpack.config.js (Version 1,2,3) ファイルに、次のような記述があります。
function isExternal(module) {
var context = module.context;
if (typeof context !== 'string') {
return false;
}
return context.indexOf('node_modules') !== -1;
}
をプラグイン配列に追加しました。
plugins: [
new CommonsChunkPlugin({
name: 'vendors',
minChunks: function(module) {
return isExternal(module);
}
}),
// Other plugins
]
これで、サードパーティのライブラリを必要に応じて1つのファイルにだけ追加するファイルができました。
もし、もっと細かくベンダーとエントリーポイントのファイルを分けたいなら。
plugins: [
new CommonsChunkPlugin({
name: 'common',
minChunks: function(module, count) {
return !isExternal(module) && count >= 2; // adjustable
}
}),
new CommonsChunkPlugin({
name: 'vendors',
chunks: ['common'],
// or if you have an key value object for your entries
// chunks: Object.keys(entry).concat('common')
minChunks: function(module) {
return isExternal(module);
}
})
]
プラグインの順番は非常に重要であることに注意してください。
また、これはバージョン4で変更される予定です。それが正式に決まったら、この回答を更新します。
更新してください。 Windowsユーザ向けのindexOf検索の変更
関連
-
JavaScriptにおけるマクロタスクとミクロタスクの詳細
-
Vueはランニングライト形式のテキストを水平方向にスクロールする機能を実装している
-
[解決済み】Node Version Manager のインストール - nvm コマンドが見つかりません。
-
[解決済み】TypeErrorの解決方法。未定義またはヌルをオブジェクトに変換できない
-
[解決済み】JavaScript TypeError: null のプロパティ 'style' を読み取ることができない
-
[解決済み】無効な設定オブジェクトです。APIスキーマと一致しない設定オブジェクトを使用してWebpackが初期化されました。
-
jq は html ページとデータを動的に分割する。
-
[解決済み] JavaScriptで整数の除算を行い、余りを別途取得する方法は?
-
[解決済み] webpackでjQueryプラグインの依存関係を管理する
-
[解決済み] 同じページで複数のバージョンのjQueryを使用することはできますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Vueはランニングライト形式のテキストを水平方向にスクロールする機能を実装している
-
Vue+ElementUIによる大規模なフォームの処理例
-
WeChatアプレット用ユニアプリによるグローバルシェアリング
-
Vueにシンプルなメモ帳機能を実装
-
vueが定義するプライベートフィルタと基本的な使い方
-
[解決済み】GETできない / Nodejsエラー
-
[解決済み] Web API エラー - このリクエストはブロックされました; コンテンツは HTTPS で提供されなければなりません
-
[解決済み】ERROR エラーです。スイッチのname属性が指定されていないフォームコントロールの値アクセッサがない
-
[解決済み】React Uncaught Error: 対象コンテナが DOM 要素でない [重複]。
-
[解決済み】エラー。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりませんでした。