1. Micro-Frontend คืออะไร?
Micro-Frontend เป็นแนวคิดที่ใช้แนวทางของ Microservices ในการพัฒนา Frontend โดยแยกแอปพลิเคชันขนาดใหญ่ออกเป็นส่วนย่อยที่ทำงานได้อิสระ แต่ละส่วนสามารถพัฒนาและปรับใช้ได้โดยทีมที่แยกกัน โดยไม่ต้องพึ่งพาส่วนอื่น
ข้อดีของ Micro-Frontend:
- ความยืดหยุ่น: แต่ละทีมสามารถเลือกเทคโนโลยีที่เหมาะสมกับส่วนของตัวเอง
- พัฒนาได้เร็วขึ้น: แต่ละส่วนสามารถพัฒนาและปรับใช้ได้โดยไม่ต้องรอส่วนอื่น
- บำรุงรักษาง่าย: การเปลี่ยนแปลงในส่วนหนึ่งไม่ส่งผลกระทบต่อส่วนอื่น
2. แนวทางการออกแบบ Micro-Frontend
2.1 การแยกส่วนด้วย Page-Level
การแยกแอปพลิเคชันตามหน้าหรือฟีเจอร์ เช่น หน้า Dashboard, หน้า Settings
2.2 การแยกส่วนด้วย Component-Level
การแยกเป็น Component ย่อย เช่น Header, Footer, หรือ Widget ต่าง ๆ
3. การรวม Micro-Frontend
3.1 การใช้ Webpack Module Federation
Webpack Module Federation ช่วยให้แต่ละส่วนของ Micro-Frontend สามารถแชร์โมดูลหรือ Component ระหว่างกันได้
การตั้งค่าใน webpack.config.js
:
สำหรับ Remote Application:
const { ModuleFederationPlugin } = require('webpack').container;
module.exports = {
plugins: [
new ModuleFederationPlugin({
name: 'remoteApp',
filename: 'remoteEntry.js',
exposes: {
'./Header': './src/components/Header.vue'
},
shared: ['vue']
})
]
};
สำหรับ Host Application:
const { ModuleFederationPlugin } = require('webpack').container;
module.exports = {
plugins: [
new ModuleFederationPlugin({
name: 'hostApp',
remotes: {
remoteApp: 'remoteApp@http://localhost:3001/remoteEntry.js'
},
shared: ['vue']
})
]
};
การใช้งานใน Host Application:
import Header from 'remoteApp/Header';
3.2 การใช้ iframe สำหรับการรวม
iframe เป็นวิธีที่ง่ายที่สุดในการรวม Micro-Frontend แต่มีข้อจำกัดในด้านการสื่อสารระหว่างส่วนต่าง ๆ
ตัวอย่างการใช้งาน iframe:
<iframe src="http://dashboard.example.com" width="100%" height="600px"></iframe>
4. การสื่อสารระหว่าง Micro-Frontend
4.1 การใช้ Event Bus
Event Bus เป็นวิธีที่ใช้สำหรับส่งข้อมูลระหว่าง Micro-Frontend
ตัวอย่างการสร้าง Event Bus:
import { createApp } from 'vue';
import mitt from 'mitt';
const emitter = mitt();
const app = createApp(App);
app.provide('emitter', emitter);
app.mount('#app');
การใช้งาน Event Bus:
ใน Sender Component:
const emitter = inject('emitter');
emitter.emit('eventName', payload);
ใน Receiver Component:
const emitter = inject('emitter');
emitter.on('eventName', (payload) => {
console.log(payload);
});
4.2 การใช้ Shared State
สามารถใช้ Shared State เช่น Vuex หรือ Pinia ระหว่าง Micro-Frontend โดยตั้งค่า Store ที่ใช้ร่วมกัน
5. การ Deploy Micro-Frontend
5.1 การ Deploy แยกส่วน
แต่ละ Micro-Frontend ควรมี Pipeline การ Deploy ของตัวเอง เช่น การใช้ CI/CD
5.2 การตั้งค่า Reverse Proxy
Reverse Proxy เช่น Nginx สามารถช่วยรวมส่วนต่าง ๆ เข้าด้วยกัน
ตัวอย่างการตั้งค่า Nginx:
server {
location /dashboard {
proxy_pass http://localhost:3001;
}
location /settings {
proxy_pass http://localhost:3002;
}
}
6. ข้อควรระวังในการใช้ Micro-Frontend
- Overhead สูง: การแยกเป็นหลายส่วนอาจเพิ่มความซับซ้อนในการจัดการโครงสร้าง
- Performance: การโหลดหลายส่วนพร้อมกันอาจเพิ่มเวลาโหลด
- Consistency: ควรกำหนดมาตรฐานร่วมกัน เช่น การใช้ Design System เดียวกัน
7. สรุป
ในบทนี้ คุณได้เรียนรู้เกี่ยวกับการพัฒนาแอปพลิเคชัน Vue.js ในลักษณะของ Micro-Frontend รวมถึงวิธีการออกแบบ การรวม และการสื่อสารระหว่างส่วนต่าง ๆ แนวทางนี้ช่วยให้แอปพลิเคชันขนาดใหญ่มีความยืดหยุ่นและสามารถพัฒนาได้รวดเร็ว
ในบทถัดไป เราจะพูดถึงการพัฒนาแอปพลิเคชัน Vue.js ในระดับองค์กรพร้อมการจัดการ DevOps!