Saya mencoba melakukan sesuatu yang saya yakini mungkin terjadi, tetapi saya benar-benar tidak mengerti bagaimana melakukannya hanya dari dokumentasi webpack.
Saya menulis perpustakaan JavaScript dengan beberapa modul yang mungkin atau tidak bergantung satu sama lain. Selain itu, jQuery digunakan oleh semua modul dan beberapa dari mereka mungkin memerlukan plugin jQuery. Pustaka ini kemudian akan digunakan pada beberapa situs web yang berbeda yang mungkin memerlukan beberapa atau semua modul.
Mendefinisikan dependensi antar modul saya sangat mudah, tetapi mendefinisikan dependensi pihak ketiga tampaknya lebih sulit dari yang saya harapkan.
Apa yang ingin saya capai : untuk setiap aplikasi saya ingin memiliki dua file bundel satu dengan dependensi pihak ketiga yang diperlukan dan lainnya dengan modul yang diperlukan dari perpustakaan saya.
Contoh : Mari kita bayangkan bahwa perpustakaan saya memiliki modul berikut:
- a (membutuhkan: jquery, jquery.plugin1)
- b (membutuhkan: jquery, a)
- c (membutuhkan: jquery, jquery.ui, a, b)
- d (membutuhkan: jquery, jquery.plugin2, a)
Dan saya punya aplikasi (melihatnya sebagai file entri unik) yang membutuhkan modul a, b dan c. Webpack untuk kasus ini harus menghasilkan file berikut:
- bundel vendor : dengan jquery, jquery.plugin1 dan jquery.ui;
- bundel situs web : dengan modul a, b dan c;
Pada akhirnya, saya lebih suka memiliki jQuery sebagai global jadi saya tidak perlu meminta itu pada setiap file tunggal (misalnya, saya hanya memerlukannya pada file utama). Dan plugin jQuery hanya akan memperpanjang $ global seandainya diperlukan (itu tidak masalah jika tersedia untuk modul lain yang tidak membutuhkannya).
Dengan asumsi ini mungkin, apa yang akan menjadi contoh file konfigurasi webpack untuk kasus ini? Saya mencoba beberapa kombinasi loader, eksternal, dan plugin pada file konfigurasi saya, tetapi saya tidak benar-benar mendapatkan apa yang mereka lakukan dan mana yang harus saya gunakan. Terima kasih!
sumber
Jawaban:
dalam file webpack.config.js (Versi 1,2,3) saya, saya punya
di array plugin saya
Sekarang saya memiliki file yang hanya menambahkan lib pihak ke tiga file seperti yang diperlukan.
Jika Anda ingin mendapatkan lebih banyak rincian tempat Anda memisahkan vendor dan file titik masuk Anda:
Perhatikan bahwa urutan plugin sangat penting.
Juga, ini akan berubah dalam versi 4. Ketika itu resmi, saya memperbarui jawaban ini.
Pembaruan: indexOf perubahan pencarian untuk pengguna windows
sumber
isExternal
diminChunks
buat hari saya. Bagaimana ini tidak didokumentasikan? Ada kerugiannya?options.minChunks (number|Infinity|function(module, count) -> boolean):
saya belum melihat sisi negatifnya.module.userRequest
(dan mungkin loader itu masuknode_modules
). Kode saya untukisExternal()
:return typeof module.userRequest === 'string' && !!module.userRequest.split('!').pop().match(/(node_modules|bower_components|libraries)/);
Saya tidak yakin apakah saya sepenuhnya memahami masalah Anda, tetapi karena saya memiliki masalah serupa baru-baru ini, saya akan mencoba membantu Anda.
Bundel vendor.
Anda harus menggunakan CommonsChunkPlugin untuk itu. dalam konfigurasi Anda menentukan nama chunk (eg
vendor
), dan nama file yang akan dihasilkan (vendor.js
).Sekarang bagian penting, Anda sekarang harus menentukan apa artinya
vendor
perpustakaan dan Anda melakukannya di bagian entri. Satu item lagi ke daftar entri dengan nama yang sama dengan nama chunk yang baru dinyatakan (yaitu 'vendor' dalam kasus ini). Nilai entri itu haruslah daftar semua modul yang ingin Anda pindahkan kevendor
bundel. dalam kasus Anda akan terlihat seperti:JQuery sebagai global
Punya masalah yang sama dan menyelesaikannya dengan ProvidPlugin . di sini Anda tidak mendefinisikan objek global tetapi semacam shurtcuts ke modul. yaitu Anda dapat mengkonfigurasinya seperti itu:
Dan sekarang Anda bisa menggunakan
$
di mana saja dalam kode Anda - webpack akan secara otomatis mengubahnya menjadiSaya harap ini membantu. Anda juga dapat melihat file konfigurasi webpack saya yaitu di sini
Saya suka webpack, tapi saya setuju bahwa dokumentasi itu bukan yang terbaik di dunia ... tapi hei .. orang-orang mengatakan hal yang sama tentang dokumentasi Angular pada awalnya :)
Edit:
Untuk mendapatkan potongan vendor khusus titik masuk, gunakan CommonsChunkPlugins beberapa kali:
dan kemudian mendeklarasikan pustaka extenral berbeda untuk file yang berbeda:
Jika beberapa perpustakaan tumpang tindih (dan sebagian besar dari mereka) antara titik masuk maka Anda dapat mengekstraknya ke file umum menggunakan plugin yang sama hanya dengan konfigurasi yang berbeda. Lihat contoh ini .
sumber
Jika Anda tertarik untuk menggabungkan skrip Anda secara terpisah dari skrip vendor:
Anda dapat membaca lebih lanjut tentang fitur ini di dokumentasi resmi .
sumber
vendor : Object.keys(pkg.dependencies)
ini tidak selalu berfungsi dan tergantung pada bagaimana paket dibuat.package.json
diatur. Penanganan masalah ini berfungsi dalam banyak kasus tetapi ada pengecualian di mana Anda harus mengambil jalan yang berbeda. Mungkin menarik untuk mengirim jawaban Anda sendiri ke pertanyaan untuk membantu komunitas.Object.keys(pkg.dependencies)
akan menggabungkan semuanya !!!! katakanlah Anda memiliki banyak loader yang terdaftar di sana ... ya itu akan dimasukkan !!! jadi berhati-hatilah ... pisahkan dengan hati-hati apa itu devDependency dan apa dependensidependencies
?Juga tidak yakin apakah saya sepenuhnya memahami kasus Anda, tetapi di sini potongan konfigurasi untuk membuat potongan vendor terpisah untuk masing-masing bundel Anda:
Dan tautan ke
CommonsChunkPlugin
dokumen: http://webpack.github.io/docs/list-of-plugins.html#commonschunkpluginsumber
react
seharusnya hanya ada dalam bundel vendor jika secara eksplisit diperlukan oleh bundle1 dan bundl2. Saya tidak harus menentukan itu pada file konfigurasi ... Apakah ini masuk akal? Ada ide?