更新
あなたは使用することができますプリロード-WebPACKの-プラグインでHTML-WebPACKのは、プラグインあなたのチャンクをプリロードするために、それはあなたが設定でプリロードするかを定義できるようになると、それが自動的に挿入タグ意志
現時点でwebpack v4を使用している場合は、このプラグインを使用してインストールする必要があります。 preload-webpack-plugin@next
例
plugins: [
new HtmlWebpackPlugin(),
new PreloadWebpackPlugin({
rel: 'preload',
include: 'asyncChunks'
})
]
chunk.31132ae6680e598f8879.js
and
などの動的に生成された名前を持つ2つの非同期スクリプトを生成するプロジェクトのchunk.d15e7fdfc91b34bb78c4.js
場合、次のプリロードがドキュメントに挿入されますhead
<link rel="preload" as="script" href="chunk.31132ae6680e598f8879.js">
<link rel="preload" as="script" href="chunk.d15e7fdfc91b34bb78c4.js">
アップデート2
すべての非同期チャンクをプリロードしたくないが、それを行うことができるのは一度だけ特定したい場合
migcoderのbabelプラグインを使用するか、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
)
現在、スクリプト全体を出荷するか、コメントまたは文字列の評価時間はほとんど無視できるため、推奨されない方法が他にもあります。実行する必要があるときに、使用できるか、または両方が推奨されません。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に依存するものではありませんが、Webpackの範囲外ですが、Webpackを使用してバンドルを分割することで、Service Workerをより効率的に利用できます。
if (false) import(…)
-Webpackがデッドコード分析を行うことはないと思いますか?