กฎและคำแนะนำของ PageSpeed

เผยแพร่เมื่อวันที่ 17 สิงหาคม 2018

คู่มือนี้จะตรวจสอบกฎของ 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() เป็นวิธีที่ดีกว่าในการขอข้อมูลแบบอะซิงโครนัส fetch() ประมวลผลการตอบกลับโดยใช้ Promises แทนเครื่องจัดการเหตุการณ์หลายรายการ การตอบกลับ fetch() เป็นออบเจ็กต์สตรีม ซึ่งต่างจากการตอบกลับ 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 จำเป็นสำหรับการสร้าง Render Tree และ JavaScript มักจะบล็อก CSS ในระหว่างการสร้างหน้าเว็บในตอนแรก ตรวจสอบว่าได้ทำเครื่องหมาย CSS ที่ไม่จำเป็นว่าไม่สำคัญ (เช่น การพิมพ์และการสืบค้นสื่ออื่นๆ) และปริมาณ CSS ที่สำคัญและเวลาในการแสดงผลมีค่าน้อยที่สุดเท่าที่จะเป็นไปได้

ใส่ CSS ลงในส่วนหัวของเอกสาร

ระบุทรัพยากร CSS ทั้งหมดไว้ในเอกสาร HTML ให้เร็วที่สุดเพื่อให้เบราว์เซอร์ค้นพบแท็ก <link> และส่งคำขอ CSS โดยเร็วที่สุด

หลีกเลี่ยงการนำเข้า CSS

คำสั่งการนำเข้า CSS (@import) ช่วยให้สไตล์ชีตหนึ่งนำเข้ากฎจากไฟล์สไตล์ชีตอื่นได้ อย่างไรก็ตาม ให้หลีกเลี่ยงคำสั่งเหล่านี้เนื่องจากจะทำให้เกิดการส่งข้อมูลไปกลับเพิ่มเติมในเส้นทางที่สำคัญ โดยระบบจะค้นพบทรัพยากร CSS ที่นำเข้าหลังจากได้รับและแยกวิเคราะห์สไตล์ชีต CSS ที่มีกฎ @import เท่านั้น

รวม CSS การบล็อกการแสดงผลไว้ในหน้า

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

ความคิดเห็น