AKTUALIZACJA
Możesz użyć preload-webpack-plugin z html-webpack-plugin , pozwoli ci to określić, co ma zostać wstępnie załadowane w konfiguracji i automatycznie wstawi tagi, aby wstępnie załadować swoją porcję
Uwaga: jeśli używasz WebPack v4, będziesz musiał zainstalować tę wtyczkę za pomocą preload-webpack-plugin@next
przykład
plugins: [
new HtmlWebpackPlugin(),
new PreloadWebpackPlugin({
rel: 'preload',
include: 'asyncChunks'
})
]
W przypadku projektu generującego dwa skrypty asynchroniczne z dynamicznie generowanymi nazwami, takimi jak chunk.31132ae6680e598f8879.js
i
chunk.d15e7fdfc91b34bb78c4.js
, następujące wstępne obciążenia zostaną wstrzyknięte do dokumentuhead
<link rel="preload" as="script" href="chunk.31132ae6680e598f8879.js">
<link rel="preload" as="script" href="chunk.d15e7fdfc91b34bb78c4.js">
AKTUALIZACJA 2
jeśli nie chcesz wstępnie ładować całego fragmentu asynchronicznego, ale tylko określony, gdy możesz to zrobić
możesz użyć wtyczki babcodera migcodera lub wykonaćpreload-webpack-plugin
następujące czynności
najpierw będziesz musiał nazwać ten fragment asynchroniczny za pomocą webpack
magic comment
przykładu
import(/* webpackChunkName: 'myAsyncPreloadChunk' */ './path/to/file')
a następnie w konfiguracji wtyczki użyj tej nazwy jak
plugins: [
new HtmlWebpackPlugin(),
new PreloadWebpackPlugin({
rel: 'preload',
include: ['myAsyncPreloadChunk']
})
]
Przede wszystkim zobaczmy zachowanie przeglądarki, gdy określimy script
tag lub link
tag, aby załadować skrypt
- za każdym razem, gdy przeglądarka napotka
script
znacznik, załaduje go, przeanalizuje i natychmiast wykona
- możesz jedynie opóźnić parsowanie i ocenę za pomocą tagu
async
i
tylko do zdarzeniadefer
DOMContentLoaded
- możesz opóźnić wykonanie (ocenę), jeśli nie wstawisz znacznika skryptu (tylko wstępnie go załaduj
link
)
Teraz istnieje jakiś inny nie zaleca hackey sposobem jest transportowanie cały scenariusz i string
albo comment
(bo czas oceny z komentarzem lub ciąg jest znikomy) i gdy trzeba wykonać, że można użyć Function() constructor
albo eval
obie nie są zalecane
Inne podejście do usług pracowników: (pozwoli to zachować pamięć podręczną po ponownym załadowaniu strony lub użytkownik przejdzie w tryb offline po załadowaniu pamięci podręcznej)
W nowoczesnej przeglądarce możesz użyć service worker
do pobrania i buforowania odwołania (JavaScript, obraz, css cokolwiek), a gdy żądanie głównego wątku dla tego odwołania możesz przechwycić to żądanie i zwrócić odwołanie z pamięci podręcznej w ten sposób, nie analizujesz i nie oceniasz skryptu, gdy ładujesz go do pamięci podręcznej. Dowiedz się więcej o pracownikach serwisu tutaj
przykład
self.addEventListener('install', function(event) {
event.waitUntil(
caches.open('v1').then(function(cache) {
return cache.addAll([
'/sw-test/',
'/sw-test/index.html',
'/sw-test/style.css',
'/sw-test/app.js',
'/sw-test/image-list.js',
'/sw-test/star-wars-logo.jpg',
'/sw-test/gallery/bountyHunters.jpg',
'/sw-test/gallery/myLittleVader.jpg',
'/sw-test/gallery/snowTroopers.jpg'
]);
})
);
});
self.addEventListener('fetch', function(event) {
event.respondWith(caches.match(event.request).then(function(response) {
// caches.match() always resolves
// but in case of success response will have value
if (response !== undefined) {
return response;
} else {
return fetch(event.request).then(function (response) {
// response may be used only once
// we need to save clone to put one copy in cache
// and serve second one
let responseClone = response.clone();
caches.open('v1').then(function (cache) {
cache.put(event.request, responseClone);
});
return response;
}).catch(function () {
// any fallback code here
});
}
}));
});
jak widać, nie jest to zależne od pakietu WebPack, nie wchodzi ono w zakres pakietu WebPack, jednak za pomocą pakietu WebPack można podzielić pakiet, co pomoże lepiej wykorzystać pracownika serwisu
if (false) import(…)
- Wątpię, czy webpack analizuje martwy kod?