अपडेट करें
आप html -webpack-plugin के साथ प्रीलोड-वेबपैक-प्लगइन का उपयोग कर सकते हैं, यह आपको परिभाषित करने देगा कि कॉन्फ़िगरेशन में क्या प्रीलोड करना है और यह आपके चंक को प्रीलोड करने के लिए स्वचालित रूप से टैग डालेगा
ध्यान दें कि यदि आप अभी वेबपैक v4 का उपयोग कर रहे हैं तो आपको इस प्लगइन का उपयोग करके इंस्टॉल करना होगा preload-webpack-plugin@next
उदाहरण
plugins: [
new HtmlWebpackPlugin(),
new PreloadWebpackPlugin({
rel: 'preload',
include: 'asyncChunks'
})
]
गतिशील रूप से उत्पन्न नामों के साथ दो async स्क्रिप्ट बनाने वाली परियोजना के लिए, जैसे कि 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">
अद्यतन २
यदि आप सभी async chunk को प्रीलोड नहीं करना चाहते हैं, लेकिन केवल एक बार ही आप इसे कर सकते हैं
या तो आप माइगोडर के बेबल प्लगइन का उपयोग कर सकते हैं या preload-webpack-plugin
निम्नलिखित की तरह
सबसे पहले आपको उस async चंक को 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
एक संभोग (जावास्क्रिप्ट, छवि, सीएसएस कुछ भी) प्राप्त करने और कैश करने के लिए उपयोग कर सकते हैं और जब उस पुनरावृत्ति के लिए मुख्य सूत्र अनुरोध आप उस अनुरोध को रोक सकते हैं और इस तरह से कैश से पुनरावृत्ति वापस कर सकते हैं जब आप स्क्रिप्ट को पार्स और मूल्यांकन नहीं कर रहे हों। आप इसे कैश में लोड कर रहे हैं, यहां सेवा कर्मचारियों के बारे में अधिक पढ़ें
उदाहरण
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
});
}
}));
});
जैसा कि आप देख सकते हैं कि यह एक वेबपैक निर्भर बात नहीं है यह वेबपैक के दायरे से बाहर है, हालांकि वेबपैक की मदद से आप अपने बंडल को विभाजित कर सकते हैं जो सेवा कार्यकर्ता का बेहतर उपयोग करने में मदद करेगा
if (false) import(…)
- मुझे संदेह है कि वेबपैक मृत कोड विश्लेषण करता है?