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.js
et
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-plugin
comme suit
vous devrez d'abord nommer ce morceau asynchrone à l'aide d'un webpack
magic comment
exemple
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 link
balise pour charger le script
- chaque fois qu'un navigateur rencontre une
script
balise, il la charge, l'analyse et l'exécute immédiatement
- vous pouvez uniquement retarder l'analyse et l'évaluation à l'aide de
async
et
defer
tag 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 string
ou 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() constructor
oueval
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 worker
pour 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?