AKTUALISIEREN
Sie können das Preload-Webpack-Plugin mit dem HTML-Webpack-Plugin verwenden , mit dem Sie definieren können, was in der Konfiguration vorgeladen werden soll, und automatisch Tags einfügen, um Ihren Chunk vorzuladen
Hinweis: Wenn Sie ab sofort Webpack v4 verwenden, müssen Sie dieses Plugin mit installieren preload-webpack-plugin@next
Beispiel
plugins: [
new HtmlWebpackPlugin(),
new PreloadWebpackPlugin({
rel: 'preload',
include: 'asyncChunks'
})
]
Bei einem Projekt, das zwei asynchrone Skripte mit dynamisch generierten Namen wie chunk.31132ae6680e598f8879.jsund
generiert chunk.d15e7fdfc91b34bb78c4.js, werden die folgenden Vorladungen in das Dokument eingefügthead
<link rel="preload" as="script" href="chunk.31132ae6680e598f8879.js">
<link rel="preload" as="script" href="chunk.d15e7fdfc91b34bb78c4.js">
UPDATE 2
Wenn Sie nicht alle asynchronen Blöcke vorladen möchten, sondern nur bestimmte, können Sie dies auch tun
Entweder können Sie das Babel-Plugin von Migcoder verwenden oder preload-webpack-pluginwie folgt
Zuerst müssen Sie diesen asynchronen Block anhand eines webpack
magic commentBeispiels benennen
import(/* webpackChunkName: 'myAsyncPreloadChunk' */ './path/to/file')
und dann in der Plugin-Konfiguration diesen Namen wie verwenden
plugins: [
new HtmlWebpackPlugin(),
new PreloadWebpackPlugin({
rel: 'preload',
include: ['myAsyncPreloadChunk']
})
]
Lassen Sie uns zunächst das Verhalten des Browsers sehen, wenn wir scriptTag oder linkTag zum Laden des Skripts angeben
- Wenn ein Browser auf ein
scriptTag stößt , lädt er es, analysiert es und führt es sofort aus
- Sie können das Parsen und Auswerten nur mit Hilfe von
asyncund
deferTag nur bis zumDOMContentLoaded Ereignis verzögern
- Sie können die Ausführung (Auswertung) verzögern, wenn Sie das Skript-Tag nicht einfügen (nur mit vorladen
link).
Jetzt gibt es eine andere nicht empfohlene Art und Weise, wie Sie Ihr gesamtes Skript versenden und stringoder comment(da die Auswertungszeit für Kommentare oder Zeichenfolgen fast vernachlässigbar ist) und wenn Sie eine Ausführung benötigen, die Sie verwenden können Function() constructoroder evalbeide nicht empfohlen werden
Ein anderer Approach Service Worker: (Dadurch bleibt das Cache-Ereignis nach dem erneuten Laden der Seite erhalten oder der Benutzer wird nach dem Laden des Caches offline geschaltet.)
In modernen Browsern können Sie service workereinen Rückgriff (JavaScript, Bild, CSS) abrufen und zwischenspeichern. Wenn der Hauptthread diesen Rückgriff anfordert, können Sie diese Anforderung abfangen und den Rückgriff aus dem Cache zurückgeben, sodass Sie das Skript nicht analysieren und auswerten, wenn Sie laden sie in den Cache mehr über Service - Mitarbeiter lesen hier
Beispiel
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
});
}
}));
});
Wie Sie sehen können, ist dies keine Webpack-abhängige Sache. Dies liegt außerhalb des Geltungsbereichs von Webpack. Mithilfe von Webpack können Sie jedoch Ihr Bundle aufteilen, um den Service Worker besser zu nutzen
if (false) import(…)- Ich bezweifle, dass Webpack eine Dead-Code-Analyse durchführt.