0Pricing
Frontend Academy · บทเรียน

การแยกโค้ดและเส้นทางแบบ Lazy

ใช้ dynamic import() เพื่อแยกบันเดิลตามขอบเขตของเส้นทาง โหลดคอมโพเนนต์ React และ Vue เมื่อจำเป็น และติดตามขนาดชังก์ในผลลัพธ์การบิลด์

การแยกโค้ดและเส้นทางแบบ Lazy เป็นบทเรียน Frontend Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Frontend Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องแบ่งโค้ด

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

การนำเข้าแบบไดนามิก import()

import('./module') ส่งคืน Promise ที่แก้ไขเป็นโมดูล ตัวรวมโค้ด (Vite, webpack) จะตรวจพบรูปแบบนี้และสร้างส่วนย่อยแยกต่างหากที่โหลดขณะทำงาน

// Without split — entire heavy lib in main bundle:
import { generateChart } from 'heavy-chart-lib';

// With split — loaded only when needed:
button.addEventListener('click', async () => {
  const { generateChart } = await import('heavy-chart-lib');
  generateChart(data);
});

React.lazy() — การแบ่งโค้ดระดับองค์ประกอบ

React.lazy(() => import('./Heavy')) สร้างองค์ประกอบที่โหลดโค้ดเมื่อมีการแสดงผลครั้งแรกเท่านั้น ครอบด้วย <Suspense> เพื่อแสดงทางเลือกสำรองระหว่างโหลด

import { lazy, Suspense } from 'react';

const Dashboard = lazy(() => import('./Dashboard'));

function App() {
  return (
    <Suspense fallback={<Spinner />}>
      <Dashboard />
    </Suspense>
  );
}

การแบ่งโค้ดตามเส้นทางใน React Router

แต่ละเส้นทางจะมีส่วนย่อยของตัวเอง ผู้ใช้จึงดาวน์โหลดเฉพาะโค้ดของหน้าที่เข้าชม

import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import { lazy, Suspense } from 'react';

const Home    = lazy(() => import('./pages/Home'));
const Profile = lazy(() => import('./pages/Profile'));
const Admin   = lazy(() => import('./pages/Admin'));

const router = createBrowserRouter([
  { path: '/',        element: <Suspense fallback={<Spinner/>}><Home /></Suspense> },
  { path: '/profile', element: <Suspense fallback={<Spinner/>}><Profile /></Suspense> },
  { path: '/admin',   element: <Suspense fallback={<Spinner/>}><Admin /></Suspense> }
]);

องค์ประกอบแบบอะซิงโครนัสของ Vue 3

Vue มี defineAsyncComponent สำหรับรูปแบบเดียวกัน

import { defineAsyncComponent } from 'vue';

const Dashboard = defineAsyncComponent(() =>
  import('./Dashboard.vue')
);

// Use in template like a normal component

เส้นทางแบบโหลดเมื่อจำเป็นของ Vue Router

Vue Router รองรับการนำเข้าแบบไดนามิกในการกำหนดเส้นทาง จึงสร้างส่วนย่อยแยกตามเส้นทาง

const routes = [
  { path: '/',        component: () => import('./pages/Home.vue') },
  { path: '/profile', component: () => import('./pages/Profile.vue') },
  { path: '/admin',   component: () => import('./pages/Admin.vue') }
];

คอมเมนต์พิเศษของ webpack

ระบุชื่อส่วนย่อยและพฤติกรรมการดึงข้อมูลล่วงหน้าผ่าน 'คอมเมนต์พิเศษ' ของ webpack ภายในคำสั่งนำเข้า

const Profile = lazy(() =>
  import(/* webpackChunkName: "profile", webpackPrefetch: true */ './Profile')
);

// Vite supports a subset; @vite-ignore for special cases

การดึงข้อมูลล่วงหน้าเทียบกับการโหลดล่วงหน้า

prefetch: ดาวน์โหลดส่วนย่อยในช่วงที่ระบบว่าง สำหรับการนำทางถัดไปที่มีแนวโน้มจะเกิดขึ้น preload: ดาวน์โหลดทันทีด้วยลำดับความสำคัญสูง สำหรับส่วนย่อยสำคัญของเส้นทางปัจจุบัน ใช้ prefetch เมื่อผู้ใช้นำเมาส์ไปวางเหนือลิงก์ และใช้ preload เมื่อทราบว่าจำเป็นต้องใช้ในไม่ช้า

ตัววิเคราะห์ชุดรวม

ใช้ rollup-plugin-visualizer (Vite) หรือ webpack-bundle-analyzer เพื่อแสดงภาพขนาดส่วนย่อย มองหารายการต่อไปนี้: ส่วนย่อยที่มีขนาดใหญ่เกินไป การพึ่งพาที่ซ้ำกัน และไลบรารีที่คุณลืมตัดโค้ดที่ไม่ได้ใช้ออก

// vite.config.ts
import { visualizer } from 'rollup-plugin-visualizer';

export default {
  plugins: [visualizer({ open: true, gzipSize: true })]
};

การแยกส่วนย่อยของไลบรารีภายนอก

แยกไลบรารีจากบุคคลที่สามเป็นส่วนย่อยของไลบรารีภายนอกโดยเฉพาะ ซึ่งเปลี่ยนแปลงน้อยกว่าโค้ดแอป เบราว์เซอร์จึงเก็บส่วนนี้ไว้ในแคชข้ามการนำโปรเจกต์ขึ้นระบบได้

// vite.config.ts
export default {
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          react: ['react', 'react-dom'],
          ui: ['@radix-ui/react-dialog', '@radix-ui/react-tooltip']
        }
      }
    }
  }
};

กรณีที่ไม่ควรแบ่งโค้ด

ส่วนย่อยขนาดเล็กมาก (ต่ำกว่า 20KB) ให้ผลเสียมากกว่าผลดี เพราะค่าใช้จ่ายของ HTTP สูงกว่าขนาดชุดรวมที่ประหยัดได้ อย่าแบ่งทุกองค์ประกอบ ให้แบ่งตามขอบเขตของเส้นทางและรอบฟีเจอร์ที่มีขนาดใหญ่จริง ๆ

ตรวจสอบอย่างรวดเร็ว

ตัวครอบ lazy() ของ React ต้องใช้คู่กับอะไรจึงจะแสดงผลได้อย่างถูกต้อง

สรุป: การแบ่งโค้ด

การนำเข้าแบบไดนามิก import() จะสร้างส่วนย่อยแยกต่างหาก ใช้ React.lazy ร่วมกับ Suspense สำหรับการแบ่งโค้ดระดับองค์ประกอบ ใช้องค์ประกอบของเส้นทางที่โหลดเมื่อจำเป็นใน React Router หรือ Vue Router ใช้ prefetch สำหรับส่วนย่อยที่มีแนวโน้มจะถูกใช้ถัดไป และใช้ preload สำหรับส่วนย่อยสำคัญ ตัววิเคราะห์ชุดรวมช่วยให้เห็นโค้ดที่สูญเปล่า แยกไลบรารีภายนอกเพื่อให้เก็บแคชได้ดีขึ้น และหลีกเลี่ยงส่วนย่อยขนาดเล็กมากที่ต่ำกว่า 20KB

คำถามที่พบบ่อย

บทเรียน “การแยกโค้ดและเส้นทางแบบ Lazy” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแยกโค้ดและเส้นทางแบบ Lazy” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Frontend Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแยกโค้ดและเส้นทางแบบ Lazy”

ใช้ dynamic import() เพื่อแยกบันเดิลตามขอบเขตของเส้นทาง โหลดคอมโพเนนต์ React และ Vue เมื่อจำเป็น และติดตามขนาดชังก์ในผลลัพธ์การบิลด์ คุณปฏิบัติ Frontend Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Frontend Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Frontend Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การแยกโค้ดและเส้นทางแบบ Lazy” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Frontend Academy นี้ได้ไหม

ได้ บทเรียน Frontend Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ตัวชี้วัด Core Web Vitals: LCP, FID และ CLS
  2. การตรวจสอบและให้คะแนนด้วย Lighthouse
  3. การปรับปรุงรูปภาพ: การโหลดแบบ lazy และรูปแบบ WebP
  4. การแยกโค้ดและเส้นทางแบบ Lazy
← กลับไปที่ Frontend Academy