เพิ่มประสิทธิภาพการ build ของ Webpack! เรียนรู้เทคนิคขั้นสูงในการปรับปรุง Module Graph เพื่อลดเวลาโหลดและเพิ่มประสิทธิภาพสำหรับแอปพลิเคชันระดับโลก
การเพิ่มประสิทธิภาพ Module Graph ของ Webpack: การวิเคราะห์เชิงลึกสำหรับนักพัฒนาระดับโลก
Webpack เป็น module bundler ที่ทรงพลังซึ่งมีบทบาทสำคัญในการพัฒนาเว็บสมัยใหม่ หน้าที่หลักของมันคือการนำโค้ดและ dependency ของแอปพลิเคชันของคุณมารวมกันเป็น bundle ที่ปรับให้เหมาะสมแล้ว ซึ่งสามารถส่งไปยังเบราว์เซอร์ได้อย่างมีประสิทธิภาพ อย่างไรก็ตาม เมื่อแอปพลิเคชันมีความซับซ้อนมากขึ้น การ build ของ Webpack อาจช้าและไม่มีประสิทธิภาพ การทำความเข้าใจและเพิ่มประสิทธิภาพ module graph เป็นกุญแจสำคัญในการปลดล็อกการปรับปรุงประสิทธิภาพที่สำคัญ
Webpack Module Graph คืออะไร?
Module graph คือการแสดงภาพของโมดูลทั้งหมดในแอปพลิเคชันของคุณและความสัมพันธ์ระหว่างกัน เมื่อ Webpack ประมวลผลโค้ดของคุณ มันจะเริ่มต้นจาก entry point (โดยปกติคือไฟล์ JavaScript หลักของคุณ) และจะสำรวจคำสั่ง import
และ require
ทั้งหมดแบบเวียนเกิด (recursively) เพื่อสร้างกราฟนี้ การทำความเข้าใจกราฟนี้จะช่วยให้คุณสามารถระบุคอขวดและใช้เทคนิคการเพิ่มประสิทธิภาพได้
ลองจินตนาการถึงแอปพลิเคชันง่ายๆ:
// index.js
import { greet } from './greeter';
import { formatDate } from './utils';
console.log(greet('World'));
console.log(formatDate(new Date()));
// greeter.js
export function greet(name) {
return `Hello, ${name}!`;
}
// utils.js
export function formatDate(date) {
return date.toLocaleDateString('en-US');
}
Webpack จะสร้าง module graph ที่แสดงว่า index.js
ขึ้นอยู่กับ greeter.js
และ utils.js
สำหรับแอปพลิเคชันที่ซับซ้อนกว่านี้จะมีกราฟที่ใหญ่และเชื่อมโยงกันมากขึ้นอย่างมีนัยสำคัญ
ทำไมการเพิ่มประสิทธิภาพ Module Graph จึงมีความสำคัญ?
Module graph ที่ไม่ได้รับการปรับให้เหมาะสมอาจนำไปสู่ปัญหาหลายประการ:
- ใช้เวลา Build นาน: Webpack ต้องประมวลผลและวิเคราะห์ทุกโมดูลในกราฟ กราฟขนาดใหญ่หมายถึงเวลาในการประมวลผลที่นานขึ้น
- ขนาด Bundle ใหญ่: โมดูลที่ไม่จำเป็นหรือโค้ดที่ซ้ำซ้อนสามารถทำให้ขนาดของ bundle ของคุณใหญ่ขึ้น ส่งผลให้หน้าเว็บโหลดช้าลง
- การ Caching ที่ไม่มีประสิทธิภาพ: หาก module graph ไม่ได้ถูกจัดโครงสร้างอย่างมีประสิทธิภาพ การเปลี่ยนแปลงในโมดูลหนึ่งอาจทำให้แคชของโมดูลอื่นๆ จำนวนมากใช้งานไม่ได้ ทำให้เบราว์เซอร์ต้องดาวน์โหลดไฟล์เหล่านั้นใหม่ ซึ่งเป็นปัญหาอย่างยิ่งสำหรับผู้ใช้ในภูมิภาคที่มีการเชื่อมต่ออินเทอร์เน็ตที่ช้า
เทคนิคการเพิ่มประสิทธิภาพ Module Graph
โชคดีที่ Webpack มีเทคนิคอันทรงพลังหลายอย่างสำหรับการเพิ่มประสิทธิภาพ module graph นี่คือรายละเอียดของวิธีการที่มีประสิทธิภาพที่สุดบางส่วน:
1. Code Splitting
Code splitting คือแนวปฏิบัติในการแบ่งโค้ดของแอปพลิเคชันออกเป็นส่วนย่อยๆ (chunks) ที่มีขนาดเล็กลงและจัดการได้ง่ายขึ้น ซึ่งช่วยให้เบราว์เซอร์สามารถดาวน์โหลดเฉพาะโค้ดที่จำเป็นสำหรับหน้าหรือฟีเจอร์นั้นๆ ได้ เป็นการปรับปรุงเวลาในการโหลดครั้งแรกและประสิทธิภาพโดยรวม
ประโยชน์ของ Code Splitting:
- เวลาในการโหลดครั้งแรกเร็วขึ้น: ผู้ใช้ไม่ต้องดาวน์โหลดทั้งแอปพลิเคชันตั้งแต่แรก
- ปรับปรุงการ Caching: การเปลี่ยนแปลงในส่วนหนึ่งของแอปพลิเคชันไม่จำเป็นต้องทำให้แคชของส่วนอื่นๆ ใช้งานไม่ได้
- ประสบการณ์ผู้ใช้ที่ดีขึ้น: เวลาโหลดที่เร็วขึ้นนำไปสู่ประสบการณ์ผู้ใช้ที่ตอบสนองและน่าพึงพอใจยิ่งขึ้น โดยเฉพาะอย่างยิ่งสำหรับผู้ใช้บนอุปกรณ์มือถือและเครือข่ายที่ช้า
Webpack มีหลายวิธีในการใช้ code splitting:
- Entry Points: กำหนด entry points หลายจุดในไฟล์คอนฟิกของ Webpack แต่ละ entry point จะสร้าง bundle แยกต่างหาก
- Dynamic Imports: ใช้ синтаксис
import()
เพื่อโหลดโมดูลตามความต้องการ Webpack จะสร้าง chunks แยกต่างหากสำหรับโมดูลเหล่านี้โดยอัตโนมัติ ซึ่งมักใช้สำหรับการ lazy-loading คอมโพเนนต์หรือฟีเจอร์ต่างๆ// ตัวอย่างการใช้ dynamic import async function loadComponent() { const { default: MyComponent } = await import('./my-component'); // ใช้ MyComponent }
- SplitChunks Plugin:
SplitChunksPlugin
จะระบุและแยกโมดูลที่ใช้ร่วมกันจากหลาย entry points ออกเป็น chunks แยกต่างหากโดยอัตโนมัติ ซึ่งช่วยลดความซ้ำซ้อนและปรับปรุงการแคช นี่เป็นแนวทางที่พบบ่อยและแนะนำมากที่สุด// webpack.config.js module.exports = { //... optimization: { splitChunks: { chunks: 'all', cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name: 'vendors', chunks: 'all', }, }, }, }, };
ตัวอย่าง: Internationalization (i18n) กับ Code Splitting
สมมติว่าแอปพลิเคชันของคุณรองรับหลายภาษา แทนที่จะรวมคำแปลทุกภาษาไว้ใน bundle หลัก คุณสามารถใช้ code splitting เพื่อโหลดคำแปลเฉพาะเมื่อผู้ใช้เลือกภาษาที่ต้องการ
// i18n.js
export async function loadTranslations(locale) {
switch (locale) {
case 'en':
return import('./translations/en.json');
case 'fr':
return import('./translations/fr.json');
case 'es':
return import('./translations/es.json');
default:
return import('./translations/en.json');
}
}
วิธีนี้ช่วยให้แน่ใจว่าผู้ใช้จะดาวน์โหลดเฉพาะคำแปลที่เกี่ยวข้องกับภาษาของตนเอง ซึ่งช่วยลดขนาด bundle เริ่มต้นได้อย่างมาก
2. Tree Shaking (Dead Code Elimination)
Tree shaking คือกระบวนการกำจัดโค้ดที่ไม่ได้ใช้ออกจาก bundle ของคุณ Webpack จะวิเคราะห์ module graph และระบุโมดูล ฟังก์ชัน หรือตัวแปรที่ไม่เคยถูกใช้งานจริงในแอปพลิเคชันของคุณ โค้ดที่ไม่ได้ใช้เหล่านี้จะถูกกำจัดออกไป ส่งผลให้ได้ bundle ที่มีขนาดเล็กลงและมีประสิทธิภาพมากขึ้น
ข้อกำหนดสำหรับ Tree Shaking ที่มีประสิทธิภาพ:
- ES Modules: Tree shaking อาศัยโครงสร้างแบบ static ของ ES modules (
import
และexport
) โดยทั่วไปแล้ว CommonJS modules (require
) ไม่สามารถทำ tree-shake ได้ - Side Effects: Webpack ต้องเข้าใจว่าโมดูลใดมี side effects (โค้ดที่ดำเนินการนอกขอบเขตของตัวเอง เช่น การแก้ไข DOM หรือการเรียก API) คุณสามารถประกาศโมดูลว่าไม่มี side effect ในไฟล์
package.json
ของคุณโดยใช้คุณสมบัติ"sideEffects": false
หรือระบุไฟล์ที่มี side effects เป็นอาร์เรย์ที่ละเอียดมากขึ้น หาก Webpack ลบโค้ดที่มี side effects ออกไปอย่างไม่ถูกต้อง แอปพลิเคชันของคุณอาจทำงานไม่ถูกต้อง// package.json { //... "sideEffects": false }
- ลดการใช้ Polyfills: ระมัดระวังเกี่ยวกับ polyfills ที่คุณกำลังจะรวมเข้ามา ลองพิจารณาใช้บริการอย่าง Polyfill.io หรือนำเข้า polyfills แบบเลือกตามการรองรับของเบราว์เซอร์
ตัวอย่าง: Lodash และ Tree Shaking
Lodash เป็นไลบรารียูทิลิตี้ยอดนิยมที่มีฟังก์ชันหลากหลาย อย่างไรก็ตาม หากคุณใช้ฟังก์ชันของ Lodash เพียงไม่กี่ฟังก์ชันในแอปพลิเคชันของคุณ การนำเข้าทั้งไลบรารีอาจทำให้ขนาด bundle ของคุณเพิ่มขึ้นอย่างมาก Tree shaking สามารถช่วยบรรเทาปัญหานี้ได้
การนำเข้าที่ไม่มีประสิทธิภาพ:
// ก่อน tree shaking
import _ from 'lodash';
_.map([1, 2, 3], (x) => x * 2);
การนำเข้าที่มีประสิทธิภาพ (สามารถ Tree-shake ได้):
// หลัง tree shaking
import map from 'lodash/map';
map([1, 2, 3], (x) => x * 2);
โดยการนำเข้าเฉพาะฟังก์ชัน Lodash ที่คุณต้องการ คุณจะช่วยให้ Webpack สามารถทำ tree-shake ส่วนที่เหลือของไลบรารีได้อย่างมีประสิทธิภาพ ซึ่งจะช่วยลดขนาด bundle ของคุณ
3. Scope Hoisting (Module Concatenation)
Scope hoisting หรือที่เรียกว่า module concatenation เป็นเทคนิคที่รวมหลายโมดูลไว้ใน scope เดียวกัน ซึ่งช่วยลด overhead ของการเรียกฟังก์ชันและปรับปรุงความเร็วในการทำงานโดยรวมของโค้ดของคุณ
Scope Hoisting ทำงานอย่างไร:
หากไม่มี scope hoisting แต่ละโมดูลจะถูกห่อหุ้มด้วย scope ของฟังก์ชันของตัวเอง เมื่อโมดูลหนึ่งเรียกฟังก์ชันในโมดูลอื่น จะมี overhead ของการเรียกฟังก์ชันเกิดขึ้น Scope hoisting จะกำจัด scope ที่แยกกันเหล่านี้ออกไป ทำให้สามารถเข้าถึงฟังก์ชันได้โดยตรงโดยไม่มี overhead ของการเรียกฟังก์ชัน
การเปิดใช้งาน Scope Hoisting:
Scope hoisting ถูกเปิดใช้งานโดยค่าเริ่มต้นในโหมด production ของ Webpack คุณยังสามารถเปิดใช้งานได้อย่างชัดเจนในไฟล์คอนฟิกของ Webpack:
// webpack.config.js
module.exports = {
//...
optimization: {
concatenateModules: true,
},
};
ประโยชน์ของ Scope Hoisting:
- ปรับปรุงประสิทธิภาพ: ลด overhead ของการเรียกฟังก์ชันทำให้เวลาในการทำงานเร็วขึ้น
- ขนาด Bundle เล็กลง: Scope hoisting บางครั้งสามารถลดขนาด bundle ได้โดยการกำจัดฟังก์ชัน wrapper ที่ไม่จำเป็น
4. Module Federation
Module Federation เป็นฟีเจอร์ที่ทรงพลังที่เปิดตัวใน Webpack 5 ซึ่งช่วยให้คุณสามารถแชร์โค้ดระหว่าง Webpack builds ที่แตกต่างกันได้ สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับองค์กรขนาดใหญ่ที่มีหลายทีมทำงานในแอปพลิเคชันแยกกันซึ่งจำเป็นต้องแชร์คอมโพเนนต์หรือไลบรารีทั่วไป มันเป็นตัวเปลี่ยนเกมสำหรับสถาปัตยกรรม micro-frontend
แนวคิดหลัก:
- Host: แอปพลิเคชันที่ใช้โมดูลจากแอปพลิเคชันอื่น (remotes)
- Remote: แอปพลิเคชันที่เปิดเผยโมดูลเพื่อให้แอปพลิเคชันอื่น (hosts) นำไปใช้
- Shared: โมดูลที่แชร์กันระหว่างแอปพลิเคชัน host และ remote Webpack จะตรวจสอบให้แน่ใจโดยอัตโนมัติว่ามีการโหลดโมดูลที่แชร์แต่ละตัวเพียงเวอร์ชันเดียว เพื่อป้องกันความซ้ำซ้อนและความขัดแย้ง
ตัวอย่าง: การแชร์ไลบรารี UI Component
สมมติว่าคุณมีสองแอปพลิเคชันคือ app1
และ app2
ซึ่งทั้งสองใช้ไลบรารี UI component ร่วมกัน ด้วย Module Federation คุณสามารถเปิดเผยไลบรารี UI component เป็น remote module และนำไปใช้ในทั้งสองแอปพลิเคชันได้
app1 (Host):
// webpack.config.js
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
module.exports = {
//...
plugins: [
new ModuleFederationPlugin({
name: 'app1',
remotes: {
'ui': 'ui@http://localhost:3001/remoteEntry.js',
},
shared: ['react', 'react-dom'],
}),
],
};
// App.js
import React from 'react';
import Button from 'ui/Button';
function App() {
return (
App 1
);
}
export default App;
app2 (Host เช่นกัน):
// webpack.config.js
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
module.exports = {
//...
plugins: [
new ModuleFederationPlugin({
name: 'app2',
remotes: {
'ui': 'ui@http://localhost:3001/remoteEntry.js',
},
shared: ['react', 'react-dom'],
}),
],
};
ui (Remote):
// webpack.config.js
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
module.exports = {
//...
plugins: [
new ModuleFederationPlugin({
name: 'ui',
filename: 'remoteEntry.js',
exposes: {
'./Button': './src/Button',
},
shared: ['react', 'react-dom'],
}),
],
};
ประโยชน์ของ Module Federation:
- การแชร์โค้ด: ช่วยให้สามารถแชร์โค้ดระหว่างแอปพลิเคชันต่างๆ ลดความซ้ำซ้อนและปรับปรุงการบำรุงรักษา
- การ Deploy ที่เป็นอิสระ: ช่วยให้ทีมสามารถ deploy แอปพลิเคชันของตนได้อย่างอิสระโดยไม่ต้องประสานงานกับทีมอื่น
- สถาปัตยกรรม Micro-Frontend: อำนวยความสะดวกในการพัฒนาสถาปัตยกรรม micro-frontend ที่แอปพลิเคชันประกอบด้วย frontend ขนาดเล็กที่สามารถ deploy ได้อย่างอิสระ
ข้อควรพิจารณาสำหรับ Module Federation ในระดับโลก:
- การจัดการเวอร์ชัน (Versioning): จัดการเวอร์ชันของโมดูลที่แชร์อย่างระมัดระวังเพื่อหลีกเลี่ยงปัญหาความเข้ากันได้
- การจัดการ Dependency: ตรวจสอบให้แน่ใจว่าทุกแอปพลิเคชันมี dependency ที่สอดคล้องกัน
- ความปลอดภัย: ใช้มาตรการความปลอดภัยที่เหมาะสมเพื่อป้องกันโมดูลที่แชร์จากการเข้าถึงโดยไม่ได้รับอนุญาต
5. กลยุทธ์การ Caching
การแคชที่มีประสิทธิภาพเป็นสิ่งจำเป็นสำหรับการปรับปรุงประสิทธิภาพของเว็บแอปพลิเคชัน Webpack มีหลายวิธีในการใช้ประโยชน์จากการแคชเพื่อเร่งความเร็วในการ build และลดเวลาในการโหลด
ประเภทของการ Caching:
- Browser Caching: สั่งให้เบราว์เซอร์แคช static assets (JavaScript, CSS, รูปภาพ) เพื่อที่จะไม่ต้องดาวน์โหลดซ้ำๆ โดยปกติจะควบคุมผ่าน HTTP headers (Cache-Control, Expires)
- Webpack Caching: ใช้กลไกการแคชในตัวของ Webpack เพื่อจัดเก็บผลลัพธ์ของการ build ครั้งก่อนๆ ซึ่งสามารถเร่งความเร็วในการ build ครั้งถัดไปได้อย่างมาก โดยเฉพาะสำหรับโปรเจกต์ขนาดใหญ่ Webpack 5 นำเสนอ persistent caching ซึ่งจะเก็บแคชไว้บนดิสก์ ซึ่งมีประโยชน์อย่างยิ่งในสภาพแวดล้อม CI/CD
// webpack.config.js module.exports = { //... cache: { type: 'filesystem', buildDependencies: { config: [__filename], }, }, };
- Content Hashing: ใช้ content hashes ในชื่อไฟล์ของคุณเพื่อให้แน่ใจว่าเบราว์เซอร์จะดาวน์โหลดไฟล์เวอร์ชันใหม่เฉพาะเมื่อเนื้อหาของไฟล์มีการเปลี่ยนแปลง ซึ่งจะเพิ่มประสิทธิภาพของการแคชของเบราว์เซอร์ให้สูงสุด
// webpack.config.js module.exports = { //... output: { filename: '[name].[contenthash].js', path: path.resolve(__dirname, 'dist'), clean: true, }, };
ข้อควรพิจารณาสำหรับการ Caching ในระดับโลก:
- การผนวกรวมกับ CDN: ใช้ Content Delivery Network (CDN) เพื่อกระจาย static assets ของคุณไปยังเซิร์ฟเวอร์ทั่วโลก ซึ่งช่วยลด latency และปรับปรุงเวลาในการโหลดสำหรับผู้ใช้ในสถานที่ทางภูมิศาสตร์ที่แตกต่างกัน ลองพิจารณาใช้ CDN ในระดับภูมิภาคเพื่อให้บริการเนื้อหาที่แตกต่างกัน (เช่น รูปภาพที่แปลเป็นภาษาท้องถิ่น) จากเซิร์ฟเวอร์ที่ใกล้ผู้ใช้ที่สุด
- การทำให้แคชเป็นโมฆะ (Cache Invalidation): กำหนดกลยุทธ์สำหรับการทำให้แคชเป็นโมฆะเมื่อจำเป็น ซึ่งอาจเกี่ยวข้องกับการอัปเดตชื่อไฟล์ด้วย content hashes หรือการใช้พารามิเตอร์คิวรีเพื่อล้างแคช (cache-busting)
6. การปรับแต่ง Resolve Options
ตัวเลือก `resolve` ของ Webpack ควบคุมวิธีการค้นหาโมดูล การปรับแต่งตัวเลือกเหล่านี้สามารถปรับปรุงประสิทธิภาพการ build ได้อย่างมาก
- `resolve.modules`: ระบุไดเรกทอรีที่ Webpack ควรค้นหาโมดูล เพิ่มไดเรกทอรี `node_modules` และไดเรกทอรีโมดูลที่กำหนดเอง
// webpack.config.js module.exports = { //... resolve: { modules: [path.resolve(__dirname, 'src'), 'node_modules'], }, };
- `resolve.extensions`: ระบุนามสกุลไฟล์ที่ Webpack ควรค้นหาโดยอัตโนมัติ นามสกุลที่พบบ่อยได้แก่ `.js`, `.jsx`, `.ts` และ `.tsx` การจัดลำดับนามสกุลเหล่านี้ตามความถี่ในการใช้งานสามารถเพิ่มความเร็วในการค้นหาได้
// webpack.config.js module.exports = { //... resolve: { extensions: ['.tsx', '.ts', '.js', '.jsx'], }, };
- `resolve.alias`: สร้างชื่อแฝง (aliases) สำหรับโมดูลหรือไดเรกทอรีที่ใช้บ่อย ซึ่งสามารถทำให้โค้ดของคุณง่ายขึ้นและปรับปรุงเวลาในการ build ได้
// webpack.config.js module.exports = { //... resolve: { alias: { '@components': path.resolve(__dirname, 'src/components/'), }, }, };
7. การลดการ Transpilation และ Polyfilling
การแปลง (transpiling) JavaScript สมัยใหม่เป็นเวอร์ชันเก่าและการรวม polyfills สำหรับเบราว์เซอร์รุ่นเก่าจะเพิ่มภาระให้กับกระบวนการ build และเพิ่มขนาด bundle ควรพิจารณาเบราว์เซอร์เป้าหมายของคุณอย่างรอบคอบและลดการแปลงโค้ดและการใช้ polyfill ให้มากที่สุด
- กำหนดเป้าหมายเบราว์เซอร์สมัยใหม่: หากกลุ่มเป้าหมายของคุณส่วนใหญ่ใช้เบราว์เซอร์สมัยใหม่ คุณสามารถกำหนดค่า Babel (หรือ transpiler ที่คุณเลือก) ให้แปลงเฉพาะโค้ดที่ไม่รองรับโดยเบราว์เซอร์เหล่านั้น
- ใช้ `browserslist` อย่างถูกต้อง: กำหนดค่า `browserslist` ของคุณให้ถูกต้องเพื่อกำหนดเบราว์เซอร์เป้าหมายของคุณ สิ่งนี้จะแจ้งให้ Babel และเครื่องมืออื่นๆ ทราบว่าฟีเจอร์ใดที่ต้องถูกแปลงหรือ polyfill
// package.json { //... "browserslist": [ ">0.2%", "not dead", "not op_mini all" ] }
- Dynamic Polyfilling: ใช้บริการเช่น Polyfill.io เพื่อโหลดเฉพาะ polyfills ที่จำเป็นสำหรับเบราว์เซอร์ของผู้ใช้แบบไดนามิก
- ESM builds ของไลบรารี: ไลบรารีสมัยใหม่หลายแห่งมีทั้ง CommonJS และ ES Module (ESM) builds ควรเลือกใช้ ESM builds เมื่อเป็นไปได้เพื่อให้สามารถทำ tree shaking ได้ดีขึ้น
8. การ Profiling และการวิเคราะห์ Builds ของคุณ
Webpack มีเครื่องมือหลายอย่างสำหรับการ profiling และการวิเคราะห์ builds ของคุณ เครื่องมือเหล่านี้สามารถช่วยให้คุณระบุคอขวดด้านประสิทธิภาพและพื้นที่ที่ต้องปรับปรุง
- Webpack Bundle Analyzer: แสดงภาพขนาดและองค์ประกอบของ Webpack bundles ของคุณ ซึ่งสามารถช่วยให้คุณระบุโมดูลขนาดใหญ่หรือโค้ดที่ซ้ำซ้อนได้
// webpack.config.js const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; module.exports = { //... plugins: [ new BundleAnalyzerPlugin(), ], };
- Webpack Profiling: ใช้ฟีเจอร์ profiling ของ Webpack เพื่อรวบรวมข้อมูลประสิทธิภาพโดยละเอียดระหว่างกระบวนการ build ข้อมูลนี้สามารถนำไปวิเคราะห์เพื่อระบุ loaders หรือ plugins ที่ทำงานช้าได้
จากนั้นใช้เครื่องมือเช่น Chrome DevTools เพื่อวิเคราะห์ข้อมูลโปรไฟล์// webpack.config.js module.exports = { //... plugins: [ new webpack.debug.ProfilingPlugin({ outputPath: 'webpack.profile.json' }) ], };
บทสรุป
การเพิ่มประสิทธิภาพ Webpack module graph เป็นสิ่งสำคัญสำหรับการสร้างเว็บแอปพลิเคชันที่มีประสิทธิภาพสูง ด้วยการทำความเข้าใจ module graph และการใช้เทคนิคที่กล่าวถึงในคู่มือนี้ คุณสามารถปรับปรุงเวลาในการ build ลดขนาด bundle และเพิ่มประสบการณ์ผู้ใช้โดยรวมได้อย่างมาก อย่าลืมพิจารณาบริบทระดับโลกของแอปพลิเคชันของคุณและปรับกลยุทธ์การเพิ่มประสิทธิภาพให้ตรงกับความต้องการของผู้ชมทั่วโลกของคุณ ควรทำการ profiling และวัดผลกระทบของแต่ละเทคนิคการเพิ่มประสิทธิภาพเสมอเพื่อให้แน่ใจว่าได้ผลลัพธ์ตามที่ต้องการ ขอให้สนุกกับการ bundling!