Micro Frontend mimarilerinde Modül Federasyonu'nun gücünü keşfedin. Modern web uygulamaları için ölçeklenebilir, sürdürülebilir ve bağımsız frontend'ler oluşturmayı öğrenin.
Micro Frontend'ler: Kapsamlı Bir Modül Federasyonu Rehberi
Sürekli gelişen web geliştirme dünyasında, büyük ve karmaşık frontend uygulamaları oluşturmak ve sürdürmek önemli bir zorluk haline gelebilir. Tüm uygulamanın tek ve sıkıca bağlı bir kod tabanı olduğu monolitik frontend'ler, genellikle daha yavaş geliştirme döngülerine, artan dağıtım risklerine ve bireysel özelliklerin ölçeklendirilmesinde zorluklara yol açar.
Micro Frontend'ler, frontend'i daha küçük, bağımsız ve yönetilebilir birimlere ayırarak bir çözüm sunar. Bu mimari yaklaşım, ekiplerin otonom olarak çalışmasını, bağımsız olarak dağıtım yapmasını ve kendi özel ihtiyaçlarına en uygun teknolojileri seçmesini sağlar. Micro Frontend'leri uygulamak için en umut verici teknolojilerden biri Modül Federasyonu'dur.
Micro Frontend'ler Nedir?
Micro Frontend'ler, bir frontend uygulamasının birden çok küçük, bağımsız frontend uygulamasından oluştuğu bir mimari tarzdır. Bu uygulamalar farklı ekipler tarafından, farklı teknolojiler kullanılarak ve derleme zamanında koordinasyon gerektirmeden geliştirilebilir, dağıtılabilir ve sürdürülebilir. Her Micro Frontend, genel uygulamanın belirli bir özelliğinden veya alanından sorumludur.
Micro Frontend'lerin Temel İlkeleri:
- Teknoloji Bağımsızlığı: Ekipler, kendi özel Micro Frontend'leri için en iyi teknoloji yığınını seçebilirler.
- Yalıtılmış Ekip Kod Tabanları: Her Micro Frontend'in kendi bağımsız kod tabanı vardır, bu da bağımsız geliştirme ve dağıtımlara olanak tanır.
- Bağımsız Dağıtım: Bir Micro Frontend'deki değişiklikler, tüm uygulamanın yeniden dağıtılmasını gerektirmez.
- Otonom Ekipler: Ekipler kendi Micro Frontend'lerinden sorumludur ve bağımsız olarak çalışabilirler.
- Aşamalı Yükseltme: Bireysel Micro Frontend'ler, uygulamanın geri kalanını etkilemeden yükseltilebilir veya değiştirilebilir.
Modül Federasyonu'na Giriş
Modül Federasyonu, Webpack 5 ile sunulan ve bir JavaScript uygulamasının çalışma zamanında başka bir uygulamadan dinamik olarak kod yüklemesine olanak tanıyan bir JavaScript mimarisidir. Bu, farklı uygulamaların, farklı teknolojilerle oluşturulmuş veya farklı sunucularda dağıtılmış olsalar bile, birbirlerinden modülleri paylaşabileceği ve tüketebileceği anlamına gelir.
Modül Federasyonu, farklı frontend uygulamalarının birbirlerinden modülleri dışa aktarmasını ve tüketmesini sağlayarak Micro Frontend'leri uygulamak için güçlü bir mekanizma sunar. Bu, farklı Micro Frontend'lerin tek ve tutarlı bir kullanıcı deneyimine sorunsuz bir şekilde entegre edilmesini sağlar.
Modül Federasyonu'nun Temel Faydaları:
- Kod Paylaşımı: Micro Frontend'ler kod ve bileşenleri paylaşabilir, bu da tekrarı azaltır ve tutarlılığı artırır.
- Çalışma Zamanı Entegrasyonu: Micro Frontend'ler çalışma zamanında entegre edilebilir, bu da dinamik kompozisyon ve güncellemelere olanak tanır.
- Bağımsız Dağıtımlar: Micro Frontend'ler, diğer uygulamaların koordinasyonunu veya yeniden dağıtımını gerektirmeden bağımsız olarak dağıtılabilir.
- Teknoloji Bağımsızlığı: Micro Frontend'ler farklı teknolojilerle oluşturulabilir ve yine de Modül Federasyonu kullanılarak entegre edilebilir.
- Azaltılmış Derleme Süreleri: Kod ve bağımlılıkları paylaşarak, Modül Federasyonu derleme sürelerini azaltabilir ve geliştirme verimliliğini artırabilir.
Modül Federasyonu Nasıl Çalışır?
Modül Federasyonu, host (ana makine) ve remote (uzak) olmak üzere iki tür uygulama tanımlayarak çalışır. Host uygulama, diğer uygulamalardan modül tüketen ana uygulamadır. Remote uygulama ise diğer uygulamalar tarafından tüketilmek üzere modülleri dışa aktaran bir uygulamadır.
Bir host uygulaması, bir remote uygulama tarafından dışa aktarılan bir modül için bir import ifadesiyle karşılaştığında, Webpack dinamik olarak remote uygulamayı yükler ve import işlemini çalışma zamanında çözer. Bu, host uygulamanın remote uygulamadaki modülü sanki kendi kod tabanının bir parçasıymış gibi kullanmasına olanak tanır.
Modül Federasyonu'ndaki Temel Kavramlar:
- Host (Ana Makine): Uzak uygulamalardan modül tüketen uygulama.
- Remote (Uzak): Diğer uygulamalar tarafından tüketilmek üzere modül dışa aktaran uygulama.
- Exposed Modules (Dışa Aktarılan Modüller): Bir remote uygulamanın diğer uygulamalar tarafından tüketilmek üzere sunduğu modüller.
- Shared Modules (Paylaşılan Modüller): Host ve remote uygulamalar arasında paylaşılan, tekrarı azaltan ve performansı artıran modüller.
Modül Federasyonu ile Micro Frontend Uygulaması: Pratik Bir Örnek
Basit bir e-ticaret uygulaması düşünelim: ürün kataloğu, alışveriş sepeti ve kullanıcı profili olmak üzere üç Micro Frontend'den oluşsun.
Her Micro Frontend ayrı bir ekip tarafından geliştirilir ve bağımsız olarak dağıtılır. Ürün kataloğu React ile, alışveriş sepeti Vue.js ile ve kullanıcı profili Angular ile oluşturulmuştur. Ana uygulama, host olarak hareket eder ve bu üç Micro Frontend'i tek bir kullanıcı arayüzünde birleştirir.
Adım 1: Remote Uygulamaları Yapılandırma
Öncelikle, her Micro Frontend'i bir remote uygulama olarak yapılandırmamız gerekiyor. Bu, dışa aktarılacak modülleri ve kullanılacak paylaşılan modülleri tanımlamayı içerir.
Ürün Kataloğu (React)
webpack.config.js:
const { ModuleFederationPlugin } = require('webpack').container;
module.exports = {
// ...
plugins: [
new ModuleFederationPlugin({
name: 'productCatalog',
filename: 'remoteEntry.js',
exposes: {
'./ProductList': './src/components/ProductList',
},
shared: ['react', 'react-dom'],
}),
],
};
Bu yapılandırmada, ProductList
bileşenini ./src/components/ProductList
dosyasından dışa aktarıyoruz. Ayrıca react
ve react-dom
modüllerini host uygulama ile paylaşıyoruz.
Alışveriş Sepeti (Vue.js)
webpack.config.js:
const { ModuleFederationPlugin } = require('webpack').container;
module.exports = {
// ...
plugins: [
new ModuleFederationPlugin({
name: 'shoppingCart',
filename: 'remoteEntry.js',
exposes: {
'./ShoppingCart': './src/components/ShoppingCart',
},
shared: ['vue'],
}),
],
};
Burada, ShoppingCart
bileşenini dışa aktarıyor ve vue
modülünü paylaşıyoruz.
Kullanıcı Profili (Angular)
webpack.config.js:
const { ModuleFederationPlugin } = require('webpack').container;
module.exports = {
// ...
plugins: [
new ModuleFederationPlugin({
name: 'userProfile',
filename: 'remoteEntry.js',
exposes: {
'./UserProfile': './src/components/UserProfile',
},
shared: ['@angular/core', '@angular/common', '@angular/router'],
}),
],
};
UserProfile
bileşenini dışa aktarıyor ve gerekli Angular modüllerini paylaşıyoruz.
Adım 2: Host Uygulamayı Yapılandırma
Ardından, host uygulamayı, remote uygulamalar tarafından dışa aktarılan modülleri tüketmek üzere yapılandırmamız gerekiyor. Bu, remote'ları tanımlamayı ve bunları ilgili URL'lerine eşlemeyi içerir.
webpack.config.js:
const { ModuleFederationPlugin } = require('webpack').container;
module.exports = {
// ...
plugins: [
new ModuleFederationPlugin({
name: 'mainApp',
remotes: {
productCatalog: 'productCatalog@http://localhost:3001/remoteEntry.js',
shoppingCart: 'shoppingCart@http://localhost:3002/remoteEntry.js',
userProfile: 'userProfile@http://localhost:3003/remoteEntry.js',
},
shared: ['react', 'react-dom', 'vue', '@angular/core', '@angular/common', '@angular/router'],
}),
],
};
Bu yapılandırmada, productCatalog
, shoppingCart
ve userProfile
olmak üzere üç remote tanımlıyoruz. Her remote, kendi remoteEntry.js
dosyasının URL'sine eşlenmiştir. Ayrıca tüm Micro Frontend'ler arasında ortak bağımlılıkları paylaşıyoruz.
Adım 3: Modülleri Host Uygulamada Tüketme
Son olarak, remote uygulamalar tarafından dışa aktarılan modülleri host uygulamada tüketebiliriz. Bu, modülleri dinamik import'lar kullanarak içe aktarmayı ve bunları uygun yerlerde render etmeyi içerir.
import React, { Suspense } from 'react';
const ProductList = React.lazy(() => import('productCatalog/ProductList'));
const ShoppingCart = React.lazy(() => import('shoppingCart/ShoppingCart'));
const UserProfile = React.lazy(() => import('userProfile/UserProfile'));
function App() {
return (
<div>
<h1>E-ticaret Uygulaması</h1>
<Suspense fallback={<div>Ürün Kataloğu Yükleniyor...</div>}>
<ProductList />
</Suspense>
<Suspense fallback={<div>Alışveriş Sepeti Yükleniyor...</div>}>
<ShoppingCart />
<\Suspense>
<Suspense fallback={<div>Kullanıcı Profili Yükleniyor...</div>}>
<UserProfile />
</Suspense>
</div>
);
}
export default App;
Remote uygulamalardan modülleri dinamik olarak yüklemek için React.lazy
ve Suspense
kullanıyoruz. Bu, modüllerin yalnızca ihtiyaç duyulduğunda yüklenmesini sağlayarak uygulamanın performansını artırır.
İleri Düzey Hususlar ve En İyi Uygulamalar
Modül Federasyonu, Micro Frontend'leri uygulamak için güçlü bir mekanizma sunsa da, akılda tutulması gereken birkaç ileri düzey husus ve en iyi uygulama vardır.
Sürüm Yönetimi ve Uyumluluk
Micro Frontend'ler arasında modül paylaşırken, sürümleri yönetmek ve uyumluluğu sağlamak çok önemlidir. Farklı Micro Frontend'ler farklı bağımlılıklara sahip olabilir veya paylaşılan modüllerin farklı sürümlerini gerektirebilir. Semantik sürümleme kullanmak ve paylaşılan bağımlılıkları dikkatli bir şekilde yönetmek, çakışmaları önlemeye ve Micro Frontend'lerin sorunsuz bir şekilde birlikte çalışmasını sağlamaya yardımcı olabilir.
Paylaşılan bağımlılıkları yönetme sürecini otomatikleştirmeye yardımcı olmak için `@module-federation/automatic-vendor-federation` gibi araçları göz önünde bulundurun.
Durum (State) Yönetimi
Micro Frontend'ler arasında durum paylaşımı zorlayıcı olabilir. Farklı Micro Frontend'ler farklı durum yönetimi çözümlerine sahip olabilir veya paylaşılan duruma farklı erişim gerektirebilir. Bir Micro Frontend mimarisinde durumu yönetmek için birkaç yaklaşım vardır, bunlar arasında:
- Paylaşılan Durum Kütüphaneleri: Küresel durumu yönetmek için Redux veya Zustand gibi paylaşılan bir durum kütüphanesi kullanmak.
- Özel Olaylar (Custom Events): Micro Frontend'ler arasında durum değişikliklerini iletmek için özel olaylar kullanmak.
- URL Tabanlı Durum: Durumu URL'de kodlamak ve Micro Frontend'ler arasında paylaşmak.
En iyi yaklaşım, uygulamanın özel ihtiyaçlarına ve Micro Frontend'ler arasındaki bağlanma düzeyine bağlıdır.
Micro Frontend'ler Arası İletişim
Micro Frontend'lerin genellikle veri alışverişi yapmak veya eylemleri tetiklemek için birbirleriyle iletişim kurması gerekir. Bunu başarmanın birkaç yolu vardır, bunlar arasında:
- Özel Olaylar (Custom Events): Micro Frontend'ler arasında mesaj yayınlamak için özel olaylar kullanmak.
- Paylaşılan Servisler: Tüm Micro Frontend'ler tarafından erişilebilen paylaşılan servisler oluşturmak.
- Mesaj Kuyrukları: Micro Frontend'ler arasında eşzamansız iletişim kurmak için bir mesaj kuyruğu kullanmak.
Doğru iletişim mekanizmasını seçmek, etkileşimlerin karmaşıklığına ve Micro Frontend'ler arasında istenen ayrılma düzeyine bağlıdır.
Güvenlik Hususları
Micro Frontend'leri uygularken, güvenlik sonuçlarını göz önünde bulundurmak önemlidir. Her Micro Frontend, kimlik doğrulama, yetkilendirme ve veri doğrulama dahil olmak üzere kendi güvenliğinden sorumlu olmalıdır. Micro Frontend'ler arasında kod ve veri paylaşımı güvenli bir şekilde ve uygun erişim kontrolleriyle yapılmalıdır.
Siteler arası komut dosyası çalıştırma (XSS) güvenlik açıklarını önlemek için uygun girdi doğrulama ve temizleme işlemlerini sağlayın. Güvenlik açıklarını düzeltmek için bağımlılıkları düzenli olarak güncelleyin.
Test ve İzleme
Micro Frontend'leri test etmek ve izlemek, monolitik uygulamaları test etmek ve izlemekten daha karmaşık olabilir. Her Micro Frontend bağımsız olarak test edilmeli ve Micro Frontend'lerin doğru şekilde birlikte çalıştığından emin olmak için entegrasyon testleri yapılmalıdır. Her Micro Frontend'in performansını ve sağlığını izlemek için izleme uygulanmalıdır.
Sorunsuz bir kullanıcı deneyimi sağlamak için birden çok Micro Frontend'i kapsayan uçtan uca testler uygulayın. Darboğazları ve iyileştirme alanlarını belirlemek için uygulama performans metriklerini izleyin.
Modül Federasyonu ve Diğer Micro Frontend Yaklaşımları
Modül Federasyonu, Micro Frontend'ler oluşturmak için güçlü bir araç olsa da, mevcut tek yaklaşım bu değildir. Diğer yaygın Micro Frontend yaklaşımları şunları içerir:
- Derleme Zamanı Entegrasyonu: Webpack veya Parcel gibi araçları kullanarak Micro Frontend'leri derleme zamanında entegre etmek.
- iframe'ler ile Çalışma Zamanı Entegrasyonu: Micro Frontend'leri iframe'lere yerleştirmek.
- Web Bileşenleri (Web Components): Micro Frontend'ler arasında paylaşılabilecek yeniden kullanılabilir kullanıcı arayüzü öğeleri oluşturmak için web bileşenleri kullanmak.
- Single-SPA: Micro Frontend'lerin yönlendirmesini ve düzenlenmesini yönetmek için Single-SPA gibi bir çerçeve kullanmak.
Her yaklaşımın kendi avantajları ve dezavantajları vardır ve en iyi yaklaşım, uygulamanın özel ihtiyaçlarına bağlıdır.
Modül Federasyonu vs. iframe'ler
iframe'ler güçlü bir yalıtım sağlar ancak yönetimi zahmetli olabilir ve her bir iframe'in ek yükü nedeniyle performansı olumsuz etkileyebilir. iframe'ler arasındaki iletişim de karmaşık olabilir.
Modül Federasyonu, daha iyi performans ve Micro Frontend'ler arasında daha kolay iletişim ile daha sorunsuz bir entegrasyon deneyimi sunar. Ancak, paylaşılan bağımlılıkların ve sürümlerin dikkatli bir şekilde yönetilmesini gerektirir.
Modül Federasyonu vs. Single-SPA
Single-SPA, Micro Frontend'leri yönetmek ve düzenlemek için birleşik bir yaklaşım sunan bir meta-çerçevedir. Paylaşılan bağlam, yönlendirme ve durum yönetimi gibi özellikler sunar.
Modül Federasyonu, karmaşık Micro Frontend uygulamaları oluşturmak için esnek ve ölçeklenebilir bir mimari sağlamak üzere Single-SPA ile birlikte kullanılabilir.
Modül Federasyonu için Kullanım Alanları
Modül Federasyonu, aşağıdakiler de dahil olmak üzere çeşitli kullanım durumları için çok uygundur:
- Büyük Kurumsal Uygulamalar: Birden çok ekiple büyük, karmaşık kurumsal uygulamalar oluşturmak ve sürdürmek.
- E-ticaret Platformları: Ürün katalogları, alışveriş sepetleri ve ödeme süreçleri gibi bağımsız özelliklere sahip modüler ve ölçeklenebilir e-ticaret platformları oluşturmak.
- İçerik Yönetim Sistemleri (CMS): Özelleştirilebilir içerik modüllerine sahip esnek ve genişletilebilir CMS platformları geliştirmek.
- Gösterge Tabloları ve Analitik Platformları: Bağımsız widget'lar ve görselleştirmeler ile etkileşimli gösterge tabloları ve analitik platformları oluşturmak.
Örneğin, Amazon gibi küresel bir e-ticaret şirketini düşünün. Web sitelerini, ürün sayfaları, alışveriş sepeti, ödeme süreci ve kullanıcı hesabı yönetimi bölümü gibi daha küçük, bağımsız Micro Frontend'lere ayırmak için Modül Federasyonu'nu kullanabilirlerdi. Bu Micro Frontend'lerin her biri ayrı ekipler tarafından geliştirilip dağıtılabilir, bu da daha hızlı geliştirme döngülerine ve artan çevikliğe olanak tanır. Her Micro Frontend için farklı teknolojiler kullanabilirlerdi; örneğin ürün sayfaları için React, alışveriş sepeti için Vue.js ve ödeme süreci için Angular. Bu, her teknolojinin güçlü yanlarından yararlanmalarını ve iş için en iyi aracı seçmelerini sağlar.
Başka bir örnek ise çok uluslu bir bankadır. Her bölgenin özel ihtiyaçlarına göre uyarlanmış bir bankacılık platformu oluşturmak için Modül Federasyonu'nu kullanabilirlerdi. Her bölge için, o bölgenin bankacılık düzenlemelerine ve müşteri tercihlerine özgü özelliklere sahip farklı Micro Frontend'lere sahip olabilirlerdi. Bu, müşterilerine daha kişiselleştirilmiş ve ilgili bir deneyim sunmalarını sağlar.
Sonuç
Modül Federasyonu, Micro Frontend'ler oluşturmak için güçlü ve esnek bir yaklaşım sunar. Ekiplerin bağımsız çalışmasını, bağımsız dağıtım yapmasını ve ihtiyaçlarına en uygun teknolojileri seçmesini sağlar. Kod ve bağımlılıkları paylaşarak, Modül Federasyonu derleme sürelerini azaltabilir, performansı artırabilir ve geliştirme sürecini basitleştirebilir.
Modül Federasyonu'nun sürüm yönetimi ve durum yönetimi gibi zorlukları olsa da, bunlar dikkatli planlama ve uygun araç ve tekniklerin kullanımıyla ele alınabilir. En iyi uygulamaları takip ederek ve bu kılavuzda tartışılan ileri düzey hususları göz önünde bulundurarak, Modül Federasyonu ile Micro Frontend'leri başarıyla uygulayabilir ve ölçeklenebilir, sürdürülebilir ve bağımsız frontend uygulamaları oluşturabilirsiniz.
Web geliştirme dünyası gelişmeye devam ettikçe, Micro Frontend'ler giderek daha önemli bir mimari model haline gelmektedir. Modül Federasyonu, Micro Frontend'ler oluşturmak için sağlam bir temel sağlar ve modern, ölçeklenebilir web uygulamaları oluşturmak isteyen her frontend geliştiricisi için değerli bir araçtır.