Giriş: Micro-Frontend Mimarisi Neden Kritik?
Micro-frontend mimarisi, monolitik frontend uygulamalarının ölçeklenebilirlik sorunlarını çözmek için 2016 yılında ortaya çıktı. Ancak, gerçek dünya uygulamalarında karşılaşılan zorluklar, teorik avantajların çok ötesinde mühendislik becerisi gerektiriyor. Bu makalede, 15 yıllık full-stack deneyimi ile edinilen prodüksiyon felaketlerinden dersler çıkararak, Webpack Module Federation tabanlı uçtan uca bir micro-frontend kurulumunu adım adım inceleyeceğiz.
Neden Micro-Frontend?
- Takım Ölçeklenebilirliği: Farklı ekiplerin bağımsız olarak çalışabilmesi
- Teknoloji Çeşitliliği: Farklı framework'ler (React, Vue, Svelte) aynı uygulamada çalışabilir
- Bağımsız Dağıtım: Her micro-frontend bağımsız olarak deploy edilebilir
- Hata İzolasyonu: Bir modülün çökmesi tüm uygulamayı etkilemez
Webpack Module Federation: Teknik Derinlik
Webpack 5 ile gelen Module Federation, micro-frontend mimarisinin en güçlü araçlarından biri. Ancak, doğru konfigürasyon yapılmadığında prodüksiyon felaketlerine davetiye çıkarabilir.
Temel Kavramlar
- Host Application: Ana uygulama, micro-frontend'leri barındırır
- Remote Application: Bağımsız olarak deploy edilen micro-frontend modülleri
- Shared Dependencies: Ortak kütüphaneler (React, Redux vb.)
- Exposes: Remote uygulamanın host'a sunduğu bileşenler
- Remotes: Host uygulamanın kullandığı remote modüller
Örnek Konfigürasyon: Host Uygulama
// webpack.config.js (Host Application)
const { ModuleFederationPlugin } = require('webpack').container;
module.exports = {
plugins: [
new ModuleFederationPlugin({
name: 'host',
remotes: {
dashboard: 'dashboard@http://localhost:3001/remoteEntry.js',
analytics: 'analytics@http://localhost:3002/remoteEntry.js'
},
shared: {
react: { singleton: true, requiredVersion: '^18.2.0' },
"react-dom": { singleton: true, requiredVersion: '^18.2.0' }
}
})
]
};
Remote Uygulama Konfigürasyonu
// webpack.config.js (Remote Application - Dashboard)
const { ModuleFederationPlugin } = require('webpack').container;
module.exports = {
plugins: [
new ModuleFederationPlugin({
name: 'dashboard',
filename: 'remoteEntry.js',
exposes: {
'./Dashboard': './src/components/Dashboard.tsx'
},
shared: {
react: { singleton: true, requiredVersion: '^18.2.0' },
"react-dom": { singleton: true, requiredVersion: '^18.2.0' }
}
})
]
};
Uygulama İçi İletişim Akışı: Event-Driven Mimarinin Önemi
Micro-frontend uygulamalarında uygulama içi iletişim, en kritik konulardan biri. Yanlış tasarlanan bir iletişim akışı, performans sorunlarına ve veri tutarsızlıklarına yol açabilir.
İletişim Stratejileri
| Strateji | Avantajları | Dezavantajları | Kullanım Senaryosu |
|---|---|---|---|
| Custom Events | Basit, framework bağımsız | Global namespace kirliliği | Basit uygulamalar |
| Redux/MobX | Merkezi state yönetimi | Yüksek coupling riski | Kompleks state yönetimi |
| RxJS (Observables) | Reaktif programlama | Öğrenme eğrisi | Gerçek zamanlı uygulamalar |
| Web Components | Framework bağımsız | Tarayıcı desteği | Legacy sistem entegrasyonu |
// eventBus.ts
import { Subject } from 'rxjs';
export const eventBus = {
events: new Subject<{ type: string; payload?: any }>(),
emit: (type: string, payload?: any) => {
eventBus.events.next({ type, payload });
},
subscribe: (type: string, callback: (payload?: any) => void) => {
return eventBus.events.subscribe(event => {
if (event.type === type) callback(event.payload);
});
}
};
Kullanım Örneği
// Host Application - Event Yayınlama
import { eventBus } from './eventBus';
eventBus.emit('userLoggedIn', { userId: '123', name: 'Ahmet' });
// Remote Application - Event Dinleme
eventBus.subscribe('userLoggedIn', (userData) => {
console.log('Kullanıcı giriş yaptı:', userData);
});
SVG Yapısı ve Optimizasyonu: Performansın Anahtarı
Micro-frontend uygulamalarında SVG optimizasyonu, genellikle göz ardı edilen ancak kritik öneme sahip bir konu. Yanlış optimize edilmiş SVG'ler, yükleme sürelerini %300'e kadar artırabilir.
SVG Optimizasyon Teknikleri
- **`
Yorumlar
Bir Yorum Bırakın
Henüz yorum yapılmamış. İlk yorumu siz yapın!