MISE À JOUR
Vous pouvez utiliser preload-webpack-plugin avec html-webpack-plugin, il vous permettra de définir quoi précharger dans la configuration et il insérera automatiquement des balises pour précharger votre bloc
notez que si vous utilisez webpack v4 à partir de maintenant, vous devrez installer ce plugin en utilisant preload-webpack-plugin@next
exemple
plugins: [
new HtmlWebpackPlugin(),
new PreloadWebpackPlugin({
rel: 'preload',
include: 'asyncChunks'
})
]
Pour un projet générant deux scripts asynchrones avec des noms générés dynamiquement, tels que chunk.31132ae6680e598f8879.jset
chunk.d15e7fdfc91b34bb78c4.js, les précharges suivantes seront injectées dans le documenthead
<link rel="preload" as="script" href="chunk.31132ae6680e598f8879.js">
<link rel="preload" as="script" href="chunk.d15e7fdfc91b34bb78c4.js">
MISE À JOUR 2
si vous ne voulez pas précharger tous les morceaux asynchrones, mais seulement une fois que vous pouvez le faire aussi
soit vous pouvez utiliser le plugin babel de migcoder ou preload-webpack-plugincomme suit
vous devrez d'abord nommer ce morceau asynchrone à l'aide d'un webpack
magic commentexemple
import(/* webpackChunkName: 'myAsyncPreloadChunk' */ './path/to/file')
puis dans la configuration du plugin, utilisez ce nom comme
plugins: [
new HtmlWebpackPlugin(),
new PreloadWebpackPlugin({
rel: 'preload',
include: ['myAsyncPreloadChunk']
})
]
Voyons tout d'abord le comportement du navigateur lorsque nous spécifions script balise ou une linkbalise pour charger le script
- chaque fois qu'un navigateur rencontre une
scriptbalise, il la charge, l'analyse et l'exécute immédiatement
- vous pouvez uniquement retarder l'analyse et l'évaluation à l'aide de
asyncet
defertag uniquement jusqu'à l'DOMContentLoaded événement
- vous pouvez retarder l'exécution (évaluation) si vous n'insérez pas la balise de script (préchargez-la uniquement avec
link )
maintenant, il existe une autre méthode de hackey non recommandée: expédiez l'intégralité de votre script et stringou comment(car le temps d'évaluation du commentaire ou de la chaîne est presque négligeable) et lorsque vous devez l'exécuter, vous pouvez utiliser Function() constructoroueval deux ne sont pas recommandés
Une autre approche des travailleurs du service: (cela préservera votre événement de cache après le rechargement de la page ou l'utilisateur se déconnecte après le chargement du cache)
Dans un navigateur moderne, vous pouvez utiliser service workerpour récupérer et mettre en cache un recours (JavaScript, image, css quoi que ce soit) et lorsque le thread principal demande ce recours, vous pouvez intercepter cette demande et renvoyer le recours du cache de cette façon, vous n'analysez pas et n'évaluez pas le script lorsque vous le chargez dans le cache en savoir plus sur les travailleurs des services ici
exemple
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
});
}
}));
});
comme vous pouvez le voir, cela ne dépend pas du webpack , cela est hors de portée du webpack, mais avec l'aide de webpack, vous pouvez fractionner votre bundle, ce qui aidera à mieux utiliser le service worker
if (false) import(…)- Je doute que webpack fasse une analyse de code mort?