{"id":34229,"date":"2025-11-13T08:31:15","date_gmt":"2025-11-13T05:31:15","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/remote-app\/"},"modified":"2025-11-13T08:31:15","modified_gmt":"2025-11-13T05:31:15","slug":"remote-app","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/remote-app\/","title":{"rendered":"Remote App"},"content":{"rendered":"<p><body><br \/>\n<span>Webpack Module Federation ile Mikrofrontend Mimarileri<\/span><\/p>\n<p>Modern web uygulamalar\u0131, kullan\u0131c\u0131 beklentilerinin artmas\u0131yla birlikte giderek daha karma\u015f\u0131k hale geliyor. Peki, bu b\u00fcy\u00fckl\u00fckteki projeleri y\u00f6netmek, geli\u015ftirmek ve \u00f6l\u00e7eklendirmek neden bir kabusa d\u00f6n\u00fc\u015febiliyor? Genellikle, bunun temel nedeni, tek bir b\u00fcy\u00fck, i\u00e7 i\u00e7e ge\u00e7mi\u015f kod taban\u0131na sahip olan monolitik mimarilerdir. Bu yap\u0131, ba\u015flang\u0131\u00e7ta h\u0131zl\u0131 geli\u015fim vaat etse de, zamanla yeni \u00f6zellikler eklemeyi, farkl\u0131 teknolojileri denemeyi veya ba\u011f\u0131ms\u0131z ekiplerin ayn\u0131 kod \u00fczerinde \u00e7al\u0131\u015fmas\u0131n\u0131 zorla\u015ft\u0131r\u0131r. De\u011fi\u015fiklikler genellikle domino etkisi yarat\u0131r, k\u00fc\u00e7\u00fck bir hata t\u00fcm uygulaman\u0131n \u00e7\u00f6kmesine neden olabilir ve her yeni da\u011f\u0131t\u0131m, t\u00fcm uygulaman\u0131n yeniden build edilmesini ve deploy edilmesini gerektirir. Bu durum, geli\u015ftirme s\u00fcre\u00e7lerini yava\u015flat\u0131r, ekiplerin otonomisini k\u0131s\u0131tlar ve inovasyonun \u00f6n\u00fcnde ciddi bir engel te\u015fkil eder.<\/p>\n<p>\u0130\u015fte tam da bu noktada, yaz\u0131l\u0131m mimarisinde &#8220;b\u00f6l, par\u00e7ala, y\u00f6net&#8221; ilkesini benimseyen mikrofrontendler sahneye \u00e7\u0131kar. Mikrofrontend mimarisi, b\u00fcy\u00fck ve karma\u015f\u0131k bir frontend uygulamas\u0131n\u0131, ba\u011f\u0131ms\u0131z olarak geli\u015ftirilebilen, test edilebilen ve da\u011f\u0131t\u0131labilen daha k\u00fc\u00e7\u00fck, \u00f6zerk par\u00e7alara ay\u0131rma yakla\u015f\u0131m\u0131n\u0131 ifade eder. T\u0131pk\u0131 mikroservislerin backend d\u00fcnyas\u0131nda getirdi\u011fi devrim gibi, mikrofrontendler de frontend d\u00fcnyas\u0131nda benzer bir d\u00f6n\u00fc\u015f\u00fcm\u00fc hedefler. Bu sayede, farkl\u0131 ekipler, kendi alanlar\u0131na odaklanarak, diledikleri teknolojileri kullanarak ve birbirlerinden ba\u011f\u0131ms\u0131z olarak \u00e7al\u0131\u015fabilirler. Ancak bu par\u00e7alar\u0131 bir araya getirmek, yani farkl\u0131 kaynaklardan gelen kodlar\u0131 tek bir kullan\u0131c\u0131 aray\u00fcz\u00fcnde sorunsuz bir \u015fekilde birle\u015ftirmek teknik bir zorluktur. Geleneksel y\u00f6ntemler genellikle iframe&#8217;ler, Web Bile\u015fenleri veya istemci taraf\u0131 JavaScript \u00e7\u00f6z\u00fcmleri gibi karma\u015f\u0131k entegrasyon stratejileri gerektirirken, Webpack 5 ile gelen Module Federation \u00f6zelli\u011fi, bu zorlu\u011fa yepyeni ve \u00e7ok daha verimli bir \u00e7\u00f6z\u00fcm sunar. Module Federation, da\u011f\u0131t\u0131k uygulamalar\u0131n \u00e7al\u0131\u015fma zaman\u0131nda birbirleriyle mod\u00fcl payla\u015f\u0131m\u0131n\u0131 m\u00fcmk\u00fcn k\u0131larak, mikrofrontend mimarilerinin hayata ge\u00e7irilmesini olduk\u00e7a kolayla\u015ft\u0131r\u0131r. Bu makale, Module Federation&#8217;\u0131n temel prensiplerinden ba\u015flayarak, pratik uygulamalar\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131na ve ileri d\u00fczey optimizasyon tekniklerine kadar kapsaml\u0131 bir rehber sunacakt\u0131r. B\u00f6ylece, monolitik yap\u0131lardan kurtulup daha esnek, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir frontend mimarileri in\u015fa etmek isteyen herkes i\u00e7in de\u011ferli bilgiler i\u00e7erecektir.<\/p>\n<h2>Mikrofrontendler Nedir ve Neden \u00d6nemli? Temel Kavramlara Derin Bir Bak\u0131\u015f<\/h2>\n<p>Mikrofrontendler, bir web uygulamas\u0131n\u0131n kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc, ba\u011f\u0131ms\u0131z olarak geli\u015ftirilebilen ve da\u011f\u0131t\u0131labilen k\u00fc\u00e7\u00fck, \u00f6zerk mod\u00fcllere b\u00f6lme yakla\u015f\u0131m\u0131d\u0131r. Bu kavram, backend d\u00fcnyas\u0131ndaki mikroservis mimarisinden ilham alm\u0131\u015ft\u0131r ve b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar\u0131n y\u00f6netimini kolayla\u015ft\u0131rmay\u0131 ama\u00e7lar. Geleneksel monolitik frontend uygulamalar\u0131nda, t\u00fcm kod tek bir projede yer al\u0131r ve herhangi bir k\u00fc\u00e7\u00fck de\u011fi\u015fiklik bile t\u00fcm uygulaman\u0131n yeniden derlenip da\u011f\u0131t\u0131lmas\u0131n\u0131 gerektirir. Bu durum, \u00f6zellikle b\u00fcy\u00fck ekiplerde ve s\u0131k g\u00fcncellemelerin oldu\u011fu projelerde ciddi darbo\u011fazlara yol a\u00e7ar. Mikrofrontendler ise bu sorunu ortadan kald\u0131r\u0131r. Her bir mikrofrontend (\u00f6rne\u011fin, bir e-ticaret sitesindeki \u00fcr\u00fcn listesi, sepet veya \u00f6deme mod\u00fcl\u00fc gibi), kendi ba\u011f\u0131ms\u0131z geli\u015ftirme ya\u015fam d\u00f6ng\u00fcs\u00fcne sahip olabilir. Bu, ekiplerin kendi teknolojilerini se\u00e7ebilmelerini, ba\u011f\u0131ms\u0131z olarak geli\u015ftirme yapabilmelerini ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini h\u0131zland\u0131rabilmelerini sa\u011flar.<\/p>\n<p>Peki, mikrofrontendlerin sundu\u011fu avantajlar nelerdir? \u00d6ncelikle, <strong>ba\u011f\u0131ms\u0131z da\u011f\u0131t\u0131m<\/strong> imkan\u0131 sayesinde, bir mikrofrontendi de\u011fi\u015ftirmek veya g\u00fcncellemek, di\u011fer mikrofrontendleri etkilemez. Bu da riskleri azalt\u0131r ve daha h\u0131zl\u0131 iterasyon sa\u011flar. \u0130kincil olarak, <strong>teknoloji agnostisizmi<\/strong> \u00f6nemli bir faydad\u0131r. Farkl\u0131 mikrofrontendler farkl\u0131 frontend framework&#8217;lerini (React, Vue, Angular vb.) kullanabilir. \u00d6rne\u011fin, yeni bir b\u00f6l\u00fcm\u00fc React ile geli\u015ftirirken, mevcut bir b\u00f6l\u00fcm\u00fc Vue ile \u00e7al\u0131\u015fmaya devam ettirebilirsiniz. Bu, teknoloji borcunu y\u00f6netme ve yeni teknolojilere adapte olma esnekli\u011fi sunar. \u00dc\u00e7\u00fcnc\u00fcl olarak, <strong>\u00f6l\u00e7eklenebilirlik ve ekip otonomisi<\/strong> artar. B\u00fcy\u00fck bir frontend ekibi, k\u00fc\u00e7\u00fck, \u00e7apraz fonksiyonel ekiplere b\u00f6l\u00fcnebilir ve her ekip kendi mikrofrontendinden sorumlu olur. Bu, koordinasyon maliyetlerini d\u00fc\u015f\u00fcr\u00fcr ve ekiplerin daha h\u0131zl\u0131 karar al\u0131p hareket etmelerine olanak tan\u0131r. Son olarak, <strong>daha k\u00fc\u00e7\u00fck ve y\u00f6netilebilir kod tabanlar\u0131<\/strong> sayesinde, yeni geli\u015ftiricilerin projeye adaptasyonu kolayla\u015f\u0131r ve kodun anla\u015f\u0131l\u0131rl\u0131\u011f\u0131 artar. Hata ay\u0131klama s\u00fcre\u00e7leri de daha hedeflidir.<\/p>\n<p>Elbette, mikrofrontendlerin kendi zorluklar\u0131 da vard\u0131r. Bunlar aras\u0131nda <strong>mikrofrontendler aras\u0131 ileti\u015fim<\/strong>, <strong>stil \u00e7ak\u0131\u015fmalar\u0131<\/strong>, <strong>ortak ba\u011f\u0131ml\u0131l\u0131klar\u0131n y\u00f6netimi<\/strong> ve <strong>global durum y\u00f6netimi<\/strong> gibi konular yer al\u0131r. Geleneksel olarak bu sorunlar, karma\u015f\u0131k olay yay\u0131nlama\/abonelik sistemleri, izolasyon teknikleri (Shadow DOM gibi) veya manuel ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi ile \u00e7\u00f6z\u00fclmeye \u00e7al\u0131\u015f\u0131lm\u0131\u015ft\u0131r. Ancak Webpack Module Federation, \u00f6zellikle bu entegrasyon zorluklar\u0131n\u0131 ele almak i\u00e7in tasarlanm\u0131\u015ft\u0131r. Module Federation, farkl\u0131 Webpack build&#8217;lerinin \u00e7al\u0131\u015fma zaman\u0131nda birbirleriyle kod payla\u015fmas\u0131na olanak tan\u0131yarak, bu zorluklar\u0131n \u00e7o\u011funu basitle\u015ftirir ve mikrofrontend mimarilerinin uygulanabilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Bu teknoloji sayesinde, her mikrofrontend, kendi ba\u015f\u0131na ba\u011f\u0131ms\u0131z bir uygulama gibi davranabilirken, gerekti\u011finde di\u011fer mikrofrontendlerin bile\u015fenlerini veya yard\u0131mc\u0131 mod\u00fcllerini do\u011frudan t\u00fcketebilir. Bu durum, \u00f6zellikle ortak bir tasar\u0131m sistemi veya payla\u015f\u0131lan yard\u0131mc\u0131 fonksiyonlar gibi senaryolarda b\u00fcy\u00fck kolayl\u0131k sa\u011flar ve geli\u015ftirme deneyimini \u00fcst d\u00fczeye ta\u015f\u0131r.<\/p>\n<h2>Webpack Module Federation&#8217;\u0131n G\u00fcc\u00fc: Nas\u0131l \u00c7al\u0131\u015f\u0131r? Temel Mekanizmalar<\/h2>\n<p>Webpack Module Federation, Webpack 5 ile tan\u0131t\u0131lan devrim niteli\u011finde bir \u00f6zelliktir ve da\u011f\u0131t\u0131k JavaScript uygulamalar\u0131n\u0131n \u00e7al\u0131\u015fma zaman\u0131nda birbirleriyle kod payla\u015fmas\u0131n\u0131 m\u00fcmk\u00fcn k\u0131lar. Bu \u00f6zellik, mikrofrontend mimarilerinin uygulanmas\u0131n\u0131 radikal bir \u015fekilde basitle\u015ftirir, \u00e7\u00fcnk\u00fc uygulamalar\u0131n farkl\u0131 b\u00f6l\u00fcmlerinin (remotelar) birbirlerine kendi mod\u00fcllerini (bile\u015fenler, servisler, yard\u0131mc\u0131 fonksiyonlar) a\u00e7mas\u0131n\u0131 (expose etmesini) sa\u011flar. B\u00f6ylece, ana uygulama (host) bu mod\u00fclleri sanki kendi kod taban\u0131n\u0131n bir par\u00e7as\u0131ym\u0131\u015f gibi dinamik olarak y\u00fckleyebilir. Module Federation, build zaman\u0131nda de\u011fil, \u00e7al\u0131\u015fma zaman\u0131nda mod\u00fcl payla\u015f\u0131m\u0131n\u0131 m\u00fcmk\u00fcn k\u0131lmas\u0131yla geleneksel k\u00fct\u00fcphane veya bundle payla\u015f\u0131m y\u00f6ntemlerinden ayr\u0131l\u0131r. Bu, her bir mikrofrontend&#8217;in ayr\u0131 ayr\u0131 deploy edilebilmesi ve g\u00fcncellenebilmesi anlam\u0131na gelir.<\/p>\n<p>Module Federation&#8217;\u0131n kalbinde \u00fc\u00e7 temel kavram bulunur: <code>remotes<\/code>, <code>exposes<\/code> ve <code>shared<\/code>.<br \/>\n*   <strong><code>exposes<\/code><\/strong>: Bu, bir Webpack uygulamas\u0131n\u0131n (bir remote uygulaman\u0131n), di\u011fer Webpack uygulamalar\u0131 taraf\u0131ndan t\u00fcketilebilecek mod\u00fclleri nas\u0131l d\u0131\u015fa aktard\u0131\u011f\u0131n\u0131 tan\u0131mlar. \u00d6rne\u011fin, bir &#8220;Sepet&#8221; mikrofrontendi, &#8220;AddToCartButton&#8221; bile\u015fenini di\u011fer mikrofrontendlerin kullanabilmesi i\u00e7in d\u0131\u015fa aktarabilir. D\u0131\u015fa aktar\u0131lan her mod\u00fcl i\u00e7in benzersiz bir isim ve dosya yolu belirtilir.<br \/>\n*   <strong><code>remotes<\/code><\/strong>: Bu, bir Webpack uygulamas\u0131n\u0131n (bir host uygulamas\u0131n\u0131n), hangi di\u011fer Webpack uygulamalar\u0131ndan (remotelar\u0131ndan) mod\u00fcller t\u00fcketece\u011fini tan\u0131mlar. Host uygulamas\u0131, remote&#8217;un d\u0131\u015fa aktard\u0131\u011f\u0131 mod\u00fcllere uzaktan referans verir. Her remote i\u00e7in bir isim ve remote entry noktas\u0131n\u0131n (genellikle <code>remoteEntry.js<\/code> ad\u0131nda bir dosya) URL&#8217;si belirtilir.<br \/>\n*   <strong><code>shared<\/code><\/strong>: Bu, birden fazla uygulama aras\u0131nda payla\u015f\u0131lan ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, React, React DOM, Material-UI gibi k\u00fct\u00fcphaneler genellikle birden fazla mikrofrontend taraf\u0131ndan kullan\u0131l\u0131r. <code>shared<\/code> yap\u0131land\u0131rmas\u0131, bu ba\u011f\u0131ml\u0131l\u0131klar\u0131n yaln\u0131zca bir kez y\u00fcklenmesini ve t\u00fcm mikrofrontendler taraf\u0131ndan payla\u015f\u0131lmas\u0131n\u0131 sa\u011flar. Bu, bundle boyutlar\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde k\u00fc\u00e7\u00fclt\u00fcr ve performans art\u0131\u015f\u0131 sa\u011flar. Ayn\u0131 zamanda, ba\u011f\u0131ml\u0131l\u0131klar\u0131n farkl\u0131 s\u00fcr\u00fcmlerinin y\u00f6netimi i\u00e7in stratejiler (\u00f6rne\u011fin, belirli bir s\u00fcr\u00fcm\u00fc zorlama veya en az\u0131ndan bu s\u00fcr\u00fcm\u00fc kullanma) sunar.<\/p>\n<p>Module Federation&#8217;\u0131n \u00e7al\u0131\u015fma prensibi olduk\u00e7a basittir ancak g\u00fc\u00e7l\u00fcd\u00fcr. Her bir mikrofrontend uygulamas\u0131, kendi <code>webpack.config.js<\/code> dosyas\u0131nda <code>ModuleFederationPlugin<\/code>&#8216;i yap\u0131land\u0131r\u0131r. Bu eklenti, her uygulaman\u0131n bir <code>remoteEntry.js<\/code> dosyas\u0131 olu\u015fturmas\u0131n\u0131 sa\u011flar. Bu dosya, uygulaman\u0131n d\u0131\u015fa aktard\u0131\u011f\u0131 t\u00fcm mod\u00fcllerin bir manifestini ve bu mod\u00fcllerin nas\u0131l y\u00fcklenece\u011fine dair gerekli kodu i\u00e7erir. Bir host uygulamas\u0131, bir remote&#8217;tan bir mod\u00fcl talep etti\u011finde, Webpack bu <code>remoteEntry.js<\/code> dosyas\u0131n\u0131 uzaktan y\u00fckler ve i\u00e7indeki manifest bilgileri sayesinde istenen mod\u00fcl\u00fc dinamik olarak getirir. Bu s\u00fcre\u00e7 tamamen \u015feffaf bir \u015fekilde ger\u00e7ekle\u015fir; geli\u015ftirici i\u00e7in remote mod\u00fcl, yerel bir mod\u00fcl gibi import edilebilir.<\/p>\n<p>\u00d6rne\u011fin, a\u015fa\u011f\u0131daki <code>webpack.config.js<\/code> yap\u0131land\u0131rmas\u0131, bir &#8220;AppA&#8221; uygulamas\u0131n\u0131n &#8220;Button&#8221; bile\u015fenini d\u0131\u015fa aktarmas\u0131n\u0131 ve &#8220;react&#8221; ile &#8220;react-dom&#8221; k\u00fct\u00fcphanelerini payla\u015fmas\u0131n\u0131 g\u00f6sterir:<\/p>\n<pre><code>\n\/\/ AppA\/webpack.config.js\nconst { ModuleFederationPlugin } = require('webpack').container;\n\nmodule.exports = {\n  \/\/ ... di\u011fer Webpack yap\u0131land\u0131rmalar\u0131\n  plugins: [\n    new ModuleFederationPlugin({\n      name: 'appA',\n      filename: 'remoteEntry.js',\n      exposes: {\n        '.\/Button': '.\/src\/Button.jsx', \/\/ Button bile\u015fenini d\u0131\u015fa aktar\n      },\n      shared: {\n        react: { singleton: true, requiredVersion: '^18.0.0' },\n        'react-dom': { singleton: true, requiredVersion: '^18.0.0' },\n      },\n    }),\n  ],\n};\n<\/pre>\n<p><\/code><\/p>\n<p>Ve bir \"AppB\" uygulamas\u0131n\u0131n \"AppA\"dan \"Button\" bile\u015fenini nas\u0131l t\u00fcketti\u011fini g\u00f6steren yap\u0131land\u0131rma:<\/p>\n<pre><code>\n\/\/ AppB\/webpack.config.js\nconst { ModuleFederationPlugin } = require('webpack').container;\n\nmodule.exports = {\n  \/\/ ... di\u011fer Webpack yap\u0131land\u0131rmalar\u0131\n  plugins: [\n    new ModuleFederationPlugin({\n      name: 'appB',\n      remotes: {\n        appA: 'appA@http:\/\/localhost:3001\/remoteEntry.js', \/\/ AppA'dan mod\u00fcl t\u00fcketecek\n      },\n      shared: {\n        react: { singleton: true, requiredVersion: '^18.0.0' },\n        'react-dom': { singleton: true, requiredVersion: '^18.0.0' },\n      },\n    }),\n  ],\n};\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131land\u0131rmalar sayesinde, <code>appB<\/code> uygulamas\u0131ndaki herhangi bir bile\u015fen, <code>import Button from &#039;appA\/Button&#039;;<\/code> \u015feklinde <code>appA<\/code>'n\u0131n <code>Button<\/code> bile\u015fenini kullanabilir. Bu entegrasyonun basitli\u011fi, geli\u015ftiricilerin karma\u015f\u0131k manuel entegrasyon y\u00f6ntemleriyle u\u011fra\u015fmak yerine, i\u015f mant\u0131\u011f\u0131na odaklanmas\u0131na olanak tan\u0131r.<\/p>\n<h2>Ad\u0131m Ad\u0131m Uygulama: Basit Bir Mikrofrontend Projesi Nas\u0131l Olu\u015fturulur? Pratik Bir Rehber<\/h2>\n<p>Module Federation ile basit bir mikrofrontend projesi olu\u015fturmak, san\u0131ld\u0131\u011f\u0131ndan daha kolayd\u0131r. Bu b\u00f6l\u00fcmde, iki ayr\u0131 React uygulamas\u0131n\u0131 (bir host uygulamas\u0131 ve bir remote uygulamas\u0131) Module Federation kullanarak nas\u0131l entegre edece\u011fimizi ad\u0131m ad\u0131m g\u00f6sterece\u011fiz. Bu sayede, temel prensipleri uygulamal\u0131 olarak kavram\u0131\u015f olacaks\u0131n\u0131z.<\/p>\n<p><strong>Ad\u0131m 1: Proje Yap\u0131s\u0131n\u0131 Olu\u015fturma<\/strong><br \/>\n\u00d6ncelikle, projemiz i\u00e7in iki ayr\u0131 klas\u00f6r olu\u015ftural\u0131m: <code>host-app<\/code> ve <code>remote-app<\/code>. Her ikisi de ba\u011f\u0131ms\u0131z birer React projesi olacak.<\/p>\n<pre><code class=\"language-bash\">mkdir microfrontend-demo\ncd microfrontend-demo\nmkdir host-app remote-app<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi her bir klas\u00f6r i\u00e7inde basit bir React projesi ba\u015flatal\u0131m. <code>create-react-app<\/code> kullanmak yerine, Webpack ve React'i manuel olarak kurarak Module Federation yap\u0131land\u0131rmas\u0131n\u0131 daha net g\u00f6relim.<\/p>\n<pre><code class=\"language-bash\"># host-app\ncd host-app\nnpm init -y\nnpm install react react-dom webpack webpack-cli webpack-dev-server html-webpack-plugin babel-loader @babel\/core @babel\/preset-react style-loader css-loader\n\n# remote-app\ncd ..\/remote-app\nnpm init -y\nnpm install react react-dom webpack webpack-cli webpack-dev-server html-webpack-plugin babel-loader @babel\/core @babel\/preset-react style-loader css-loader<\/pre>\n<p><\/code><\/p>\n<p><strong>Ad\u0131m 2: Webpack Yap\u0131land\u0131rmalar\u0131n\u0131 Olu\u015fturma<\/strong><\/p>\n<p>Her iki uygulama i\u00e7in <code>webpack.config.js<\/code> dosyalar\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<p><strong><code>remote-app\/webpack.config.js<\/code>:<\/strong><br \/>\nBu uygulama, bir bile\u015feni d\u0131\u015fa aktaracak (expose edecek).<\/p>\n<pre><code>\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\nconst { ModuleFederationPlugin } = require('webpack').container;\nconst path = require('path');\n\nmodule.exports = {\n  entry: '.\/src\/index.js',\n  mode: 'development',\n  devServer: {\n    port: 3001, \/\/ Remote app 3001 portunda \u00e7al\u0131\u015facak\n  },\n  output: {\n    publicPath: 'auto', \/\/ \u00c7al\u0131\u015fma zaman\u0131nda remote entry URL'sini otomatik belirle\n  },\n  module: {\n    rules: [\n      {\n        test: \/\\.jsx?$\/,\n        loader: 'babel-loader',\n        exclude: \/node_modules\/,\n        options: {\n          presets: ['@babel\/preset-react'],\n        },\n      },\n      {\n        test: \/\\.css$\/,\n        use: ['style-loader', 'css-loader'],\n      },\n    ],\n  },\n  plugins: [\n    new ModuleFederationPlugin({\n      name: 'remoteApp', \/\/ Remote uygulaman\u0131n benzersiz ad\u0131\n      filename: 'remoteEntry.js', \/\/ D\u0131\u015fa aktar\u0131lan mod\u00fcllerin giri\u015f noktas\u0131\n      exposes: {\n        '.\/RemoteButton': '.\/src\/components\/RemoteButton.jsx', \/\/ RemoteButton bile\u015fenini d\u0131\u015fa aktar\n      },\n      shared: {\n        react: { singleton: true, requiredVersion: '^18.0.0' },\n        'react-dom': { singleton: true, requiredVersion: '^18.0.0' },\n      },\n    }),\n    new HtmlWebpackPlugin({\n      template: '.\/public\/index.html',\n    }),\n  ],\n};\n<\/pre>\n<p><\/code><\/p>\n<p><strong><code>host-app\/webpack.config.js<\/code>:<\/strong><br \/>\nBu uygulama, <code>remote-app<\/code>'ten d\u0131\u015fa aktar\u0131lan bile\u015feni t\u00fcketecek.<\/p>\n<pre><code>\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\nconst { ModuleFederationPlugin } = require('webpack').container;\nconst path = require('path');\n\nmodule.exports = {\n  entry: '.\/src\/index.js',\n  mode: 'development',\n  devServer: {\n    port: 3000, \/\/ Host app 3000 portunda \u00e7al\u0131\u015facak\n  },\n  output: {\n    publicPath: 'auto',\n  },\n  module: {\n    rules: [\n      {\n        test: \/\\.jsx?$\/,\n        loader: 'babel-loader',\n        exclude: \/node_modules\/,\n        options: {\n          presets: ['@babel\/preset-react'],\n        },\n      },\n      {\n        test: \/\\.css$\/,\n        use: ['style-loader', 'css-loader'],\n      },\n    ],\n  },\n  plugins: [\n    new ModuleFederationPlugin({\n      name: 'hostApp',\n      remotes: {\n        remoteApp: 'remoteApp@http:\/\/localhost:3001\/remoteEntry.js', \/\/ remoteApp'i tan\u0131mla\n      },\n      shared: {\n        react: { singleton: true, requiredVersion: '^18.0.0' },\n        'react-dom': { singleton: true, requiredVersion: '^18.0.0' },\n      },\n    }),\n    new HtmlWebpackPlugin({\n      template: '.\/public\/index.html',\n    }),\n  ],\n};\n<\/pre>\n<p><\/code><\/p>\n<p><strong>Ad\u0131m 3: Temel React Dosyalar\u0131n\u0131 Olu\u015fturma<\/strong><\/p>\n<p>Her iki uygulama i\u00e7in de <code>src<\/code> ve <code>public<\/code> klas\u00f6rlerini ve gerekli dosyalar\u0131 olu\u015ftural\u0131m.<\/p>\n<p><strong><code>remote-app<\/code> i\u00e7in:<\/strong><br \/>\n*   <code>remote-app\/public\/index.html<\/code>:<\/p>\n<pre><code>\n    <!DOCTYPE html><body>\n        <div id=\"root\"><\/div>\n    <\/body>\n    <\/html>\n    <\/pre>\n<p><\/code><br \/>\n*   <code>host-app\/src\/App.js<\/code>:<\/p>\n<pre><code>\n    import React, { Suspense } from 'react';\n    \/\/ remoteApp'ten RemoteButton'\u0131 dinamik olarak y\u00fckle\n    \/\/ import edilmesi host uygulamas\u0131n\u0131n remote uygulaman\u0131n remoteEntry.js dosyas\u0131n\u0131 indirmesine neden olur.\n    const RemoteButton = React.lazy(() => import('remoteApp\/RemoteButton'));\n\n    const App = () => {\n      return (\n        <div>\n          <h1>Host Uygulama<\/h1>\n          <p>A\u015fa\u011f\u0131daki buton remote uygulamadan y\u00fckleniyor:<\/p>\n          <Suspense fallback={<div>Remote Buton Y\u00fckleniyor...<\/div>}>\n            <RemoteButton \/>\n          <\/Suspense>\n        <\/div>\n      );\n    };\n\n    export default App;\n    <\/pre>\n<p><\/code><br \/>\n*   <code>host-app\/src\/index.js<\/code>:<\/p>\n<pre><code>\n    import React from 'react';\n    import ReactDOM from 'react-dom\/client';\n    import App from '.\/App';\n\n    const root = ReactDOM.createRoot(document.getElementById('root'));\n    root.render(\n      <React.StrictMode>\n        <App \/>\n      <\/React.StrictMode>\n    );\n    <\/pre>\n<p><\/code><\/p>\n<p><strong>Ad\u0131m 4: Uygulamalar\u0131 \u00c7al\u0131\u015ft\u0131rma<\/strong><br \/>\nHer iki uygulaman\u0131n <code>package.json<\/code> dosyalar\u0131na <code>start<\/code> script'ini ekleyin:<\/p>\n<p><strong><code>host-app\/package.json<\/code>:<\/strong><\/p>\n<pre><code>\n  \"scripts\": {\n    \"start\": \"webpack serve --open\"\n  },\n<\/pre>\n<p><\/code><\/p>\n<p><strong><code>remote-app\/package.json<\/code>:<\/strong><\/p>\n<pre><code>\n  \"scripts\": {\n    \"start\": \"webpack serve --open\"\n  },\n<\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-bash\">\u015eimdi iki terminal penceresi a\u00e7\u0131n ve her birinde ilgili klas\u00f6re giderek uygulamalar\u0131 ba\u015flat\u0131n:<\/pre>\n<p><\/code># Terminal 1:<br \/>\ncd host-app<br \/>\nnpm start<\/p>\n<p># Terminal 2:<br \/>\ncd remote-app<br \/>\nnpm start<\/code><\/p>\n<p>Uygulamalar\u0131n\u0131z\u0131n \u00e7al\u0131\u015f\u0131r hale geldi\u011fini g\u00f6receksiniz. <code>host-app<\/code> (http:\/\/localhost:3000) sayfas\u0131nda, <code>remote-app<\/code> (http:\/\/localhost:3001) adresinden y\u00fcklenen \"Remote Butonuna T\u0131kla!\" yazan butonu g\u00f6receksiniz. Bu, Module Federation'\u0131n ba\u015far\u0131l\u0131 bir \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6sterir. Host uygulamas\u0131, remote uygulaman\u0131n kodunu kendi bundle'\u0131na dahil etmeden, \u00e7al\u0131\u015fma zaman\u0131nda dinamik olarak getirir ve kullan\u0131r. Bu pratik \u00f6rnek, Module Federation'\u0131n mikrofrontendler i\u00e7in ne kadar g\u00fc\u00e7l\u00fc bir ara\u00e7 oldu\u011funu a\u00e7\u0131k\u00e7a ortaya koymaktad\u0131r.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131 ve Vaka Analizleri: B\u00fcy\u00fck \u00d6l\u00e7ekli Uygulamalarda Kullan\u0131m<\/h2>\n<p>Mikrofrontend mimarisi ve Webpack Module Federation, teoride kula\u011fa ne kadar ho\u015f gelse de, ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l bir de\u011fer yarat\u0131r? B\u00fcy\u00fck \u00f6l\u00e7ekli ve karma\u015f\u0131k uygulamalar\u0131n kar\u015f\u0131la\u015ft\u0131\u011f\u0131 zorluklara nas\u0131l \u00e7\u00f6z\u00fcmler sunar? Bu b\u00f6l\u00fcmde, farkl\u0131 sekt\u00f6rlerden \u00f6rnek vaka analizleri ve kullan\u0131m senaryolar\u0131 ile Module Federation'\u0131n pratik faydalar\u0131n\u0131 inceleyece\u011fiz. Bu \u00f6rnekler, monolitik yap\u0131lar\u0131n getirdi\u011fi k\u0131s\u0131tlamalar\u0131 a\u015farak daha esnek, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir sistemler kurman\u0131n yollar\u0131n\u0131 g\u00f6sterecektir.<\/p>\n<p><strong>1. E-ticaret Platformlar\u0131: H\u0131z ve Ba\u011f\u0131ms\u0131zl\u0131k \u0130\u00e7in B\u00f6l\u00fcnme<\/strong><br \/>\nBir e-ticaret sitesi, \u00fcr\u00fcn listeleme, \u00fcr\u00fcn detay\u0131, sepet, \u00f6deme, kullan\u0131c\u0131 profili ve sipari\u015f takibi gibi bir\u00e7ok farkl\u0131 mod\u00fclden olu\u015fur. Geleneksel monolitik bir yap\u0131da, bu mod\u00fcllerin hepsi tek bir b\u00fcy\u00fck frontend projesinde birle\u015ftirilir. Bu durum, \u00f6rne\u011fin, \u00f6deme ak\u0131\u015f\u0131nda k\u00fc\u00e7\u00fck bir de\u011fi\u015fiklik yap\u0131ld\u0131\u011f\u0131nda t\u00fcm uygulaman\u0131n yeniden test edilmesini ve da\u011f\u0131t\u0131lmas\u0131n\u0131 gerektirebilir. Ayr\u0131ca, farkl\u0131 ekipler (\u00fcr\u00fcn ekibi, \u00f6deme ekibi, pazarlama ekibi) ayn\u0131 kod taban\u0131 \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131nda \u00e7ak\u0131\u015fmalar ya\u015fanmas\u0131 ka\u00e7\u0131n\u0131lmazd\u0131r.<\/p>\n<p><strong>Module Federation \u00c7\u00f6z\u00fcm\u00fc:<\/strong><br \/>\nE-ticaret devi bir firma, bu sorunlar\u0131 a\u015fmak i\u00e7in Module Federation'\u0131 benimseyebilir. \u00d6rne\u011fin:<br \/>\n*   <strong>\u00dcr\u00fcn Listeleme Mikrofrontendi:<\/strong> React ile geli\u015ftirilmi\u015f, kendi \u00fcr\u00fcn filtreleme, s\u0131ralama ve g\u00f6r\u00fcnt\u00fcleme mant\u0131\u011f\u0131na sahip.<br \/>\n*   <strong>Sepet Mikrofrontendi:<\/strong> Vue ile geli\u015ftirilmi\u015f, sepet i\u00e7eri\u011fi, indirim uygulama ve toplam hesaplama yeteneklerini bar\u0131nd\u0131r\u0131yor.<br \/>\n*   <strong>\u00d6deme Mikrofrontendi:<\/strong> Angular ile geli\u015ftirilmi\u015f, farkl\u0131 \u00f6deme y\u00f6ntemlerini entegre ediyor.<br \/>\n*   <strong>Kullan\u0131c\u0131 Profili Mikrofrontendi:<\/strong> Kendi teknolojisi ve mant\u0131\u011f\u0131na sahip.<\/p>\n<p>Ana \"shell\" uygulamas\u0131, bu mikrofrontendleri \u00e7al\u0131\u015fma zaman\u0131nda dinamik olarak y\u00fckler. Kullan\u0131c\u0131 bir \u00fcr\u00fcn\u00fc sepete ekledi\u011finde, \u00dcr\u00fcn Listeleme mikrofrontendi, Sepet mikrofrontendi ile bir olay arac\u0131l\u0131\u011f\u0131yla ileti\u015fim kurarak \u00fcr\u00fcn\u00fc eklemesini bildirir. Her ekip kendi mod\u00fcl\u00fcn\u00fc ba\u011f\u0131ms\u0131z olarak geli\u015ftirebilir, test edebilir ve devreye alabilir. Bu, \"Time-to-Market\" s\u00fcresini k\u0131salt\u0131r, ekiplerin daha h\u0131zl\u0131 yenilik yapmas\u0131n\u0131 sa\u011flar ve olas\u0131 hatalar\u0131n etkisini s\u0131n\u0131rl\u0131 bir mod\u00fclle s\u0131n\u0131rlar. \u00d6rne\u011fin, \u00f6deme mikrofrontendindeki bir hata, \u00fcr\u00fcn listeleme veya sepet i\u015flevselli\u011fini etkilemez. Bu sayede, m\u00fc\u015fteri deneyimi kesintisiz devam ederken, hata h\u0131zla izole edilip d\u00fczeltilebilir.<\/p>\n<p><strong>2. Kurumsal Uygulamalar ve Dashboardlar: Esneklik ve \u00d6zelle\u015ftirme<\/strong><br \/>\nB\u00fcy\u00fck kurumlar, genellikle \u0130nsan Kaynaklar\u0131 (\u0130K), Finans, M\u00fc\u015fteri \u0130li\u015fkileri Y\u00f6netimi (CRM) ve proje y\u00f6netimi gibi farkl\u0131 i\u015flevleri bar\u0131nd\u0131ran kompleks i\u00e7 sistemlere sahiptir. Her departman\u0131n kendi ihtiya\u00e7lar\u0131 ve veri g\u00f6rselle\u015ftirme tercihleri olabilir. Monolitik bir kurumsal portal, farkl\u0131 departmanlar\u0131n taleplerine ayn\u0131 anda cevap vermekte zorlan\u0131r.<\/p>\n<p><strong>Module Federation \u00c7\u00f6z\u00fcm\u00fc:<\/strong><br \/>\nBir banka veya b\u00fcy\u00fck bir holding, \u00e7al\u0131\u015fanlar\u0131 i\u00e7in tek bir giri\u015f noktas\u0131 sunan, ancak arka planda farkl\u0131 departmanlar taraf\u0131ndan y\u00f6netilen mod\u00fcllerden olu\u015fan bir kurumsal portala sahip olabilir.<br \/>\n*   <strong>\u0130K Paneli Mikrofrontendi:<\/strong> \u00c7al\u0131\u015fan izinleri, bordro bilgileri, performans de\u011ferlendirmeleri.<br \/>\n*   <strong>Finans Raporlama Mikrofrontendi:<\/strong> B\u00fct\u00e7e takibi, gelir-gider analizi, finansal g\u00f6stergeler.<br \/>\n*   <strong>Proje Y\u00f6netimi Mikrofrontendi:<\/strong> G\u00f6rev atamalar\u0131, zaman \u00e7izelgeleri, ilerleme takibi.<\/p>\n<p>Her mikrofrontend, ilgili departman\u0131n BT ekibi taraf\u0131ndan geli\u015ftirilir ve g\u00fcncellenir. Module Federation sayesinde, ana portal, bu farkl\u0131 panelleri kullan\u0131c\u0131n\u0131n yetkilerine ve tercihlerine g\u00f6re dinamik olarak d\u00fczenleyebilir. Hatta, ileri d\u00fczeyde bir \u00f6zelle\u015ftirme ile kullan\u0131c\u0131lar kendi dashboardlar\u0131n\u0131 s\u00fcr\u00fckle-b\u0131rak y\u00f6ntemiyle olu\u015fturabilir, farkl\u0131 mikrofrontendlerden gelen widget'lar\u0131 bir araya getirebilirler. Bu, son kullan\u0131c\u0131lara benzersiz bir deneyim sunarken, geli\u015ftirme ekiplerine de esneklik ve otonomi kazand\u0131r\u0131r. \u00d6rne\u011fin, \u0130K departman\u0131 yeni bir bordro mod\u00fcl\u00fc geli\u015ftirdi\u011finde, finans raporlama ekibinin projelerini durdurmas\u0131na gerek kalmaz.<\/p>\n<p><strong>3. \u0130\u00e7erik Y\u00f6netim Sistemleri (CMS) ve Blog Platformlar\u0131: Mod\u00fcler Bile\u015fenler<\/strong><br \/>\nBir haber portal\u0131 veya blog platformu, ana sayfa ak\u0131\u015f\u0131, makale detay\u0131, yorum b\u00f6l\u00fcm\u00fc, reklam alanlar\u0131 ve yazar profilleri gibi \u00e7e\u015fitli dinamik bile\u015fenlerden olu\u015fur. Bu bile\u015fenlerin her biri kendi i\u00e7inde karma\u015f\u0131k olabilir ve ba\u011f\u0131ms\u0131z olarak geli\u015ftirilmesi platformun genel esnekli\u011fini art\u0131r\u0131r.<\/p>\n<p><strong>Module Federation \u00c7\u00f6z\u00fcm\u00fc:<\/strong><br \/>\nB\u00fcy\u00fck bir medya kurulu\u015fu, i\u00e7erik y\u00f6netim sistemini Module Federation kullanarak yeniden yap\u0131land\u0131rabilir.<br \/>\n*   <strong>Haber Ak\u0131\u015f\u0131 Mikrofrontendi:<\/strong> En son haberleri g\u00f6sterir, ki\u015fiselle\u015ftirme algoritmalar\u0131 i\u00e7erir.<br \/>\n*   <strong>Yorumlar Mikrofrontendi:<\/strong> Disqus veya kendi yorum sistemini entegre eder.<br \/>\n*   <strong>Reklam Mikrofrontendi:<\/strong> Farkl\u0131 reklam a\u011flar\u0131ndan reklamlar\u0131 dinamik olarak y\u00fckler.<br \/>\n*   <strong>Yazar Profili Mikrofrontendi:<\/strong> Yazar\u0131n biyografisini ve di\u011fer makalelerini g\u00f6sterir.<\/p>\n<p>Bu yakla\u015f\u0131m, platformun genel performans\u0131n\u0131 ve bak\u0131m\u0131n\u0131 iyile\u015ftirir. \u00d6rne\u011fin, yorumlar b\u00f6l\u00fcm\u00fcnde yeni bir \u00f6zellik eklendi\u011finde veya bir g\u00fcvenlik yamas\u0131 uyguland\u0131\u011f\u0131nda, t\u00fcm portal\u0131n yeniden da\u011f\u0131t\u0131lmas\u0131na gerek kalmaz. Sadece yorumlar mikrofrontendi g\u00fcncellenir. Ayr\u0131ca, farkl\u0131 ekipler (edit\u00f6r ekibi, reklam ekibi, geli\u015ftirme ekibi) kendi alanlar\u0131ndaki mod\u00fcller \u00fczerinde e\u015f zamanl\u0131 \u00e7al\u0131\u015fabilir, bu da yeni \u00f6zelliklerin daha h\u0131zl\u0131 yay\u0131nlanmas\u0131na olanak tan\u0131r.<\/p>\n<p>Bu vaka analizleri, Module Federation'\u0131n sadece teknik bir yenilik olmad\u0131\u011f\u0131n\u0131, ayn\u0131 zamanda organizasyonel \u00e7evikli\u011fi art\u0131ran ve i\u015f hedeflerine ula\u015fmada kritik bir rol oynayan stratejik bir ara\u00e7 oldu\u011funu g\u00f6stermektedir. Ba\u011f\u0131ms\u0131z ekipler, farkl\u0131 teknolojiler, ba\u011f\u0131ms\u0131z da\u011f\u0131t\u0131mlar; Module Federation t\u00fcm bunlar\u0131 tek bir tutarl\u0131 kullan\u0131c\u0131 deneyiminde birle\u015ftirmeyi m\u00fcmk\u00fcn k\u0131lar.<\/p>\n<h2>Styling, State Y\u00f6netimi ve Routing: Mikrofrontendlerde Ortak Zorluklar Nas\u0131l A\u015f\u0131l\u0131r?<\/h2>\n<p>Mikrofrontend mimarileri, b\u00fcy\u00fck avantajlar sunsa da, stil \u00e7ak\u0131\u015fmalar\u0131, global durum y\u00f6netimi ve y\u00f6nlendirme (routing) gibi ortak zorluklar\u0131 da beraberinde getirir. Bu zorluklar\u0131n \u00fcstesinden gelmek, ba\u015far\u0131l\u0131 bir mikrofrontend uygulamas\u0131n\u0131n anahtar\u0131d\u0131r. Webpack Module Federation, mod\u00fcl entegrasyonunu kolayla\u015ft\u0131r\u0131rken, bu mimari zorluklar i\u00e7in ek stratejiler gerektirir.<\/p>\n<h3>Styling (Stil Y\u00f6netimi): G\u00f6rsel Tutarl\u0131l\u0131k Nas\u0131l Sa\u011flan\u0131r?<\/h3>\n<p>Farkl\u0131 ekiplerin ba\u011f\u0131ms\u0131z mikrofrontendler geli\u015ftirmesi, stil \u00e7ak\u0131\u015fmalar\u0131na yol a\u00e7abilir. \u00d6rne\u011fin, bir ekip bir butona belirli bir <code>padding<\/code> verirken, di\u011fer bir ekip ayn\u0131 s\u0131n\u0131fa farkl\u0131 bir stil uygulayabilir. Bu durum, tutars\u0131z bir kullan\u0131c\u0131 deneyimi yarat\u0131r.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm Yakla\u015f\u0131mlar\u0131:<\/strong><br \/>\n1.  <strong>CSS Mod\u00fclleri veya Stil Bile\u015fenleri (CSS Modules \/ Styled Components):<\/strong> Bu teknikler, her bile\u015fenin stilini yerel olarak kapsayarak (scope ederek) global stil \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nler. CSS Mod\u00fclleri, CSS s\u0131n\u0131f adlar\u0131n\u0131 otomatik olarak benzersiz hale getirirken, Styled Components gibi k\u00fct\u00fcphaneler bile\u015fenlere ba\u011fl\u0131 stil olu\u015fturulmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code>\n    \/* my-component.module.css *\/\n    .button {\n      background-color: #007bff;\n      color: white;\n      padding: 10px 15px;\n      border-radius: 4px;\n    }\n    <\/pre>\n<p><\/code><\/p>\n<pre><code>\n    \/\/ MyComponent.jsx\n    import React from 'react';\n    import styles from '.\/my-component.module.css';\n\n    const MyComponent = () => {\n      return <button className={styles.button}>T\u0131kla<\/button>;\n    };\n    export default MyComponent;\n    <\/pre>\n<p><\/code><br \/>\n2.  <strong>Web Bile\u015fenleri (Shadow DOM):<\/strong> Shadow DOM, HTML ve CSS'i bir bile\u015fen i\u00e7inde tamamen izole etmenin en g\u00fc\u00e7l\u00fc yollar\u0131ndan biridir. Bir Web Bile\u015feni i\u00e7inde tan\u0131mlanan stiller, d\u0131\u015far\u0131 s\u0131zmaz ve d\u0131\u015f stillerden etkilenmez. Bu, mikrofrontendlerin birbirlerinin stillerini asla etkilememesini sa\u011flar.<br \/>\n3.  <strong>Payla\u015f\u0131lan Tasar\u0131m Sistemi (Design System):<\/strong> T\u00fcm mikrofrontendlerin kullanaca\u011f\u0131 merkezi bir stil k\u00fct\u00fcphanesi veya tasar\u0131m sistemi olu\u015fturmak, g\u00f6rsel tutarl\u0131l\u0131\u011f\u0131 sa\u011flaman\u0131n en iyi yoludur. Bu sistem, butonlar, formlar, tipografi gibi ortak UI \u00f6\u011felerini tan\u0131mlar. Module Federation'\u0131n <code>shared<\/code> \u00f6zelli\u011fi sayesinde bu tasar\u0131m sistemi de payla\u015f\u0131lan bir ba\u011f\u0131ml\u0131l\u0131k olarak y\u00f6netilebilir.<\/p>\n<div class=\"expert-tip\">\n      Uzman \u0130pucu: Ortak bir tasar\u0131m sistemi (\u00f6rne\u011fin, Material UI, Ant Design veya \u015firket i\u00e7i bir k\u00fct\u00fcphane) kullanmak ve bunu <code>shared<\/code> ba\u011f\u0131ml\u0131l\u0131k olarak yap\u0131land\u0131rmak, hem stil tutarl\u0131l\u0131\u011f\u0131n\u0131 garanti eder hem de bundle boyutlar\u0131n\u0131 optimize eder.\n    <\/div>\n<h3>State Y\u00f6netimi: Mikrofrontendler Aras\u0131 Veri Payla\u015f\u0131m\u0131<\/h3>\n<p>Mikrofrontendler aras\u0131nda veri payla\u015f\u0131m\u0131 veya global durum y\u00f6netimi, karma\u015f\u0131k bir konudur. Her mikrofrontendin kendi i\u00e7 durumu olmal\u0131d\u0131r, ancak bazen kullan\u0131c\u0131 oturumu, kimlik do\u011frulama bilgileri veya sepet i\u00e7eri\u011fi gibi global verilere eri\u015fmeleri gerekebilir.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm Yakla\u015f\u0131mlar\u0131:<\/strong><br \/>\n1.  <strong>URL Parametreleri ve Yerel Depolama (Local Storage \/ Session Storage):<\/strong> Basit ve az miktarda veri payla\u015f\u0131m\u0131 i\u00e7in URL'ler veya taray\u0131c\u0131n\u0131n yerel depolama alanlar\u0131 kullan\u0131labilir. \u00d6rne\u011fin, bir \u00fcr\u00fcn ID'si URL parametresi olarak aktar\u0131labilir veya kimlik do\u011frulama token'\u0131 <code>localStorage<\/code>'da saklanabilir.<br \/>\n2.  <strong>Olay Yay\u0131nlama\/Abonelik (Event Bus \/ Pub\/Sub Pattern):<\/strong> Custom event'ler veya hafif bir olay bus k\u00fct\u00fcphanesi kullanarak mikrofrontendler aras\u0131nda mesajla\u015fma sa\u011flanabilir. Bir mikrofrontend bir olay\u0131 yay\u0131nlar, di\u011ferleri ise bu olay\u0131 dinler.<\/p>\n<pre><code>\n    \/\/ host-app'ten bir custom event yay\u0131nla\n    window.dispatchEvent(new CustomEvent('productAddedToCart', { detail: { productId: 123 } }));\n\n    \/\/ remote-app'te bu eventi dinle\n    window.addEventListener('productAddedToCart', (event) => {\n      console.log('\u00dcr\u00fcn sepete eklendi:', event.detail.productId);\n    });\n    <\/pre>\n<p><\/code><br \/>\n3.  <strong>Payla\u015f\u0131lan Durum Y\u00f6netimi K\u00fct\u00fcphanesi (Minimal State Management Library):<\/strong> \u00c7ok k\u0131s\u0131tl\u0131 bir kapsamda, React Context, Redux Toolkit veya Zustand gibi minimal bir durum y\u00f6netim k\u00fct\u00fcphanesi, host uygulamas\u0131 taraf\u0131ndan d\u0131\u015fa aktar\u0131larak di\u011fer mikrofrontendler taraf\u0131ndan t\u00fcketilebilir. Ancak bu, s\u0131k\u0131 bir e\u015fle\u015fme yaratabilece\u011fi i\u00e7in dikkatli kullan\u0131lmal\u0131d\u0131r. Ama\u00e7, her mikrofrontendin kendi i\u00e7 durumunu y\u00f6netmesini te\u015fvik etmektir.<\/p>\n<h3>Routing (Y\u00f6nlendirme): Kullan\u0131c\u0131 Navigasyonunu Y\u00f6netmek<\/h3>\n<p>Kullan\u0131c\u0131lar\u0131n mikrofrontendler aras\u0131nda sorunsuz bir \u015fekilde gezinmesi, tutarl\u0131 bir y\u00f6nlendirme stratejisi gerektirir. Host uygulama ana y\u00f6nlendirmeyi y\u00f6netirken, her mikrofrontend kendi i\u00e7indeki alt rotalar\u0131 y\u00f6netebilir.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm Yakla\u015f\u0131mlar\u0131:<\/strong><br \/>\n1.  <strong>Host Taraf\u0131ndan Y\u00f6nlendirme Kontrol\u00fc:<\/strong> Ana host uygulamas\u0131, ana URL yollar\u0131n\u0131 (<code>\/urunler<\/code>, <code>\/sepet<\/code>, <code>\/profil<\/code>) y\u00f6netir ve ilgili mikrofrontendi y\u00fckler. Her mikrofrontend, kendi yol segmenti i\u00e7inde i\u00e7 y\u00f6nlendirme (\u00f6rne\u011fin <code>\/urunler\/123\/detay<\/code>) yapabilir.<br \/>\n2.  <strong>Taray\u0131c\u0131 Ge\u00e7mi\u015fi API (History API):<\/strong> Mikrofrontendler, <code>history.pushState()<\/code> veya <code>history.replaceState()<\/code> kullanarak host uygulamas\u0131na navigasyon olaylar\u0131n\u0131 bildirebilir veya ana URL'yi de\u011fi\u015ftirebilir. Host, bu de\u011fi\u015fiklikleri dinleyerek uygun mikrofrontendi yeniden y\u00fckleyebilir veya bir eylem ger\u00e7ekle\u015ftirebilir.<\/p>\n<pre><code>\n    \/\/ Bir mikrofrontende i\u00e7inden host uygulamas\u0131n\u0131n URL'ini de\u011fi\u015ftirme\n    history.pushState({}, '', '\/yeni-rota-ile-bir-mfe');\n    <\/pre>\n<p><\/code><br \/>\n3.  <strong>Payla\u015f\u0131lan Y\u00f6nlendirici K\u00fct\u00fcphanesi:<\/strong> React Router DOM gibi bir y\u00f6nlendirici k\u00fct\u00fcphanesi, <code>shared<\/code> ba\u011f\u0131ml\u0131l\u0131k olarak eklenebilir. Host, ana y\u00f6nlendirmeyi tan\u0131mlar ve her mikrofrontend, kendi i\u00e7indeki alt rotalar\u0131 bu payla\u015f\u0131lan y\u00f6nlendirici \u00f6rne\u011fini kullanarak y\u00f6netebilir. Bu, tutarl\u0131 bir API sa\u011flar ancak mikrofrontendler aras\u0131nda daha s\u0131k\u0131 bir ba\u011f\u0131ml\u0131l\u0131k yarat\u0131r.<\/p>\n<p>Bu stratejilerle, mikrofrontend mimarilerinin getirdi\u011fi ortak zorluklar\u0131n \u00fcstesinden gelerek, hem geli\u015ftirici verimlili\u011fini art\u0131ran hem de tutarl\u0131 ve sorunsuz bir kullan\u0131c\u0131 deneyimi sunan sa\u011flam uygulamalar in\u015fa etmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<h2>Performans Optimizasyonu ve G\u00fcvenlik: Mikrofrontend Uygulamalar\u0131n\u0131 Geli\u015ftirme \u0130pu\u00e7lar\u0131<\/h2>\n<p>Mikrofrontend mimarisi, uygulamalar\u0131 \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir k\u0131larken, performans ve g\u00fcvenlik konular\u0131 g\u00f6z ard\u0131 edilmemelidir. Module Federation'\u0131n sundu\u011fu esneklik, yanl\u0131\u015f yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131nda performans\u0131 d\u00fc\u015f\u00fcrebilir veya g\u00fcvenlik a\u00e7\u0131klar\u0131na yol a\u00e7abilir. Bu b\u00f6l\u00fcmde, mikrofrontend uygulamalar\u0131n\u0131z\u0131 daha h\u0131zl\u0131 ve daha g\u00fcvenli hale getirmek i\u00e7in ileri d\u00fczey ipu\u00e7lar\u0131 ve p\u00fcf noktalar\u0131 payla\u015faca\u011f\u0131z.<\/p>\n<h3>Performans Optimizasyonu: Daha H\u0131zl\u0131 Y\u00fckleme ve Ak\u0131c\u0131 Deneyim<\/h3>\n<p>Mikrofrontendler birden fazla ba\u011f\u0131ms\u0131z uygulamadan olu\u015ftu\u011fu i\u00e7in, her birinin kendi bundle'\u0131n\u0131 indirmesi toplam y\u00fckleme s\u00fcresini art\u0131rabilir. Ancak Module Federation'\u0131n sundu\u011fu \u00f6zelliklerle bu durum optimize edilebilir.<\/p>\n<p>1.  <strong>Gecikmeli Y\u00fckleme (Lazy Loading) ve Kod B\u00f6lme (Code Splitting):<\/strong> Remote mod\u00fcllerinizi yaln\u0131zca ihtiya\u00e7 duyuldu\u011funda y\u00fcklemek, ba\u015flang\u0131\u00e7 y\u00fckleme s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. React.lazy ve Suspense gibi mekanizmalarla bu kolayca sa\u011flanabilir. Host uygulamas\u0131, sadece kullan\u0131c\u0131n\u0131n g\u00f6rd\u00fc\u011f\u00fc veya etkile\u015fimde bulundu\u011fu mikrofrontendi y\u00fcklemelidir. Webpack, kod b\u00f6lme i\u00e7in otomatik olarak farkl\u0131 chunk'lar olu\u015fturur.<\/p>\n<pre><code>\n    \/\/ Host uygulamas\u0131nda remote bile\u015fenin gecikmeli y\u00fcklenmesi\n    import React, { Suspense } from 'react';\n    const RemoteComponent = React.lazy(() => import('remoteApp\/RemoteComponent'));\n\n    function App() {\n      return (\n        <Suspense fallback={<div>Y\u00fckleniyor...<\/div>}>\n          <RemoteComponent \/>\n        <\/Suspense>\n      );\n    }\n    <\/pre>\n<p><\/code><br \/>\n2.  <strong>Payla\u015f\u0131lan Ba\u011f\u0131ml\u0131l\u0131klar\u0131n Ak\u0131ll\u0131 Y\u00f6netimi (<code>shared<\/code> Yap\u0131land\u0131rmas\u0131):<\/strong> Daha \u00f6nce bahsedildi\u011fi gibi, <code>shared<\/code> yap\u0131land\u0131rmas\u0131, <code>react<\/code>, <code>react-dom<\/code> gibi ortak ba\u011f\u0131ml\u0131l\u0131klar\u0131n yaln\u0131zca bir kez y\u00fcklenmesini sa\u011flar. <code>singleton: true<\/code> ve <code>requiredVersion<\/code> gibi se\u00e7enekleri do\u011fru kullanmak \u00e7ok \u00f6nemlidir.<br \/>\n    *   <code>singleton: true<\/code>: Bu ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n yaln\u0131zca bir \u00f6rne\u011finin (singleton) uygulamada olmas\u0131na izin verir. \u00d6zellikle React gibi k\u00fct\u00fcphanelerde kritik \u00f6neme sahiptir.<br \/>\n    *   <code>requiredVersion<\/code>: Payla\u015f\u0131lan ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n minimum veya belirli bir s\u00fcr\u00fcm\u00fcn\u00fc belirtir. Uyumsuzluklar\u0131 \u00f6nlemek i\u00e7in versiyon kontrol\u00fc \u00f6nemlidir.<br \/>\n    *   <code>eager: true<\/code>: Bu, payla\u015f\u0131lan ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n an\u0131nda y\u00fcklenmesini sa\u011flar, lazy loading'i devre d\u0131\u015f\u0131 b\u0131rak\u0131r. Genellikle host uygulamas\u0131n\u0131n temel ba\u011f\u0131ml\u0131l\u0131klar\u0131 i\u00e7in kullan\u0131labilir.<\/p>\n<div class=\"expert-tip\">\n      Uzman \u0130pucu: \u00d6zellikle <code>singleton: true<\/code> kullan\u0131rken, payla\u015f\u0131lan k\u00fct\u00fcphanelerin (\u00f6rne\u011fin React) ayn\u0131 maj\u00f6r s\u00fcr\u00fcmde oldu\u011fundan emin olun. Aksi takdirde beklenmedik \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131 ile kar\u015f\u0131la\u015fabilirsiniz. Bu teknikle performans\u0131 %40 art\u0131rabilirsiniz.\n    <\/div>\n<p>3.  <strong>Taray\u0131c\u0131 \u00d6nbellekleme (Browser Caching):<\/strong> Webpack'in \u00e7\u0131kt\u0131 dosyalar\u0131na hash eklemek (<code>[contenthash]<\/code>) ve sunucu taraf\u0131nda HTTP \u00f6nbellekleme ba\u015fl\u0131klar\u0131n\u0131 (Cache-Control) do\u011fru yap\u0131land\u0131rmak, de\u011fi\u015fmeyen dosyalar\u0131n tekrar indirilmesini \u00f6nler. <code>remoteEntry.js<\/code> dosyas\u0131 nispeten k\u00fc\u00e7\u00fck oldu\u011fu ve s\u0131kl\u0131kla de\u011fi\u015fmedi\u011fi i\u00e7in uzun s\u00fcreli \u00f6nbelle\u011fe al\u0131nabilir.<br \/>\n4.  <strong>CDN Kullan\u0131m\u0131:<\/strong> Mikrofrontend bundle'lar\u0131n\u0131 ve <code>remoteEntry.js<\/code> dosyalar\u0131n\u0131 bir \u0130\u00e7erik Da\u011f\u0131t\u0131m A\u011f\u0131 (CDN) \u00fczerinden sunmak, kullan\u0131c\u0131ya co\u011frafi olarak daha yak\u0131n sunuculardan y\u00fckleme yaparak performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h3>G\u00fcvenlik: Potansiyel Riskleri Minimize Etme<\/h3>\n<p>Farkl\u0131 kaynaklardan kod y\u00fcklemek, g\u00fcvenlik risklerini de beraberinde getirebilir. Module Federation kullan\u0131rken a\u015fa\u011f\u0131daki g\u00fcvenlik \u00f6nlemlerine dikkat etmek \u00f6nemlidir:<\/p>\n<p>1.  <strong>G\u00fcvenilir Kaynaklardan Y\u00fckleme:<\/strong> Module Federation, herhangi bir URL'den kod y\u00fckleyebilir. Bu nedenle, <code>remotes<\/code> yap\u0131land\u0131rmas\u0131nda yaln\u0131zca g\u00fcvendi\u011finiz, kendi kontrol\u00fcn\u00fczdeki kaynaklar\u0131 belirtmelisiniz. Bilinmeyen veya tehlikeli bir remote'tan kod y\u00fcklemek, uygulaman\u0131z\u0131 k\u00f6t\u00fc niyetli sald\u0131r\u0131lara a\u00e7\u0131k hale getirebilir.<br \/>\n2.  <strong>\u0130\u00e7erik G\u00fcvenlik Politikas\u0131 (Content Security Policy - CSP):<\/strong> Web uygulaman\u0131z i\u00e7in s\u0131k\u0131 bir CSP tan\u0131mlamak, taray\u0131c\u0131n\u0131n yaln\u0131zca belirli kaynaklardan komut dosyalar\u0131, stiller ve di\u011fer varl\u0131klar\u0131 y\u00fcklemesine izin verir. Bu, XSS (Cross-Site Scripting) sald\u0131r\u0131lar\u0131na kar\u015f\u0131 koruma sa\u011flar. <code>script-src<\/code> ve <code>connect-src<\/code> y\u00f6nergelerini dikkatlice yap\u0131land\u0131rarak remote mod\u00fcllerinizin URL'lerini dahil etmelisiniz.<\/p>\n<pre><code>\n    <!-- host-app\/public\/index.html i\u00e7indeki <meta> etiketi -->\n    <meta http-equiv=\"Content-Security-Policy\" content=\"\n      default-src 'self';\n      script-src 'self' http:\/\/localhost:3001;\n      connect-src 'self' http:\/\/localhost:3001;\n      style-src 'self' 'unsafe-inline';\n    \">\n    <\/pre>\n<p><\/code><br \/>\n3.  <strong>Ba\u011f\u0131ml\u0131l\u0131k G\u00fcvenlik A\u00e7\u0131\u011f\u0131 Taramas\u0131:<\/strong> Her bir mikrofrontendin kendi ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 taramak ve bilinen g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 i\u00e7eren paketleri kullanmaktan ka\u00e7\u0131nmak i\u00e7in <code>npm audit<\/code> veya Snyk gibi ara\u00e7lar\u0131 kullanmak \u00f6nemlidir. Payla\u015f\u0131lan ba\u011f\u0131ml\u0131l\u0131klar da dahil olmak \u00fczere, t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n g\u00fcncel ve g\u00fcvenli oldu\u011fundan emin olun.<br \/>\n4.  <strong>Kimlik Do\u011frulama ve Yetkilendirme:<\/strong> Kullan\u0131c\u0131 kimlik do\u011frulama ve yetkilendirme ak\u0131\u015flar\u0131, mikrofrontendler aras\u0131nda tutarl\u0131 bir \u015fekilde y\u00f6netilmelidir. Token'lar veya oturum bilgileri, g\u00fcvenli bir \u015fekilde payla\u015f\u0131lmal\u0131 ve her mikrofrontend, kullan\u0131c\u0131n\u0131n belirli eylemleri ger\u00e7ekle\u015ftirmeye yetkili olup olmad\u0131\u011f\u0131n\u0131 do\u011frulamal\u0131d\u0131r. Genellikle, bu t\u00fcr bilgiler host taraf\u0131ndan y\u00f6netilir ve di\u011fer mikrofrontendlere g\u00fcvenli kanallardan (\u00f6rn. custom event'ler, context API) aktar\u0131l\u0131r.<br \/>\n5.  <strong>Hata \u0130\u015fleme ve \u0130zleme:<\/strong> Remote bir mikrofrontendin y\u00fcklenememesi veya bir hata vermesi durumunda, host uygulamas\u0131n\u0131n bu durumu zarif bir \u015fekilde ele almas\u0131 gerekir. <code>Suspense<\/code>'in <code>fallback<\/code> \u00f6zelli\u011fi veya hata s\u0131n\u0131r\u0131 (Error Boundary) bile\u015fenleri, kullan\u0131c\u0131ya sorunsuz bir deneyim sunmaya yard\u0131mc\u0131 olurken, izleme ara\u00e7lar\u0131 (monitoring tools) hatalar\u0131 tespit etmeye yard\u0131mc\u0131 olur.<\/p>\n<p>Mobil uyumluluk i\u00e7in ise, CSS taraf\u0131nda basit bir medya sorgusu eklemek ve responsive tasar\u0131m ilkelerini benimsemek \u00f6nemlidir. \u00d6rne\u011fin:<\/p>\n<pre><code>\n<style>\n  \/* Genel stil *\/\n  body {\n    font-family: sans-serif;\n    margin: 0;\n    padding: 20px;\n  }\n\n  \/* Mobil uyumluluk i\u00e7in medya sorgusu *\/\n  @media (max-width: 768px) {\n    h1 {\n      font-size: 1.5em;\n    }\n    .remote-button {\n      padding: 8px 12px;\n      font-size: 14px;\n    }\n  }\n<\/style>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu optimizasyon ve g\u00fcvenlik \u00f6nlemleri, Webpack Module Federation ile in\u015fa edilen mikrofrontend uygulamalar\u0131n\u0131n sadece g\u00fc\u00e7l\u00fc de\u011fil, ayn\u0131 zamanda h\u0131zl\u0131, kararl\u0131 ve g\u00fcvenli olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Gelece\u011fin Web Mimarisi: Mikrofrontendler ve Module Federation<\/h2>\n<p>Web uygulamalar\u0131, kullan\u0131c\u0131 beklentileri ve i\u015f gereksinimleri do\u011frultusunda s\u00fcrekli evrilirken, geli\u015ftiriciler de daha esnek, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir mimariler aray\u0131\u015f\u0131ndad\u0131r. Bu makale boyunca ele ald\u0131\u011f\u0131m\u0131z mikrofrontend mimarisi, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar i\u00e7in bu aray\u0131\u015fa g\u00fc\u00e7l\u00fc bir cevap sunmaktad\u0131r. T\u0131pk\u0131 mikroservislerin backend d\u00fcnyas\u0131nda oldu\u011fu gibi, mikrofrontendler de frontend d\u00fcnyas\u0131nda ekiplerin otonomisini art\u0131rarak, farkl\u0131 teknolojilerin kullan\u0131m\u0131na izin vererek ve ba\u011f\u0131ms\u0131z da\u011f\u0131t\u0131m imkan\u0131 sunarak devrim niteli\u011finde bir d\u00f6n\u00fc\u015f\u00fcm\u00fc tetikler.<\/p>\n<p>Ancak mikrofrontendlerin sundu\u011fu bu potansiyel, etkili entegrasyon stratejileri olmadan tam anlam\u0131yla ger\u00e7ekle\u015femez. \u0130\u015fte tam da bu noktada Webpack 5 ile gelen Module Federation, oyun de\u011fi\u015ftirici bir rol oynar. Module Federation, da\u011f\u0131t\u0131k JavaScript uygulamalar\u0131n\u0131n \u00e7al\u0131\u015fma zaman\u0131nda mod\u00fcl payla\u015f\u0131m\u0131n\u0131 kolayla\u015ft\u0131rarak, mikrofrontend mimarilerinin hayata ge\u00e7irilmesindeki en b\u00fcy\u00fck teknik engellerden birini ortadan kald\u0131r\u0131r. <code>remotes<\/code>, <code>exposes<\/code> ve <code>shared<\/code> gibi basit ama g\u00fc\u00e7l\u00fc kavramlar sayesinde, farkl\u0131 projelerden gelen bile\u015fenleri, k\u00fct\u00fcphaneleri ve yard\u0131mc\u0131 mod\u00fclleri sorunsuz bir \u015fekilde bir araya getirmek m\u00fcmk\u00fcn hale gelir. Bu, geli\u015ftiricilerin karma\u015f\u0131k manuel entegrasyon y\u00f6ntemleri veya daha az verimli \u00e7al\u0131\u015fma zaman\u0131 \u00e7\u00f6z\u00fcmleriyle u\u011fra\u015fmak yerine, do\u011frudan i\u015f mant\u0131\u011f\u0131na odaklanmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Bu teknolojinin sundu\u011fu faydalar yaln\u0131zca teknikle s\u0131n\u0131rl\u0131 de\u011fildir. Ekiplerin kendi h\u0131zlar\u0131nda ilerleyebilmesi, teknoloji se\u00e7iminde esnekli\u011fe sahip olmas\u0131 ve ba\u011f\u0131ms\u0131z da\u011f\u0131t\u0131m yapabilmesi, i\u015f \u00e7evikli\u011fini ve pazara sunma s\u00fcresini (time-to-market) \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r. Bu durum, \u00f6zellikle h\u0131zla de\u011fi\u015fen pazar ko\u015fullar\u0131nda rekabet avantaj\u0131 elde etmek isteyen i\u015fletmeler i\u00e7in kritik \u00f6neme sahiptir. Ger\u00e7ek d\u00fcnya senaryolar\u0131nda, e-ticaret platformlar\u0131ndan kurumsal dashboardlara kadar geni\u015f bir yelpazede, Module Federation'\u0131n mikrofrontendler arac\u0131l\u0131\u011f\u0131yla nas\u0131l somut de\u011ferler yaratt\u0131\u011f\u0131n\u0131 g\u00f6rd\u00fck. Styling, state y\u00f6netimi ve routing gibi ortak zorluklara y\u00f6nelik stratejilerle birlikte, performans optimizasyonu ve g\u00fcvenlik \u00f6nlemleri de bu g\u00fc\u00e7l\u00fc mimarinin temel ta\u015flar\u0131n\u0131 olu\u015fturur.<\/p>\n<p>Sonu\u00e7 olarak, Webpack Module Federation, modern web geli\u015ftiricilerinin ara\u00e7 kutusundaki en de\u011ferli eklentilerden biri haline gelmi\u015ftir. Bu teknoloji, gelece\u011fin web uygulamalar\u0131n\u0131 in\u015fa etme \u015feklimizi yeniden tan\u0131mlayarak, daha esnek, \u00f6l\u00e7eklenebilir ve i\u015f odakl\u0131 \u00e7\u00f6z\u00fcmlere kap\u0131 aralamaktad\u0131r. Mikrofrontendlere yat\u0131r\u0131m yapmak, sadece teknik bir tercih de\u011fil, ayn\u0131 zamanda organizasyonel bir \u00e7eviklik ve s\u00fcrd\u00fcr\u00fclebilir b\u00fcy\u00fcme stratejisidir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<p><strong>1. Mikrofrontendler monolitik mimariye g\u00f6re ne gibi avantajlar sunar?<\/strong><br \/>\nMikrofrontendler, ba\u011f\u0131ms\u0131z da\u011f\u0131t\u0131m (faster time-to-market), teknoloji agnostisizmi (farkl\u0131 frameworkler kullanabilme), \u00f6l\u00e7eklenebilir ekipler (daha az koordinasyon, daha fazla otonomi) ve daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir kod tabanlar\u0131 gibi avantajlar sunar. Bu sayede, b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar\u0131n geli\u015ftirilmesi, bak\u0131m\u0131 ve \u00f6l\u00e7eklenmesi \u00e7ok daha kolay hale gelir.<\/p>\n<p><strong>2. Module Federation kullanmadan da mikrofrontend olu\u015fturulabilir mi? Fark\u0131 nedir?<\/strong><br \/>\nEvet, Module Federation kullanmadan da mikrofrontend olu\u015fturulabilir. iframe'ler, Web Bile\u015fenleri (Custom Elements), client-side JavaScript entegrasyonu (\u00f6rne\u011fin, manuel olarak script y\u00fckleme) veya sunucu taraf\u0131 birle\u015ftirme (Server-Side Includes - SSI) gibi y\u00f6ntemler kullan\u0131labilir. Ancak Module Federation'\u0131n fark\u0131, bu entegrasyonu Webpack seviyesinde, \u00e7al\u0131\u015fma zaman\u0131nda, ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve mod\u00fclleri ak\u0131ll\u0131ca payla\u015farak yapmas\u0131d\u0131r. Bu, bundle boyutlar\u0131n\u0131 optimize eder, ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131n\u0131 en aza indirir ve geli\u015ftirme deneyimini \u00e7ok daha basit ve verimli hale getirir.<\/p>\n<p><strong>3. Payla\u015f\u0131lan ba\u011f\u0131ml\u0131l\u0131klar (<code>shared<\/code>) nas\u0131l y\u00f6netilmelidir?<\/strong><br \/>\n<code>shared<\/code> ba\u011f\u0131ml\u0131l\u0131klar, \u00f6zellikle <code>singleton: true<\/code> ve <code>requiredVersion<\/code> se\u00e7enekleriyle dikkatli bir \u015fekilde y\u00f6netilmelidir. <code>singleton: true<\/code>, ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n yaln\u0131zca bir kopyas\u0131n\u0131n uygulamada olmas\u0131n\u0131 sa\u011flar, bu da \u00f6zellikle React gibi k\u00fct\u00fcphaneler i\u00e7in kritik \u00f6nem ta\u015f\u0131r. <code>requiredVersion<\/code> ise, farkl\u0131 mikrofrontendlerin ayn\u0131 ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n uyumlu s\u00fcr\u00fcmlerini kullanmas\u0131n\u0131 garantiler. Ama\u00e7, hem performans\u0131 optimize etmek hem de \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131n\u0131 \u00f6nlemektir.<\/p>\n<p><strong>4. Mikrofrontendlerde SEO nas\u0131l optimize edilir?<\/strong><br \/>\nMikrofrontendlerde SEO optimizasyonu, uygulaman\u0131n nas\u0131l olu\u015fturuldu\u011funa ba\u011fl\u0131d\u0131r. E\u011fer ana host uygulamas\u0131 sunucu taraf\u0131nda render ediliyorsa (SSR) veya statik olarak olu\u015fturuluyorsa (SSG), SEO genellikle kolayd\u0131r. Ancak client-side rendering (CSR) kullan\u0131l\u0131yorsa, arama motoru botlar\u0131n\u0131n JavaScript i\u00e7eri\u011fini do\u011fru bir \u015fekilde tarayabilmesi i\u00e7in baz\u0131 stratejiler izlenmelidir:<br \/>\n*   <strong>Dinamik Render (Dynamic Rendering):<\/strong> Botlar i\u00e7in sunucu taraf\u0131nda render edilmi\u015f i\u00e7erik sunarken, kullan\u0131c\u0131lar i\u00e7in client-side rendering yapmak.<br \/>\n*   <strong>Pre-rendering:<\/strong> Uygulaman\u0131n t\u00fcm sayfalar\u0131n\u0131 veya kritik b\u00f6l\u00fcmlerini \u00f6nceden olu\u015fturup statik HTML dosyalar\u0131 olarak servis etmek.<br \/>\n*   <strong>Anlamsal HTML:<\/strong> Mikrofrontendlerinizin anlaml\u0131 HTML yap\u0131lar\u0131 kulland\u0131\u011f\u0131ndan ve arama motorlar\u0131n\u0131n i\u00e7eri\u011fi do\u011fru bir \u015fekilde anlayabilece\u011finden emin olmak.<\/p>\n<p><strong>5. Hangi durumlarda Module Federation kullanmak mant\u0131kl\u0131d\u0131r?<\/strong><br \/>\nModule Federation, \u00f6zellikle a\u015fa\u011f\u0131daki senaryolarda mant\u0131kl\u0131d\u0131r:<br \/>\n*   <strong>B\u00fcy\u00fck ve karma\u015f\u0131k frontend uygulamalar\u0131:<\/strong> Birden fazla ekibin farkl\u0131 b\u00f6l\u00fcmler \u00fczerinde ba\u011f\u0131ms\u0131z olarak \u00e7al\u0131\u015ft\u0131\u011f\u0131 durumlar.<br \/>\n*   <strong>Farkl\u0131 frontend framework'lerinin bir arada kullan\u0131lmas\u0131 gereken durumlar:<\/strong> Teknoloji ge\u00e7i\u015fleri veya farkl\u0131 ekiplerin farkl\u0131 teknolojiler kullanmas\u0131.<br \/>\n*   <strong>Ortak bile\u015fen k\u00fct\u00fcphanelerinin veya tasar\u0131m sistemlerinin payla\u015f\u0131ld\u0131\u011f\u0131 projeler:<\/strong> Bu k\u00fct\u00fcphanelerin verimli bir \u015fekilde da\u011f\u0131t\u0131k uygulamalar aras\u0131nda payla\u015f\u0131lmas\u0131 gerekti\u011finde.<br \/>\n*   <strong>H\u0131zl\u0131 iterasyon ve ba\u011f\u0131ms\u0131z da\u011f\u0131t\u0131m gereksinimi:<\/strong> Her bir \u00f6zelli\u011fin veya mod\u00fcl\u00fcn ana uygulamadan ba\u011f\u0131ms\u0131z olarak geli\u015ftirilip yay\u0131nlanmas\u0131 istendi\u011finde.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Webpack Module Federation ile Mikrofrontend Mimarileri Modern web uygulamalar\u0131, kullan\u0131c\u0131 beklentilerinin artmas\u0131yla birlikte giderek daha karma\u015f\u0131k hale geliyor.&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-34229","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Remote App<\/title>\n<meta name=\"description\" content=\"A\u015fa\u011f\u0131daki buton remote uygulamadan y\u00fckleniyor:\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/remote-app\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Remote App\" \/>\n<meta property=\"og:description\" content=\"A\u015fa\u011f\u0131daki buton remote uygulamadan y\u00fckleniyor:\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/remote-app\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-13T05:31:15+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"31 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/remote-app\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/remote-app\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Remote App\",\"datePublished\":\"2025-11-13T05:31:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/remote-app\/\"},\"wordCount\":5470,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/remote-app\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/remote-app\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/remote-app\/\",\"name\":\"Remote App\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-13T05:31:15+00:00\",\"description\":\"A\u015fa\u011f\u0131daki buton remote uygulamadan y\u00fckleniyor:\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/remote-app\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/remote-app\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/remote-app\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Remote App\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Remote App","description":"A\u015fa\u011f\u0131daki buton remote uygulamadan y\u00fckleniyor:","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/remote-app\/","og_locale":"tr_TR","og_type":"article","og_title":"Remote App","og_description":"A\u015fa\u011f\u0131daki buton remote uygulamadan y\u00fckleniyor:","og_url":"https:\/\/fatihsoysal.com\/blog\/remote-app\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-13T05:31:15+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"31 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/remote-app\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/remote-app\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Remote App","datePublished":"2025-11-13T05:31:15+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/remote-app\/"},"wordCount":5470,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/remote-app\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/remote-app\/","url":"https:\/\/fatihsoysal.com\/blog\/remote-app\/","name":"Remote App","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-13T05:31:15+00:00","description":"A\u015fa\u011f\u0131daki buton remote uygulamadan y\u00fckleniyor:","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/remote-app\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/remote-app\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/remote-app\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Remote App"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34229","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34229"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34229\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34229"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34229"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34229"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}