hepsiburadatech
Published in

hepsiburadatech

Hepsiburada Micro Frontends Dönüşümü

Nedir Bu Micro Frontends?

Micro Frontends Nedir?

Görsel: 1

Kimler Kullanıyor ?

Sorunlarımız ?

Görsel: 2- Micro Frontends geçişi öncesi de, Hepsiburada’da her ekip kendi sorumluluğundaki sayfalarda Frontend geliştirmesi yapıyordu.
  • Paylaşılabilir olması gereken arayüz componentlerini, şirket içerisinde birden fazla ekip kendi uygulamaları için geliştiriyor. Burada bir efor kaybı yaşanıyor. (Örneğin, Anasayfa ve Sepet sayfalarının geliştirme sorumlulukları iki farklı ekibin kontrolünde. Her ekip kendi uygulaması için Header geliştiriyor.)
  • Arayüze bir update geldikçe, bu shared componentler için, zaman içerisinde implementasyon farklılıkları oluşabiliyor. Snapshot ve Canlı UI testleri her ne kadar var olsa da, gerçek dünyada bunu takip etmek imkansıza yakın.
  • Legacy monolitik uygulamalara gömülü Frontend App’lerini, modern frameworkler(React, Angular, Vue) ile sıfırdan yazmak büyük bir maliyet. (Microfrontends sayesinde, vakit kaybetmeden parça parça yeniden yazabiliyoruz)

Neden ve Nasıl? 🎉

Görsel: 3
  • Daha küçük ve sürdürülebilir bir kod yapısı
  • Birbirinden bağımsız uygulamalar/ekipler sayesinde verimli bir geliştirme ortamı ve hızı
  • Daha ölçeklenebilir bir organizasyon yapısı
  • A/B Testing ve Build süreçlerinin hızlanması

Bağımlılık Yönetimi ☠️

Güzel soru.
  • Fragment servisleri build sonrası bir event tetikleyip, Layout servisi tarafında tekrar bir build alabilirsiniz. Bu senaryoda fragmentların kullandığı paketleri Layout’a bildirip, Layout uygulamanızda yeni bir Webpack Bundle’ı oluşturmanız gerekiyor.
  • Pre-Build aşamasında Dependecies kontrolü yaparak, ortak olan tüm kütüphaneleri oluşturacağınız vendor(node_modules klasöründeki tüm bağımlılıklar) dosyasından çıkartmak ve ortak dosyalarınızı ayrı bir servis üzerinden sunmak.
  • Cache ile yatıp cache ile kalkılmalı. Bakınız: https://developers.google.com/web/ilt/pwa/caching-files-with-service-worker
  • En büyük dezavantajlardan bir tanesi, X kütüphanesinin farklı versiyonlarını kullanıyorsanız, gereksiz JS dosyası yüklemiş olacaksınız. Aynı kütüphanenin farklı versiyonlarını kullanmayı ekiplere yasaklamayı düşünmek yerine bu iş otomatize edilmeli. Upgrade ve Downgrade süreçlerinde ortak kararlar alınmalı. Yoksa çok can sıkıcı bir duruma dönüşebilir.

Nasıl Çözdük?

Görsel: 5
Görsel: 6

Otonom Takımlar ve Bağımsız Deploymentlar

Görsel: 7
Görsel: 8

Fragment Nedir ?

Görsel: 9

Nasıl Çalışmalı?

  • Size sadece çağırdığınız kısmın kodlarını(JS,CSS) dönmeli.
  • Zorunlu bir kural veya direktif değil fakat Fragment kendi içerisinde başka bir Fragment kullanmamalı. (bence)
  • Dışarıdan parametre alabilmeli ve birden fazla yerde başka amaçlarla kullanılabilmeli.
  • UI componentleri birer fragment değildir.
  • SSR yaptığımızı varsayarsak, in-memory veya Redis gibi araç ile kolay bir şekilde cache’lenebilir olmalı. Defalarca renderToString çalıştırmaktan kaçınmalıyız.

Nasıl Bir Araya Geliyorlar?

Görsel: 10

Layout Services

1- Iframe

  • Iframe’ler farklı farklı anlarda render olabiliyor. Bu first rendering aşamasını stabil bir şekilde nasıl gösterebiliriz? Loading animasyon kullanımı gerekebilir. Iframe tekniği ile geliştirilmiş MicroFrontends kütüphanelerine bakacak olursanız böyle bir sorunla karşılaşmayacaksınız. Fakat gerçek hayatta daha büyük kaynakları download ettirdiğimiz için yükleme ekranları kötü bir deneyim sunabilir.
  • Iframe uygulamaları iletişim için, postMessage kullanılıyor. iframeEl.contentWindow ise sıklıkla başvurabileceğiniz bir method.

2-Server Side Application

  • Component’ları ve applicationları bağımsız olarak oluşturun ve fragment’a özel chunk(js,css) dosyaları oluşturmayı ihmal etmeyin. İlgili Route hangi fragment’ları çekiyorsa o dosyaları çağırın. Fakat farklı versiyonlarda dependencies kullanımları büyük bir maliyet yaratabilir. Bunu aşmak için, direkt Layout projenizde yeniden build yapmanız veya bunun için bir mikroservis geliştirmeniz bir tercih olabilir. Deployment ve test süreçleriniz oldukça uzayacaktır.
  • Server tarafında ortak bir Router kullanımı işlerinizi oldukça kolaylaştırıyor.
  • Fragment’lar arası iletişim için, uygulamalarda sıklıkla kullanılan EventBus mekanizmasından faydalanabilirsiniz.

3-OpenComponents

  • Benim en çok hoşuma giden geliştirdikleri CLI oldu. Component oluşturma, test etme ve npm paketi publish etmeyi sağlayan araçlar var.

Hepsiburada’da Neler Yaptık?

Görsel: 11
Görsel: 12

Layout Engine tarafında neler yaptık?

Mevcut Projelere Uyum

Görsel: 13

Componentler Arası İletişim

Görsel: 14 — ProductList uygulaması addToCart isimli bir event ile sepet totalinin 15 olacağını bildiriyor.
Gösel: 15 — Sepet uygulaması ise bu event’e gelen istekleri dinliyor ve kendini state yapısını güncelleyerek görünen değeri güncelliyor.

Artılar — Dezavantajlar ve İpuçları

  • Prefix: Geliştirme esnasında browser tarafından paylaşılan kaynaklarda prefix kullanmazsanız, büyük bir karmaşıklığın içine düşmeniz kaçınılmaz olacaktır. Global Eventler, Local Storage&Cookie gibi kaynakları kullanırken hangi ekibin o kaynağı oraya yüklediğini veya kullandığını bulabilmek için isimlendirme yaparken, Prefix kullanmak hayat kurtarıyor.
  • İzole Takımlar: Ekipler aynı framework ve kütüphaneyi kullanıyor olsalar bile, ortak bir dosya, kütüphane paylaşmayın. Tüm ekipler kendi uygulamasından sorumlu olmalı. Ekipler arasında kullanılması gereken component’lar, local bir npm serverından versiyonlanarak dışarıya açılabilir.
  • Bundles&Chunking: Aynı kaynakları tekrar tekrar kullanıcıya yüklemekten kaçınmanız gerekiyor. Bunun için Fragment’larınızın fragment based çıktı vermesi önemli. Biraz daha küçük bir çıktıya sahip olmak için, daha sonra bu kaynakları Layout Engine tarafında birleştirebilirsiniz. Fakat bu herhangi bir ekibin deployment çıktığında, tekrardan başka bir uygulamanın da deployment çıkması anlamına geliyor.
  • Aynı kütüphanenin farklı versiyonları mecburen yükletmek kaynaklarımızın boyutunu yükseltecek. İlk yükleme ve Performans kayıpları yaşanabilir. Bunu kısıtlamak sizin elinizde.
  • Delegasyon Kısıtı: X ekibinde çalışan geliştiriciyi, Y ekibine taşımak biraz zorlaşabilir. Zaman içerisinde ekiplerin geliştirdiği micro frontends projeleri, codebase olarak büyük farklılıklar gösterebilir. Ekipler arasındaki değişim yeni bir onboarding süreci anlamına gelebilir. Bunu yönetebilmek önemli.

Geri Bildirim 📭

Kaynaklar:

Teşekkürler ❤

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store