ОНОВЛЕННЯ
Ви можете використовувати preload-webpack-plugin з html-webpack-plugin, він дозволить вам визначити, що потрібно попередньо завантажити в конфігурації, і він автоматично вставить теги для попереднього завантаження вашої частини
зверніть увагу, якщо ви зараз використовуєте webpack v4, вам доведеться встановити цей плагін, використовуючи preload-webpack-plugin@next
приклад
plugins: [
new HtmlWebpackPlugin(),
new PreloadWebpackPlugin({
rel: 'preload',
include: 'asyncChunks'
})
]
Для проекту, що генерує два сценарії асинхронізації з динамічно згенерованими іменами, такими як chunk.31132ae6680e598f8879.js
і
chunk.d15e7fdfc91b34bb78c4.js
, наступні попередні завантаження будуть введені в документhead
<link rel="preload" as="script" href="chunk.31132ae6680e598f8879.js">
<link rel="preload" as="script" href="chunk.d15e7fdfc91b34bb78c4.js">
ОНОВЛЕННЯ 2
якщо ви не хочете попередньо завантажити весь фрагмент асинхронізації, але лише конкретний раз, коли ви також можете це зробити
або ви можете використовувати плагін для мітки, або preload-webpack-plugin
подібні нижче
спочатку вам доведеться назвати цей асинхронний фрагмент за допомогою webpack
magic comment
прикладу
import(/* webpackChunkName: 'myAsyncPreloadChunk' */ './path/to/file')
а потім у конфігурації плагінів використовуйте таке ім’я як
plugins: [
new HtmlWebpackPlugin(),
new PreloadWebpackPlugin({
rel: 'preload',
include: ['myAsyncPreloadChunk']
})
]
Перш за все, давайте подивимося на поведінку браузера, коли ми задаємо script
тег або link
тег для завантаження сценарію
- всякий раз, коли браузер зіштовхується з
script
тегом, він завантажує його розбирає та негайно виконує
- ви можете затримати розбір та оцінку лише за допомогою
async
та
defer
тегів доDOMContentLoaded
події
- ви можете затримати виконання (оцінку), якщо ви не вставите тег сценарію (лише попередньо завантажте його
link
)
Тепер є й інші не рекомендується hackey шляху ви відправляєте весь сценарій і string
чи comment
(бо час оцінки коментаря або рядків практично НЕ помітно) , і коли вам потрібно виконати , що ви можете використовувати Function() constructor
або eval
обидва не рекомендуються
Інші службові працівники підходу : (це збереже кеш-подія після перезавантаження сторінки або користувач перейде в офлайн після завантаження кешу)
У сучасному браузері ви можете використовувати service worker
для отримання та кешування регресу (JavaScript, зображення, css що завгодно), а коли запит основного потоку для цього регресу ви можете перехопити цей запит і повернути регрес з кешу таким чином, ви не розбираєте та не оцінюєте сценарій, коли ви завантажуєте його в кеш, читайте більше про службовців тут
приклад
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
});
}
}));
});
як ви бачите, це не річ, що залежить від веб-упаковки , це виходить за межі веб-пакета, однак за допомогою webpack ви можете розділити пакет, що допоможе краще використовувати сервісного працівника
if (false) import(…)
- Сумніваюсь, веб-пакет робить аналіз мертвого коду?