ไทย

คู่มือฉบับสมบูรณ์เกี่ยวกับ Lazy Loading สำหรับรูปภาพและคอมโพเนนต์ เพื่อเพิ่มประสิทธิภาพเว็บไซต์และประสบการณ์ผู้ใช้สำหรับผู้ชมทั่วโลก

Lazy Loading: การเพิ่มประสิทธิภาพเว็บไซต์ด้วยการโหลดรูปภาพและคอมโพเนนต์

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

Lazy Loading คืออะไร?

Lazy Loading คือเทคนิคที่ชะลอการโหลดทรัพยากร (เช่น รูปภาพ, iframe, คอมโพเนนต์) ออกไปจนกว่าจะมีความจำเป็นต้องใช้จริงๆ ซึ่งโดยทั่วไปคือเมื่อทรัพยากรนั้นกำลังจะเข้ามาในขอบเขตการมองเห็น (viewport) ของผู้ใช้ ซึ่งหมายความว่าแทนที่จะโหลดเนื้อหาทั้งหมดตั้งแต่แรก เบราว์เซอร์จะโหลดเฉพาะทรัพยากรที่ผู้ใช้มองเห็นในการโหลดหน้าเว็บครั้งแรกเท่านั้น และเมื่อผู้ใช้เลื่อนหน้าลงไป ทรัพยากรอื่นๆ ก็จะถูกโหลดเมื่อมันปรากฏขึ้น

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

ทำไมต้องใช้ Lazy Loading?

Lazy Loading มีประโยชน์ที่สำคัญหลายประการ:

การทำ Lazy Loading กับรูปภาพ

รูปภาพมักเป็นเนื้อหาที่มีขนาดใหญ่ที่สุดบนเว็บไซต์ ทำให้เป็นตัวเลือกอันดับต้นๆ สำหรับการทำ Lazy Loading ต่อไปนี้คือวิธีการนำ Lazy Loading ไปใช้กับรูปภาพ:

Native Lazy Loading

เบราว์เซอร์สมัยใหม่ (Chrome, Firefox, Safari และ Edge) รองรับ Native Lazy Loading โดยใช้แอตทริบิวต์ loading นี่เป็นวิธีที่ง่ายและมีประสิทธิภาพที่สุดในการทำ Lazy Load กับรูปภาพ

หากต้องการเปิดใช้งาน Native Lazy Loading เพียงแค่เพิ่มแอตทริบิวต์ loading="lazy" ลงในแท็ก <img> ของคุณ:

<img src="image.jpg" alt="My Image" loading="lazy">

แอตทริบิวต์ loading สามารถมีได้ 3 ค่า:

ตัวอย่าง:

<img src="london_bridge.jpg" alt="London Bridge" loading="lazy" width="600" height="400">
<img src="tokyo_skyline.jpg" alt="Tokyo Skyline" loading="lazy" width="600" height="400">
<img src="rio_de_janeiro.jpg" alt="Rio de Janeiro" loading="lazy" width="600" height="400">

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

การทำ Lazy Loading ด้วย JavaScript

สำหรับเบราว์เซอร์รุ่นเก่าที่ไม่รองรับ Native Lazy Loading คุณสามารถใช้ไลบรารี JavaScript หรือเขียนสคริปต์ของคุณเองได้ นี่คือตัวอย่างพื้นฐานโดยใช้ Intersection Observer API:

const images = document.querySelectorAll('img[data-src]');

const observer = new IntersectionObserver((entries, observer) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      img.removeAttribute('data-src');
      observer.unobserve(img);
    }
  });
});

images.forEach(img => {
  observer.observe(img);
});

คำอธิบาย:

  1. เราเลือกองค์ประกอบ <img> ทั้งหมดที่มีแอตทริบิวต์ data-src
  2. เราสร้างอินสแตนซ์ IntersectionObserver ใหม่ ฟังก์ชัน callback จะถูกเรียกใช้งานเมื่อองค์ประกอบที่สังเกตการณ์เข้าหรือออกจากขอบเขตการมองเห็น
  3. ภายในฟังก์ชัน callback เราจะวนซ้ำผ่าน entries (องค์ประกอบที่ตัดกับขอบเขตการมองเห็น)
  4. หากองค์ประกอบกำลังตัดกับขอบเขต (entry.isIntersecting เป็น true) เราจะตั้งค่าแอตทริบิวต์ src ของรูปภาพเป็นค่าของแอตทริบิวต์ data-src
  5. จากนั้นเราจะลบแอตทริบิวต์ data-src และหยุดสังเกตการณ์รูปภาพนั้น เนื่องจากไม่จำเป็นอีกต่อไป
  6. สุดท้าย เราจะสังเกตการณ์แต่ละรูปภาพโดยใช้ observer.observe(img)

โครงสร้าง HTML:

<img data-src="image.jpg" alt="My Image">

สังเกตว่า URL ของรูปภาพจริงถูกวางไว้ในแอตทริบิวต์ data-src แทนที่จะเป็นแอตทริบิวต์ src ซึ่งจะช่วยป้องกันไม่ให้เบราว์เซอร์โหลดรูปภาพทันที

การใช้ไลบรารี Lazy Loading

มีไลบรารี JavaScript หลายตัวที่สามารถทำให้กระบวนการทำ Lazy Loading กับรูปภาพง่ายขึ้น ตัวเลือกยอดนิยมบางส่วน ได้แก่:

โดยทั่วไปแล้ว ไลบรารีเหล่านี้จะมี API ที่เรียบง่ายสำหรับการเริ่มต้นใช้งาน Lazy Loading และมีคุณสมบัติเพิ่มเติม เช่น รูปภาพสำรอง (placeholder) และเอฟเฟกต์การเปลี่ยนภาพ

การทำ Lazy Loading กับคอมโพเนนต์

Lazy Loading ไม่ได้มีไว้สำหรับรูปภาพเท่านั้น แต่ยังสามารถนำไปใช้กับคอมโพเนนต์ได้ด้วย โดยเฉพาะในเฟรมเวิร์ก JavaScript สมัยใหม่ เช่น React, Angular และ Vue ซึ่งมีประโยชน์อย่างยิ่งสำหรับแอปพลิเคชันหน้าเดียว (SPAs) ขนาดใหญ่ที่มีคอมโพเนนต์จำนวนมาก

การทำ Lazy Loading ใน React

React มีฟังก์ชัน React.lazy() ในตัวสำหรับการทำ Lazy Loading กับคอมโพเนนต์ ฟังก์ชันนี้ช่วยให้คุณสามารถนำเข้าคอมโพเนนต์แบบไดนามิกได้ ซึ่งจะถูกโหลดเมื่อมีการเรนเดอร์เท่านั้น

import React, { Suspense } from 'react';

const MyComponent = React.lazy(() => import('./MyComponent'));

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <MyComponent />
    </Suspense>
  );
}

export default App;

คำอธิบาย:

  1. เราใช้ React.lazy() เพื่อนำเข้า MyComponent แบบไดนามิก ฟังก์ชัน import() จะคืนค่า promise ที่จะ resolve เป็นโมดูลของคอมโพเนนต์
  2. เราครอบ MyComponent ด้วยคอมโพเนนต์ <Suspense> คอมโพเนนต์ Suspense ช่วยให้คุณสามารถแสดง UI สำรอง (ในกรณีนี้คือ "Loading...") ในขณะที่คอมโพเนนต์กำลังถูกโหลด

การทำ Lazy Loading ใน Angular

Angular รองรับการทำ Lazy Loading กับโมดูลโดยใช้คุณสมบัติ loadChildren ในการกำหนดค่า routing

const routes: Routes = [
  {
    path: 'my-module',
    loadChildren: () => import('./my-module/my-module.module').then(m => m.MyModuleModule)
  }
];

คำอธิบาย:

  1. เรากำหนด route สำหรับพาธ my-module
  2. เราใช้คุณสมบัติ loadChildren เพื่อระบุว่า MyModuleModule ควรถูกโหลดแบบ Lazy ฟังก์ชัน import() จะนำเข้าโมดูลแบบไดนามิก
  3. เมธอด then() ถูกใช้เพื่อเข้าถึงโมดูลและคืนค่าคลาส MyModuleModule

การทำ Lazy Loading ใน Vue.js

Vue.js รองรับการทำ Lazy Loading กับคอมโพเนนต์โดยใช้การนำเข้าแบบไดนามิกและแท็ก component

<template>
  <component :is="dynamicComponent"></component>
</template>

<script>
export default {
  data() {
    return {
      dynamicComponent: null
    }
  },
  mounted() {
    import('./MyComponent.vue')
      .then(module => {
        this.dynamicComponent = module.default
      })
  }
}
</script>

คำอธิบาย:

  1. เราใช้แท็ก <component> พร้อมกับแอตทริบิวต์ :is เพื่อเรนเดอร์คอมโพเนนต์แบบไดนามิก
  2. ใน mounted lifecycle hook เราใช้ฟังก์ชัน import() เพื่อนำเข้า MyComponent.vue แบบไดนามิก
  3. จากนั้นเราตั้งค่า data property dynamicComponent เป็น default export ของโมดูล

แนวทางปฏิบัติที่ดีที่สุดสำหรับ Lazy Loading

เพื่อให้แน่ใจว่าการทำ Lazy Loading มีประสิทธิภาพ ควรพิจารณาแนวทางปฏิบัติที่ดีที่สุดเหล่านี้:

ข้อควรพิจารณาด้านความเป็นสากล (Internationalization)

เมื่อนำ Lazy Loading ไปใช้สำหรับผู้ชมทั่วโลก ควรพิจารณาปัจจัยด้านความเป็นสากลเหล่านี้:

สรุป

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

เปิดรับ Lazy Loading และปลดล็อกประสบการณ์เว็บที่รวดเร็ว มีประสิทธิภาพ และเป็นมิตรต่อผู้ใช้สำหรับทุกคน