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

การวิเคราะห์บันเดิลและกลยุทธ์การแยกโค้ด

วิเคราะห์ขนาดบันเดิลด้วย rollup-plugin-visualizer และกำหนดกลยุทธ์แยกโค้ดตามเส้นทาง

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

เหตุใดขนาดบันเดิลจึงสำคัญ

บันเดิล JavaScript ขนาดใหญ่ทำให้เวลาจนพร้อมโต้ตอบล่าช้า ต้องดาวน์โหลด แยกวิเคราะห์ และเรียกใช้ JS ทุก KB ก่อนที่หน้าจะโต้ตอบได้ โดยเฉพาะบนเครือข่ายมือถือที่ช้า

การวิเคราะห์ด้วย rollup-plugin-visualizer

ในโปรเจกต์ Vite ให้ใช้ปลั๊กอิน visualizer เพื่อสร้างแผนผังต้นไม้ของบันเดิล ซึ่งแสดงว่าโมดูลใดใช้พื้นที่มากที่สุด

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

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

// After build, open the generated HTML file to explore the treemap

ตัววิเคราะห์บันเดิลของ Next.js

ใช้ @next/bundle-analyzer เพื่อวิเคราะห์บันเดิลฝั่งเซิร์ฟเวอร์และฝั่งไคลเอ็นต์ใน Next.js

npm install @next/bundle-analyzer

// next.config.js
const withBundleAnalyzer = require('@next/bundle-analyzer')({
  enabled: process.env.ANALYZE === 'true',
});

module.exports = withBundleAnalyzer({});

// Run:
// ANALYZE=true npm run build

การแยกโค้ดตามเส้นทาง

การแยกที่ส่งผลมากที่สุดคือ โหลดโค้ดของแต่ละเส้นทางเมื่อผู้ใช้นำทางไปยังเส้นทางนั้นเท่านั้น React Router ที่ใช้ lazy() และ App Router ของ Next.js ทำเช่นนี้โดยอัตโนมัติ

// React Router v6 with lazy loading
import { lazy, Suspense } from 'react';

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

<Routes>
  <Route path="/dashboard" element={<Suspense fallback={<Loading />}><Dashboard /></Suspense>} />
  <Route path="/settings" element={<Suspense fallback={<Loading />}><Settings /></Suspense>} />
</Routes>

การแยกโค้ดระดับคอมโพเนนต์

เลื่อนการโหลดคอมโพเนนต์ขนาดใหญ่ เช่น แผนที่ แผนภูมิ และตัวแก้ไข จนกว่าจะจำเป็น โดยใช้ lazy()

const MonacoEditor = lazy(() => import('@monaco-editor/react'));
const MapView = lazy(() => import('./MapView'));

function ProductEditor({ showMap }) {
  return (
    <>
      <Suspense fallback={<EditorSkeleton />}><MonacoEditor /></Suspense>
      {showMap && <Suspense fallback={<MapSkeleton />}><MapView /></Suspense>}
    </>
  );
}

การนำเข้าแบบไดนามิกสำหรับฟีเจอร์ที่มีเงื่อนไข

นำเข้าไลบรารีขนาดใหญ่เฉพาะเมื่อเปิดใช้ฟีเจอร์นั้น เพื่อหลีกเลี่ยงการโหลดไลบรารีให้ผู้ใช้ทุกคน

async function exportToPDF() {
  const { default: jsPDF } = await import('jspdf'); // ~300KB — loaded on demand
  const doc = new jsPDF();
  doc.text('Hello', 10, 10);
  doc.save('export.pdf');
}

การตัดโค้ดที่ไม่ได้ใช้

เครื่องมือรวมบันเดิลสมัยใหม่จะลบการส่งออกที่ไม่ได้ใช้หรือโค้ดที่ตายแล้วออก ตรวจสอบให้แน่ใจว่าการพึ่งพาของคุณรองรับ ESM ไม่ใช่ CJS เพื่อให้การตัดโค้ดที่ไม่ได้ใช้ทำงาน และหลีกเลี่ยงการนำเข้าทั้งไลบรารีเมื่อต้องการใช้เพียงฟังก์ชันเดียว

// Bad — imports entire lodash (~70KB):
import _ from 'lodash';
const result = _.debounce(fn, 300);

// Good — imports only debounce (<2KB):
import debounce from 'lodash/debounce';
// or with tree-shaking-friendly lodash-es:
import { debounce } from 'lodash-es';

การโหลด chunk สำคัญล่วงหน้า

ใช้ <link rel='modulepreload'> หรือคอมเมนต์พิเศษของ Webpack เพื่อโหลด chunk ของหน้าถัดไปล่วงหน้า ขณะที่ผู้ใช้ยังอยู่ในหน้าปัจจุบัน

// Webpack magic comment — preload on hover:
const Dashboard = lazy(() => import(/* webpackPrefetch: true */ './Dashboard'));
// or preload (higher priority):
const Dashboard = lazy(() => import(/* webpackPreload: true */ './Dashboard'));

การวิเคราะห์ผลกระทบจากไลบรารีภายนอก

ใช้ bundlephobia.com หรือส่วนขยาย Import Cost สำหรับ VS Code เพื่อดูขนาดหลังบีบอัดด้วย gzip ของแพ็กเกจ npm ใด ๆ ก่อนติดตั้ง

การกำหนดงบประมาณขนาดบันเดิล

กำหนดขีดจำกัดขนาดต่อเส้นทางในไฟล์กำหนดค่าของ Webpack หรือ Vite การสร้างจะล้มเหลวหาก chunk มีขนาดเกินงบประมาณ ทำให้ตรวจพบการเพิ่มขนาดโดยไม่ตั้งใจใน CI

// vite.config.ts
build: {
  rollupOptions: {
    output: {
      manualChunks: {
        'vendor-react': ['react', 'react-dom'],
        'vendor-router': ['react-router-dom'],
      },
    },
  },
  chunkSizeWarningLimit: 200, // warn at 200KB
},

ตรวจสอบความเข้าใจ

กลยุทธ์การแยกโค้ดใดส่งผลมากที่สุดสำหรับแอป React แบบ SPA ที่มีหลายหน้า

สรุปทบทวน

วิเคราะห์บันเดิลด้วย rollup-plugin-visualizer หรือ @next/bundle-analyzer ใช้การแยกโค้ดตามเส้นทางและระดับคอมโพเนนต์ด้วย lazy() ใช้การตัดโค้ดที่ไม่ได้ใช้โดยนำเข้าเฉพาะสิ่งที่ใช้งาน กำหนดงบประมาณขนาดใน CI และใช้คำใบ้การดึงข้อมูลล่วงหน้าหรือการโหลดล่วงหน้าสำหรับเส้นทางถัดไปที่คาดว่าจะถูกเปิด

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

บทเรียน “การวิเคราะห์บันเดิลและกลยุทธ์การแยกโค้ด” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การวิเคราะห์บันเดิลและกลยุทธ์การแยกโค้ด”

วิเคราะห์ขนาดบันเดิลด้วย rollup-plugin-visualizer และกำหนดกลยุทธ์แยกโค้ดตามเส้นทาง คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “การวิเคราะห์บันเดิลและกลยุทธ์การแยกโค้ด” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การวัด Core Web Vitals ในแอป React
  2. การวิเคราะห์บันเดิลและกลยุทธ์การแยกโค้ด
  3. การเพิ่มประสิทธิภาพรูปภาพและฟอนต์ใน React
  4. การลด INP: การเพิ่มประสิทธิภาพตัวจัดการอีเวนต์
← กลับไปที่ React Academy