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.js
und
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-plugin
wie folgt
Zuerst müssen Sie diesen asynchronen Block anhand eines webpack
magic comment
Beispiels 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 script
Tag oder link
Tag zum Laden des Skripts angeben
- Wenn ein Browser auf ein
script
Tag 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
async
und
defer
Tag 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 string
oder 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() constructor
oder eval
beide 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 worker
einen 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.