การวิเคราะห์บันเดิลและกลยุทธ์การแยกโค้ด
วิเคราะห์ขนาดบันเดิลด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การวัด Core Web Vitals ในแอป React
- การวิเคราะห์บันเดิลและกลยุทธ์การแยกโค้ด
- การเพิ่มประสิทธิภาพรูปภาพและฟอนต์ใน React
- การลด INP: การเพิ่มประสิทธิภาพตัวจัดการอีเวนต์