คู่มือนี้จะอธิบายกฎ PageSpeed Insights ในบริบท: สิ่งที่ต้องให้ความสนใจเมื่อเพิ่มประสิทธิภาพเส้นทางการแสดงผลวิกฤติ และเหตุผล
นำ JavaScript และ CSS ที่บล็อกการแสดงผลออก
เพื่อเร่งเวลาในการแสดงผลครั้งแรก ให้น้อยที่สุด และ (หากเป็นไปได้) ใน��าร�����������วนทรัพยากรวิกฤติบนหน้า ลดจำนวนไบต์วิกฤติที่ดาวน์โหลด และปรับปรุงความยาวของเส้นทางวิกฤติ
เพิ่มประสิทธิภาพการใช้ JavaScript
ทรัพยากร JavaScript จะบล็อกโปรแกรมแยกวิเคราะห์โดยค่าเริ่มต้น เว้นแต่จะทําเครื่องหมายเป็น async
หรือเพิ่มผ่านข้อมูลโค้ด JavaScript พิเศษ โปรแกรมแยกวิเคราะห์ที่บล็อก JavaScript จะบังคับให้เบราว์เซอร์รอ CSSOM และหยุดการสร้าง DOM ชั่วคราว ซึ่งอาจทำให้การแสดงผลครั้งแรกล่าช้าไปอย่างมาก
ต้องการทรัพยากร JavaScript แบบอะซิงโครนัส
ทรัพยากรแบบอะซิงโครนัสจะเลิกบล็อกโปรแกรมแยกวิเคราะห์เอกสารและอนุญาตให้เบราว์เซอร์หลีกเลี่ยงการบล็อกใน CSSOM ก่อนที่จะเรียกใช้สคริปต์ บ่อยครั้งที่หากสคริปต์ใช้แอตทริบิวต์ async
ได้ ก็หมายความว่าสคริปต์ดังกล่าวไม่จำเป็นสำหรับการแสดงภาพครั้งแรกเช่นกัน ลองโหลดสคริปต์แบบไม่พร้อมกันหลังจากการแสดงผลครั้งแรก
หลีกเลี่ยงการเรียกใช้เซิร์ฟเวอร์พร้อมกัน
ใช้เมธอด navigator.sendBeacon()
เพื่อจำกัดข้อมูลที่ส่งโดย XMLHttpRequests ในเครื่องจัดการ unload
เนื่องจากเบราว์เซอร์จำนวนมากต้องการให้คำขอเป็นแบบซิงโครนัส อาจทำให้การเปลี่ยนหน้าช้าลงในบางครั้ง โค้ดต่อไปนี้แสดงวิธีใช้ navigator.sendBeacon()
เพื่อส่งข้อมูลไปยังเซิร์ฟเวอร์ในเครื่องจัดการ pagehide
แทนในเครื่องจัดการ unload
<script>
function() {
window.addEventListener('pagehide', logData, false);
function logData() {
navigator.sendBeacon(
'https://putsreq.herokuapp.com/Dt7t2QzUkG18aDTMMcop',
'Sent by a beacon!');
}
}();
</script>
เมธอด fetch()
ใหม่มอบวิธีง่ายๆ ในการส่งคำขอข้อมูลแบบไม่พร้อมกัน เนื่องจากฟีเจอร์นี้ยังไม่พร้อมให้บริการในบางพื้นที่ คุณจึงควรใช้การตรวจหาฟีเจอร์เพื่อทดสอบการมีอยู่ตัวพร้อมใช้งานก่อนใช้งาน เมธอดนี้จะประมวลผลการตอบกลับด้วย Promises แทนตัวแฮนเดิลเหตุการณ์หลายรายการ การตอบกลับการดึงข้อมูลเป็นออบเจ็กต์สตรีมที่เริ่มใช้งานใน Chrome 43 ซึ่งต่างจากการตอบกลับ XMLHttpRequest ซึ่งหมายความว่าการเรียกใช้ไปยัง json()
จะแสดง "Promise" ด้วย
<script>
fetch('./api/some.json')
.then(
function(response) {
if (response.status !== 200) {
console.log('Looks like there was a problem. Status Code: ' + response.status);
return;
}
// Examine the text in the response
response.json().then(function(data) {
console.log(data);
});
}
)
.catch(function(err) {
console.log('Fetch Error :-S', err);
});
</script>
นอกจากนี้เมธอด fetch()
ยังจัดการคำขอ POST ได้อีกด้วย
<script>
fetch(url, {
method: 'post',
headers: {
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8"
},
body: 'foo=bar&lorem=ipsum'
}).then(function() { // Additional code });
</script>
เลื่อนการแยกวิเคราะห์ JavaScript
หากต้องการลดปริมาณงานที่เบราว์เซอร์ต้องทำในการแสดงผลหน้าเว็บ เลื่อนสคริปต์ที่ไม่จำเป็นซึ่งไม่สำคัญต่อการสร้างเนื้อหาที่มองเห็นได้แสดงผลครั้งแรกออกไป
หลีกเลี่ยงการใช้ JavaScript ที่ใช้เวลานาน
การเรียกใช้ JavaScript เป็นเวลานานจะบล็อกเบราว์เซอร์ไม่ให้สร้าง DOM, CSSOM และการแสดงผลหน้าเว็บ ดังนั้นให้เลื่อนไปก่อนหลังตรรกะการเริ่มต้นและฟังก์ชันที่ไม่จำเป็นในการแสดงผลครั้งแรก หากจำเป็นต้องเรียกใช้ลำดับการเริ่มต้นแบบยาว ให้ลองแบ่งออกเป็นหล��ยขั้นตอนเพื่อให้เบราว์เซอร์ประมวลผลเหตุการณ์อื่นๆ ที่อยู่ระหว่างนั้น
เพิ่มประสิทธิภาพการใช้ CSS
จำเป็นต้องใช้ CSS เพื่อสร้างแผนผังการแสดงผลและ JavaScript มักบล็อกใน CSS ระหว่างการสร้างหน้าเว็บครั้งแรก ตรวจสอบว่ามีการทำเครื่องหมาย CSS ที่ไม่จำเป็นว่าไม่สำคัญ (เช่น คำค้นหาสื่อสิ่งพิมพ์และสื่ออื่นๆ) รวมทั้งตรวจสอบว่าจำนวน CSS ที่สำคัญและเวลาในการนำส่งน้อยที่สุดเท่าที่จะเป็นไปได้
ใส่ CSS ลงในส่วนหัวของเอกสาร
ระบุทรัพยากร CSS ทั้งหมดให้เร็วที่สุดภายในเอกสาร HTML เพื่อให้เบราว์เซอร์ค้นพบแท็ก <link>
และส่งคำขอสำหรับ CSS โดยเร็วที่สุด
หลีกเลี่ยงการนำเข้า CSS
คำสั่งการนำเข้า CSS (@import
) ทำให้สไตล์ชีตหนึ่งสามารถนำเข้ากฎจากไฟล์สไตล์ชีตอีกไฟล์หนึ่ง อย่างไรก็ตาม ให้หลีกเลี่ยงคำสั่งเหล่านี้เนื่องจากมีการเปลี่ยนแนวทางไปกลับเพิ่มเติมในเส้นทางวิกฤติ โดยจะค้นพบทรัพยากร CSS ที่นำเข้าหลังจากได้รับและแยกวิเคราะห์สไตล์ชีต CSS ที่มีกฎ @import
แล้วเท่านั้น
รวม CSS การบล็อกการแสดงผลไว้ในหน้า
เพื่อประสิทธิภาพที่ดีที่สุด คุณอาจต้องใส่ CSS ที่สำคัญลงในเอกสาร HTML โดยตรง ซึ่งจะขจัดการไปกลับเพิ่มเติมในเส้นทางวิกฤติ และหากดำเนินการอย่างถูกต้อง จะสามารถส่งความยาวเส้นทางวิกฤติแบบ "ไปกลับ 1 รอบ" ซึ่งมีเฉพาะ HTML เท่านั้นที่เป็นทรัพยากรในการบล็อก