UPDATE
คุณสามารถใช้preload-webpack-pluginกับhtml-webpack-pluginมันจะช่วยให้คุณกำหนดสิ่งที่จะพรีโหลดในการกำหนดค่าและมันจะแทรกแท็กโดยอัตโนมัติเพื่อโหลดชิ้นของคุณ
หมายเหตุหากคุณใช้ webpack v4 ณ ตอนนี้คุณจะต้องติดตั้งปลั๊กอินนี้โดยใช้ preload-webpack-plugin@next
ตัวอย่าง
plugins: [
new HtmlWebpackPlugin(),
new PreloadWebpackPlugin({
rel: 'preload',
include: 'asyncChunks'
})
]
สำหรับโครงการที่สร้างสคริปต์ async สองตัวที่มีชื่อที่สร้างขึ้นแบบไดนามิกเช่นchunk.31132ae6680e598f8879.js
และ
chunk.d15e7fdfc91b34bb78c4.js
preloads ต่อไปนี้จะถูกแทรกลงในเอกสารhead
<link rel="preload" as="script" href="chunk.31132ae6680e598f8879.js">
<link rel="preload" as="script" href="chunk.d15e7fdfc91b34bb78c4.js">
อัพเดท 2
หากคุณไม่ต้องการโหลด async ทั้งหมดล่วงหน้า แต่เฉพาะเจาะจงเมื่อคุณสามารถทำได้เช่นกัน
คุณสามารถใช้ปลั๊กอิน babel ของ migcoderหรือด้วยสิ่ง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
)
ตอนนี้มีวิธีอื่นที่ไม่แนะนำให้ใช้แฮ็คกี้คือคุณจัดส่งสคริปต์ทั้งหมดของคุณและ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 คุณสามารถแยกบันเดิลของคุณซึ่งจะช่วยให้การใช้งานของพนักงานบริการดีขึ้น
if (false) import(…)
- ฉันสงสัยว่า webpack ทำการวิเคราะห์รหัสที่ไม่ทำงานหรือไม่