การวิเคราะห์ประสิทธิภาพของเส้นทางการแสดงผลที่สำคัญ

เผยแพร่เมื่อ: 31 มีนาคม 2014

การระบุและแก้ไขปัญหาจุดคอขวดของเส้นทางการแสดงผลวิกฤติต้องอาศัยความรู้ที่ดีเกี่ยวกับข้อผิดพลาดที่พบบ่อย ทัวร์ชมพร้อมคําแนะนําเพื่อระบุรูปแบบประสิทธิภาพที่พบบ่อยจะช่วยเพิ่มประสิทธิภาพหน้าเว็บได้

การเพิ่มประสิทธิภาพเส้นทางการแสดงผลวิกฤติช่วยให้เบราว์เซอร์สามารถวาดหน้าเว็บได้อย่างรวดเร็ว ซึ่งหน้าเว็บที่รวดเร็วหมายถึงการมีส่วนร่วมสูงขึ้น มีการดูหน้าเว็บมากขึ้น และ Conversion เพิ่มขึ้น เราต้องเพิ่มประสิทธิภาพทรัพยากรที่จะโหลดและลำดับการโหลดเพื่อลดเวลาที่ผู้เข้าชมต้องดูหน้าจอว่างเปล่า

เพื่อช่วยอธิบายกระบวนการนี้ ให้เริ่มต้นด้วยกรณีที่ง่ายที่สุดเท่าที่จะเป็นไปได้ แล้วค่อยๆ สร้างหน้าเว็บให้รวมทรัพยากร รูปแบบ และตรรกะแอปพลิเคชันเพิ่มเติม ในกระบวนการนี้ เราจะเพิ่มประสิทธิภาพในแต่ละกรณี เรายังจะเห็นจุดที่เกิดข้อผิดพลาดอีกด้วย

จนถึงตอนนี้ เรามุ่งเน้นที่สิ่งที่เกิดขึ้นในเบราว์เซอร์หลังจากที่ทรัพยากร (ไฟล์ CSS, JS หรือ HTML) พร้อมประมวลผล เราไม่ได้คำนึงถึงเวลาที่ใช้ในการดึงทรัพยากรจากแคชหรือเครือข่าย เราจะสมมติข้อมูลต่อไปนี้

  • การส่งข้อมูลไปกลับของเครือข่าย (เวลาในการตอบสนองการนำไปใช้งาน) ไปยังเซิร์ฟเวอร์มีค่าใช้จ่าย 100 มิลลิวินาที
  • เวลาในการตอบสนองของเซิร์ฟเวอร์คือ 100 มิลลิวินาทีสำหรับเอกสาร HTML และ 10 มิลลิวินาทีสำหรับไฟล์อื่นๆ ทั้งหมด

ประสบการณ์ Hello World

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <title>Critical Path: No Style</title>
  </head>
  <body>
    <p>Hello <span>web performance</span> students!</p>
    <div><img src="awesome-photo.jpg" /></div>
  </body>
</html>

ลองใช้

เริ่มต้นด้วยมาร์กอัป HTML พื้นฐานและรูปภาพเดียว ไม่มี CSS หรือ JavaScript จากนั้นเปิดแผงเครือข่ายในเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome และตรวจสอบการแสดงโฆษณาสื่อกลางตามลำดับขั้นที่ได้

CRP

ตามที่คาดไว้ ไฟล์ HTML ใช้เวลาดาวน์โหลดประมาณ 200 มิลลิวินาที โปรดทราบว่าส่วนที่โปร่งใสของเส้นสีน้ำเงินแสดงถึงระยะเวลาที่เบราว์เซอร์รอในเครือข่ายโดยไม่มีไบต์การตอบสนอง ในขณะที่ส่วนที่ทึบจะแสดงเวลาในการดาวน์โหลดให้เสร็จสิ้นหลังจากได้รับไบต์การตอบสนองแรกแล้ว การดาวน์โหลด HTML มีขนาดเล็กมาก (<4K) เราจึงต้องการเพียงการติดต่อแบบไปกลับ 1 ครั้งเพื่อดึงข้อมูลไฟล์ฉบับเต็ม ดังนั้นเอกสาร HTML จะใช้เวลาประมาณ 200 มิลลิวินาทีในการดึงข้อมูล โดยครึ่งหนึ่งของเวลาอยู่ในการรอในเครือข่าย และอีกครึ่งหนึ่งรอการตอบสนองของเซิร์ฟเวอร์

เมื่อเนื้อหา HTML พร้อมใช้งานแล้ว เบราว์เซอร์จะแยกวิเคราะห์ไบต์ แปลงเป็นโทเค็น และสร้างต้นไม้ DOM โปรดทราบว่าเครื่องมือสำหรับนักพัฒนาเว็บจะรายงานเวลาของเหตุการณ์ DOMContentLoaded ที่ด้านล่าง (216 มิลลิวินาที) ซึ่งสอดคล้องกับเส้นแนวตั้งสีน้ำเงิน ช่องว่างระหว่างจุดสิ้นสุดของการดาวน์โหลด HTML และเส้นแนวตั้งสีน้ำเงิน (DOMContentLoaded) คือเวลาที่เบราว์เซอร์ใช้ในการสร้างต้นไม้ DOM ในกรณีนี้คือเพียงไม่กี่มิลลิวินาที

โปรดทราบว่า "รูปภาพสุดเจ๋ง" ของเราไม่ได้บล็อกเหตุการณ์ domContentLoaded เราพบว่าเราสามารถสร้าง Render Tree และแม้แต่ระบายสีหน้าเว็บโดยไม่ต้องรอเนื้อหาแต่ละรายการในหน้านั้น ทรัพยากรบางอย่างก็สำคัญต่อการแสดงครั้งแรกที่รวดเร็ว อันที่จริงแล้ว เมื่อพูดถึงเส้นทางการแสดงผลที่สำคัญ เรามักจะพูดถึงมาร์กอัป HTML, CSS และ JavaScript รูปภาพจะไม่บล็อกการแสดงผลครั้งแรกของหน้าเว็บ แต่เรายังควรพยายามให้มีการแสดงรูปภาพโดยเร็วที่สุดด้วย

อย่างไรก็ตาม เหตุการณ์ load (หรือที่เรียกว่า onload) ถูกบล็อกในรูปภาพ โดยเครื่องมือสำหรับนักพัฒนาเว็บจะรายงานเหตุการณ์ onload ที่เวลา 335 มิลลิวินาที โปรดทราบว่าเหตุการณ์ onload หมายถึงจุดที่ระบบดาวน์โหลดและประมวลผลทรัพยากรทั้งหมดที่หน้าเว็บจําเป็นต้องใช้ เมื่อถึงจุดนี้ แถบหมุนที่แสดงการโหลดในเบราว์เซอร์จะหยุดหมุน (เส้นแนวตั้งสีแดงใน Waterfall)

การเพิ่ม JavaScript และ CSS เข้ามา

หน้า "Hello World Experience" ของเราอาจดูเรียบง่าย แต่เบื้องหลังนั้นมีอะไรเกิดขึ้นมากมาย ในทางปฏิบัติ เราจะต้องได้รับมากกว่าแค่ HTML: เป็นไปได้ว่าเราจะต้องใช้สไตล์ชีต CSS และสคริปต์อย่างน้อย 1 รายการเพื่อเพิ่มความโต้ตอบในหน้าเว็บ เพิ่มทั้ง 2 อย่างพร้อมกันเพื่อดูว่าจะเกิดอะไรขึ้น

<!DOCTYPE html>
<html>
  <head>
    <title>Critical Path: Measure Script</title>
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <link href="style.css" rel="stylesheet" />
  </head>
  <body onload="measureCRP()">
    <p>Hello <span>web performance</span> students!</p>
    <div><img src="awesome-photo.jpg" /></div>
    <script src="timing.js"></script>
  </body>
</html>

ลองใช้

ก่อนเพิ่ม JavaScript และ CSS

CRP ของ DOM

เมื่อใช้ JavaScript และ CSS

DOM, CSSOM, JS

การเพิ่มไฟล์ CSS และ JavaScript ภายนอกจะเพิ่มคำขออีก 2 รายการลงใน Waterfall ของเรา ซึ่งเบราว์เซอร์ทั้งหมดจะส่งไปพร้อมๆ กัน อย่างไรก็ตาม โปรดทราบว่าตอนนี้เวลาระหว่างเหตุการณ์ domContentLoaded กับ onload จะมีความแตกต่างของเวลาน้อยกว่ามาก

เกิดอะไรขึ้น

  • ซึ่งต่างจากตัวอย่าง HTML ธรรมดาคือ เราต้องดึงข้อมูลและแยกวิเคราะห์ไฟล์ CSS เพื่อสร้าง CSSOM และต้องใช้ทั้ง DOM และ CSSOM เพื่อสร้างต้นไม้แสดงผล
  • เนื่องจากหน้าเว็บยังมีไฟล์ JavaScript ที่บล็อกโปรแกรมแยกวิเคราะห์ด้วย ระบบจึงบล็อกเหตุการณ์ domContentLoaded จนกว่าระบบจะดาวน์โหลดและแยกวิเคราะห์ไฟล์ CSS เนื่องจาก JavaScript อาจค้นหา CSSOM เราจึงต้องบล็อกไฟล์ CSS จนกว่าระบบจะดาวน์โหลดไฟล์ดังกล่าวก่อนจึงจะเรียกใช้ JavaScript ได้

จะเกิดอะไรขึ้นหากเราแทนที่สคริปต์ภายนอกด้วยสคริปต์ในบรรทัด แม้ว่าจะฝังสคริปต์ไว้ในหน้าเว็บโดยตรง แต่เบราว์เซอร์จะไม่สามารถเรียกใช้สคริปต์ได้จนกว่า CSSOM จะสร้างขึ้น กล่าวโดยย่อคือ JavaScript ที่ฝังอยู่จะบล็อกโปรแกรมวิเคราะห์ด้วย

อย่างไรก็ตาม แม้จะบล็อก CSS แต่การฝังสคริปต์จะทำให้หน้าเว็บแสดงผลเร็วขึ้นไหม ลองใช้งานและดูว่าจะเกิดอะไรขึ้น

JavaScript ภายนอก:

DOM, CSSOM, JS

JavaScript ในหน้า:

DOM, CSSOM และ JS แบบอินไลน์

เราส่งคำขอน้อยลง 1 ครั้ง แต่ทั้งเวลา onload และ domContentLoaded ของเรายังเหมือนเดิม เหตุผล เราทราบดีว่า JavaScript จะอยู่ในรูปแบบอินไลน์หรือภายนอกก็ได้ เพราะทันทีที่เบราว์เซอร์พบแท็กสคริปต์ ก็จะบล็อกและรอจนกว่า CSSOM จะสร้างขึ้น นอกจากนี้ ในตัวอย่างแรก เบราว์เซอร์จะดาวน์โหลดทั้ง CSS และ JavaScript พร้อมกันและดาวน์โหลดเสร็จในเวลาใกล้เคียงกัน ในกรณีนี้ การแทรกโค้ด JavaScript ไว้ก็ไม่ได้ช่วยอะไรเรามากนัก แต่มีกลยุทธ์หลายอย่างที่ทำให้หน้าเว็บแสดงผลเร็วขึ้นได้

ก่อนอื่น โปรดทราบว่าสคริปต์ในบรรทัดทั้งหมดจะบล็อกโปรแกรมวิเคราะห์ แต่สำหรับสคริปต์ภายนอก เราสามารถเพิ่มแอตทริบิวต์ async เพื่อเลิกบล็อกโปรแกรมวิเคราะห์ได้ ให้ยกเลิกการแทรกบรรทัดแล้วลองทำดังนี้

<!DOCTYPE html>
<html>
  <head>
    <title>Critical Path: Measure Async</title>
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <link href="style.css" rel="stylesheet" />
  </head>
  <body onload="measureCRP()">
    <p>Hello <span>web performance</span> students!</p>
    <div><img src="awesome-photo.jpg" /></div>
    <script async src="timing.js"></script>
  </body>
</html>

ลองใช้

JavaScript (ภายนอก) ที่บล็อกโปรแกรมแยกวิเคราะห์:

DOM, CSSOM, JS

JavaScript แบบ Async (ภายนอก):

DOM, CSSOM, async JS

ยิ่งไปกว่านั้น เหตุการณ์ domContentLoaded จะเริ่มทำงานหลังจากแยกวิเคราะห์ HTML แล้วไม่นาน เบราว์เซอร์รู้ว่าจะไม่บล็อก JavaScript และเนื่องจากไม่มีโปรแกรมแยกวิเคราะห์อื่นๆ ที่บล็อกสคริปต์ การสร้าง CSSOM จึงดำเนินการพร้อมกันได้ด้วยเช่นกัน

อีกทางเลือกหนึ่งคือ เราจะแทรกทั้ง CSS และ JavaScript ดังนี้

<!DOCTYPE html>
<html>
  <head>
    <title>Critical Path: Measure Inlined</title>
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <style>
      p {
        font-weight: bold;
      }
      span {
        color: red;
      }
      p span {
        display: none;
      }
      img {
        float: right;
      }
    </style>
  </head>
  <body>
    <p>Hello <span>web performance</span> students!</p>
    <div><img src="awesome-photo.jpg" /></div>
    <script>
      var span = document.getElementsByTagName('span')[0];
      span.textContent = 'interactive'; // change DOM text content
      span.style.display = 'inline'; // change CSSOM property
      // create a new element, style it, and append it to the DOM
      var loadTime = document.createElement('div');
      loadTime.textContent = 'You loaded this page on: ' + new Date();
      loadTime.style.color = 'blue';
      document.body.appendChild(loadTime);
    </script>
  </body>
</html>

ลองใช้

DOM, CSS ในบรรทัด, JS ในบรรทัด

โปรดสังเกตว่าเวลา domContentLoaded มีประสิทธิภาพเหมือนกับในตัวอย่างก่อนหน้า แทนที่จะทำเครื่องหมาย JavaScript เป็นแบบไม่พร้อมกัน เราได้แทรกทั้ง CSS และ JS ไว้ในหน้าเว็บนั้นๆ ซึ่งทำให้หน้า HTML ของเรามีขนาดใหญ่ขึ้นมาก แต่ข้อดีคือเบราว์เซอร์ไม่ต้องรอดึงข้อมูลภายนอก เนื่องจากทุกอย่างอยู่ในหน้าเว็บแล้ว

อย่างที่คุณเห็น ถึงแม้จะเป็นหน้าที่พื้นฐานมาก แต่การเพิ่มประสิทธิภาพเส้นทางการแสดงผลวิกฤติให้เป็นงานที่ไม่สำคัญเลย คือเราต้องทำความเข้าใจกราฟทรัพยากร Dependency ระหว่างทรัพยากรต่างๆ เราต้องระบุว่าทรัพยากรใด "สำคัญ" และเราต้องเลือกระหว่างกลยุทธ์ต่างๆ เกี่ยวกับวิธีรวมทรัพยากรเหล่านั้นในหน้าเว็บ ปัญหานี้ยังไม่มีวิธีแก้ไขเพียงวิธีเดียว ในหน้าเว็บแต่ละหน้าจะแตกต่างกันไป คุณต้องทำตามขั้นตอนที่คล้ายกันด้วยตนเองเพื่อหากลยุทธ์ที่เหมาะสมที่สุด

แต่มาดูกันว่าเราจะย้อนกลับไประบุรูปแบบประสิทธิภาพทั่วไปได้ไหม

รูปแบบประสิทธิภาพ

หน้าเว็บที่เรียบง่ายที่สุดประกอบด้วยมาร์กอัป HTML เท่านั้น ไม่มี CSS, JavaScript หรือทรัพยากรประเภทอื่นๆ หากต้องการแสดงผลหน้านี้ เบราว์เซอร์ต้องเริ่มคําขอ รอให้เอกสาร HTML มาถึง แยกวิเคราะห์ สร้างขึ้น DOM และสุดท้ายแสดงผลบนหน้าจอ

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <title>Critical Path: No Style</title>
  </head>
  <body>
    <p>Hello <span>web performance</span> students!</p>
    <div><img src="awesome-photo.jpg" /></div>
  </body>
</html>

ลองใช้

Hello World CRP

เวลาระหว่าง T0 และ T1 จะบันทึกเวลาในการประมวลผลของเครือข่ายและเซิร์ฟเวอร์ ในกรณีที่ดีที่สุด (หากไฟล์ HTML มีขนาดเล็ก) เครือข่ายจะดึงข้อมูลทั้งเอกสารได้ด้วยการติดต่อเพียง 1 ครั้ง การทำงานของโปรโตคอลการรับส่ง TCP อาจทำให้ไฟล์ที่มีขนาดใหญ่กว่านี้ต้องมีการส่งข้อมูลไป-กลับมากขึ้น ดังนั้น ในกรณีที่ดีที่สุด หน้าเว็บด้านบนจะมีเส้นทางการแสดงผลที่สำคัญแบบไปกลับ 1 ครั้ง (ขั้นต่ำ)

ตอนนี้ให้พิจารณาหน้าเดียวกัน แต่มีไฟล์ CSS ภายนอก

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <link href="style.css" rel="stylesheet" />
  </head>
  <body>
    <p>Hello <span>web performance</span> students!</p>
    <div><img src="awesome-photo.jpg" /></div>
  </body>
</html>

ลองใช้

DOM + CRP ของ CSSOM

เราจะทำการส่งข้อมูลไปกลับของเครือข่ายเพื่อดึงข้อมูลเอกสาร HTML จากนั้นมาร์กอัปที่ดึงมาจะบอกให้เราทราบว่าเราต้องใช้ไฟล์ CSS ด้วย ซึ่งหมายความว่าเบราว์เซอร์ต้องกลับไปที่เซิร์ฟเวอร์และหา CSS ก่อนจึงจะแสดงผลหน้าเว็บบนหน้าจอได้ ด้วยเหตุนี้ หน้านี้จึงต้องมีการส่งข้อมูลไป-กลับอย่างน้อย 2 ครั้งก่อนที่จะแสดงได้ เราขอย้ำอีกครั้งว่าไฟล์ CSS อาจใช้เวลาในการส่งหลายรอบ เราจึงเน้นที่ "ขั้นต่ำ"

ต่อไปนี้เป็นคำส่วนหนึ่งที่เราใช้ในการอธิบายเส้นทางการแสดงผลวิกฤติ

  • ทรัพยากรสําคัญ: ทรัพยากรที่อาจบล็อกการแสดงผลเริ่มต้นของหน้า
  • ความยาวเส้นทางที่สำคัญ: จำนวนรอบหรือเวลาทั้งหมดที่ใช้ในการดึงข้อมูลทรัพยากรที่สำคัญทั้งหมด
  • ไบต์วิกฤต: จำนวนไบต์ทั้งหมดที่จำเป็นในการแสดงผลครั้งแรกของหน้าเว็บ ซึ่งเป็นผลรวมของขนาดไฟล์การโอนของทรัพยากรที่สำคัญทั้งหมด ตัวอย่างแรกของเราซึ่งมีหน้า HTML หน้าเดียว ประกอบด้วยทรัพยากรที่สำคัญเพียงแหล่งเดียว (เอกสาร HTML) ความยาวของเส้นทางวิกฤติก็เท่ากับ 1 เครือข่ายไป-กลับ (สมมติว่าไฟล์มีขนาดเล็ก) และไบต์วิกฤตรวมเพียงขนาดการโอนของเอกสาร HTML เท่านั้น

ตอนนี้ให้เปรียบเทียบสิ่งเหล่านี้กับลักษณะเส้นทางวิกฤตของตัวอย่าง HTML และ CSS ก่อนหน้านี้:

DOM + CSSOM CRP

  • ทรัพยากรที่สำคัญ 2 รายการ
  • การส่งข้อมูลไปกลับอย่างน้อย 2 ครั้งสำหรับความยาวเส้นทางที่สำคัญขั้นต่ำ
  • ไบต์ที่สำคัญ 9 KB

เราต้องใช้ทั้ง HTML และ CSS เพื่อสร้างต้นไม้การแสดงผล ด้วยเหตุนี้ ทั้ง HTML และ CSS จึงถือเป็นทรัพยากรสําคัญ: ระบบจะดึงข้อมูล CSS หลังจากที่เบราว์เซอร์ได้รับเอกสาร HTML แล้วเท่านั้น ดังนั้นความยาวเส้นทางที่สำคัญจึงมีอย่างน้อย 2 รอบ แหล่งข้อมูลทั้ง 2 รายการรวมกันมีจำนวนไบต์ที่สำคัญทั้งหมด 9 KB

ตอนนี้ให้เพิ่มไฟล์ JavaScript เพิ่มเติมลงในส่วนผสม

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <link href="style.css" rel="stylesheet" />
  </head>
  <body>
    <p>Hello <span>web performance</span> students!</p>
    <div><img src="awesome-photo.jpg" /></div>
    <script src="app.js"></script>
  </body>
</html>

ลองใช้

เราได้เพิ่ม app.js ซึ่งเป็นทั้งเนื้อหา JavaScript ภายนอกในหน้าเว็บและทรัพยากรการบล็อกโปรแกรมแยกวิเคราะห์ (ซึ่งสำคัญมาก) ยิ่งไปกว่านั้น ในการเรียกใช้ไฟล์ JavaScript เราต้องบล็อกและรอ CSSOM โปรดทราบว่า JavaScript สามารถค้นหา CSSOM ได้ ดังนั้นเบราว์เซอร์จึงหยุดชั่วคราวจนกว่าจะมีการดาวน์โหลด style.css และสร้าง CSSOM

DOM, CSSOM, CRP ของ JavaScript

อย่างไรก็ตาม ในทางปฏิบัติ หากเราดู "การแสดงภาพ Waterfall ของเครือข่าย" ของหน้านี้ คุณจะเห็นการเริ่มคําขอทั้ง CSS และ JavaScript ในเวลาใกล้เคียงกัน เบราว์เซอร์จะรับ HTML, ค้นพบทั้ง 2 ทรัพยากร และเริ่มคําขอทั้ง 2 รายการ ด้วยเหตุนี้ หน้าเว็บที่แสดงในรูปภาพก่อนหน้าจึงมีลักษณะเส้นทางที่สำคัญดังต่อไปนี้

  • ทรัพยากรสําคัญ 3 รายการ
  • การเดินทางไปกลับอย่างน้อย 2 รอบสำหรับความยาวเส้นทางวิกฤติขั้นต่ำ
  • ไบต์ที่สำคัญ 11 KB

ตอนนี้เรามีทรัพยากรสําคัญ 3 รายการซึ่งมีไบต์สําคัญรวมกัน 11 KB แต่ความยาวเส้นทางสําคัญยังคงเป็น 2 รอบเนื่องจากเราสามารถโอน CSS และ JavaScript พร้อมกันได้ การค้นหาลักษณะของเส้นทางการแสดงผลวิกฤติหมายความว่าคุณสามารถระบุทรัพยากรที่สำคัญและเข้าใจวิธีที่เบราว์เซอร์จะกำหนดเวลาในการดึงข้อมูล

หลังจากแชทกับนักพัฒนาเว็บไซต์แล้ว เราพบว่า JavaScript ที่รวมไว้ในหน้าเว็บไม่จำเป็นต้องบล็อก เนื่องจากเรามีข้อมูลวิเคราะห์และโค้ดอื่นๆ บางส่วนที่ไม่จําเป็นต้องบล็อกการแสดงผลของหน้าเว็บ เมื่อทราบแล้ว เราสามารถเพิ่มแอตทริบิวต์ async ในองค์ประกอบ <script> เพื่อเลิกบล็อกโปรแกรมแยกวิเคราะห์ได้ ดังนี้

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <link href="style.css" rel="stylesheet" />
  </head>
  <body>
    <p>Hello <span>web performance</span> students!</p>
    <div><img src="awesome-photo.jpg" /></div>
    <script src="app.js" async></script>
  </body>
</html>

ลองใช้

DOM, CSSOM, CRP ของ JavaScript แบบอะซิงโครนัส

สคริปต์แบบไม่พร้อมกันมีข้อดีหลายประการ ดังนี้

  • สคริปต์จะไม่บล็อกโปรแกรมแยกวิเคราะห์อีกต่อไปและไม่ได้เป็นส่วนหนึ่งของเส้นทางการแสดงผลวิกฤติ
  • CSS ไม่จำเป็นต้องบล็อกเหตุการณ์ domContentLoaded เนื่องจากไม่มีสคริปต์ที่สำคัญอื่นๆ
  • ยิ่งเหตุการณ์ domContentLoaded เริ่มทำงานเร็วเท่าไร ตรรกะของแอปพลิเคชันอื่นก็จะเริ่มทํางานได้เร็วขึ้นเท่านั้น

ด้วยเหตุนี้ หน้าเว็บที่เพิ่มประสิทธิภาพจึงกลับมาเป็นทรัพยากรสําคัญ 2 รายการ (HTML และ CSS) โดยมีความยาวเส้นทางสําคัญขั้นต่ำ 2 รอบ และไบต์สําคัญทั้งหมด 9KB

สุดท้าย หากสไตล์ชีต CSS จำเป็นต้องใช้สำหรับการพิมพ์เท่านั้น จะมีลักษณะอย่างไร

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <link href="style.css" rel="stylesheet" media="print" />
  </head>
  <body>
    <p>Hello <span>web performance</span> students!</p>
    <div><img src="awesome-photo.jpg" /></div>
    <script src="app.js" async></script>
  </body>
</html>

ลองใช้

DOM, CSS ที่ไม่บล็อก และ CRP ของ JavaScript แบบไม่พร้อมกัน

เนื่องจากทรัพยากร style.css ใช้สำหรับการพิมพ์เท่านั้น เบราว์เซอร์จึงไม่จำเป็นต้องบล็อกบนทรัพยากรเพื่อแสดงผลหน้า ดังนั้นทันทีที่การสร้าง DOM เสร็จสมบูรณ์ เบราว์เซอร์จะมีข้อมูลเพียงพอที่จะแสดงผลหน้าเว็บ ด้วยเหตุนี้ หน้านี้จึงมีทรัพยากรสําคัญเพียงรายการเดียว (เอกสาร HTML) และความยาวเส้นทางการแสดงผลที่สําคัญขั้นต่ำคือ 1 รอบ

ความคิดเห็น