Saya baru-baru ini mengerjakan beberapa pekerjaan pengoptimalan situs web, dan saya mulai menggunakan pemecahan kode di webpack dengan menggunakan pernyataan impor seperti ini:
import(/* webpackChunkName: 'pageB-chunk' */ './pageB')
Yang benar-benar membuat pageB-chunk.js , sekarang katakanlah saya ingin membuat prefetch bagian ini di pageA, saya bisa melakukannya dengan menambahkan pernyataan ini di pageA:
import(/* webpackChunkName: 'pageB-chunk' */ /* webpackPrefetch: true */ './pageB')
Yang akan menghasilkan a
<link rel="prefetch" href="pageB-chunk.js">
menjadi menambahkan ke kepala HTML, maka browser akan mengambilnya, sejauh ini bagus.
Masalahnya adalah pernyataan impor yang saya gunakan di sini tidak hanya mengambil file js, tetapi juga mengevaluasi file js, berarti kode file js tersebut diuraikan & dikompilasi ke bytecode, kode tingkat atas dari JS yang dieksekusi.
Ini adalah operasi yang sangat memakan waktu pada perangkat seluler dan saya ingin mengoptimalkannya, saya hanya ingin bagian prefetch , saya tidak ingin bagian evaluasi & eksekusi , karena nanti ketika beberapa interaksi pengguna terjadi, saya akan memicu penguraian & evaluasi diri saya sendiri
↑↑↑↑↑↑↑↑ Saya hanya ingin memicu dua langkah pertama, gambar berasal dari https://calendar.perfplanet.com/2011/lazy-evaluation-of-commonjs-modules/ ↑↑↑↑↑↑↑ ↑↑
Tentu saya bisa melakukan ini dengan menambahkan tautan prefetch sendiri, tetapi ini berarti saya perlu tahu URL mana yang harus saya masukkan di tautan prefetch, webpack pasti tahu URL ini, bagaimana saya bisa mendapatkannya dari webpack?
Apakah webpack memiliki cara mudah untuk mencapai ini?
sumber
if (false) import(…)
- Saya ragu webpack melakukan analisis kode mati?import
kode dinamis harus pergi.Jawaban:
MEMPERBARUI
Anda dapat menggunakan preload-webpack-plugin dengan html-webpack-plugin itu akan memungkinkan Anda menentukan apa yang harus dimuat di konfigurasi dan secara otomatis akan memasukkan tag untuk preload potongan Anda
perhatikan jika Anda menggunakan webpack v4 sekarang Anda harus menginstal plugin ini menggunakan
preload-webpack-plugin@next
contoh
PEMBARUAN 2
jika Anda tidak ingin memuat semua potongan async tetapi hanya spesifik sekali Anda dapat melakukannya juga
Anda dapat menggunakan plugin babel migcoder atau dengan
preload-webpack-plugin
seperti berikutpertama Anda harus memberi nama potongan async itu dengan bantuan
webpack magic comment
contohdan kemudian dalam konfigurasi plugin gunakan nama seperti itu
Pertama-tama mari kita lihat perilaku browser ketika kita menentukan
script
tag ataulink
tag untuk memuat skripscript
tag, tag akan memuatnya untuk menguraikannya dan menjalankannya dengan segeraasync
dandefer
tag hinggaDOMContentLoaded
acaralink
)sekarang ada beberapa cara hackey lain yang tidak disarankan adalah Anda mengirimkan seluruh skrip Anda dan
string
ataucomment
(karena waktu evaluasi komentar atau string hampir dapat diabaikan) dan ketika Anda perlu mengeksekusi yang dapat Anda gunakanFunction() constructor
ataueval
keduanya tidak direkomendasikanPekerja Layanan Pendekatan Lainnya : (ini akan membuat Anda menyimpan aktivitas cache setelah pemuatan ulang halaman atau pengguna offline setelah cache dimuat)
Di peramban modern, Anda dapat menggunakan
service worker
untuk mengambil dan men-cache jalan lain (JavaScript, gambar, css apa saja) dan ketika permintaan utas utama untuk jalan itu Anda dapat mencegat permintaan itu dan mengembalikan jalan lain dari cache dengan cara ini Anda tidak mengurai dan mengevaluasi skrip saat Anda memuatnya ke dalam cache, baca lebih lanjut tentang pekerja layanan di sinicontoh
karena Anda dapat melihat ini bukan hal yang tergantung webpack ini berada di luar lingkup webpack namun dengan bantuan webpack Anda dapat membagi bundel Anda yang akan membantu memanfaatkan pekerja layanan dengan lebih baik
sumber
Pembaruan: Saya memasukkan semua hal ke dalam paket npm, check it out! https://www.npmjs.com/package/webpack-prefetcher
Setelah beberapa hari penelitian, saya berakhir dengan menulis plugin babel yang dapat dikustomisasi ...
Singkatnya, plugin berfungsi seperti ini:
Prefetcher adalah kelas pembantu yang berisi manifes output webpack, dan dapat membantu kami dalam memasukkan tautan prefetch:
Contoh penggunaan:
Detail dari plugin ini dapat ditemukan di sini:
Prefetch - Kendalikan dari webpack
Sekali lagi, ini adalah cara yang benar-benar gila dan saya tidak suka, jika Anda ingin tim webpack menerapkan ini, silakan pilih di sini:
Fitur: mengambil impor dinamis berdasarkan permintaan
sumber
Dengan asumsi saya mengerti apa yang Anda coba capai, Anda ingin mem-parsing dan mengeksekusi modul setelah peristiwa tertentu (misalnya klik pada tombol). Anda bisa memasukkan pernyataan impor ke dalam acara itu:
sumber