{"id":35639,"date":"2025-12-02T04:31:17","date_gmt":"2025-12-02T01:31:17","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/"},"modified":"2025-12-02T04:31:17","modified_gmt":"2025-12-02T01:31:17","slug":"kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/","title":{"rendered":"Kiro ile Tek Dosyadan Tam Kapsaml\u0131 Chrome Uzant\u0131s\u0131na: Ad\u0131m Ad\u0131m Rehber"},"content":{"rendered":"<p><body><\/p>\n<p>Web taray\u0131c\u0131 uzant\u0131lar\u0131, dijital deneyimimizi ki\u015fiselle\u015ftirmenin ve geli\u015ftirmenin g\u00fc\u00e7l\u00fc bir yolunu sunar. Ancak, bir Chrome uzant\u0131s\u0131 geli\u015ftirmek genellikle karma\u015f\u0131k bir yap\u0131land\u0131rma, \u00e7ok say\u0131da dosya ve \u00f6zel bir derleme s\u00fcreci gerektirebilir. Peki, ya bu s\u00fcreci basitle\u015ftiren, tek bir dosyadan tam i\u015flevsel bir uzant\u0131 olu\u015fturman\u0131za olanak tan\u0131yan bir ara\u00e7 olsayd\u0131? \u0130\u015fte tam da bu noktada Kiro devreye giriyor. Bu kapsaml\u0131 rehberde, Kiro kullanarak s\u0131f\u0131rdan, tek bir JavaScript veya TypeScript dosyas\u0131ndan ba\u015flayarak, tam te\u015fekk\u00fcll\u00fc bir Chrome uzant\u0131s\u0131n\u0131 nas\u0131l ad\u0131m ad\u0131m geli\u015ftirebilece\u011finizi, geli\u015fmi\u015f \u00f6zelliklerini ve ger\u00e7ek d\u00fcnya senaryolar\u0131ndaki uygulamalar\u0131n\u0131 ke\u015ffedece\u011fiz. Geleneksel uzant\u0131 geli\u015ftirme karma\u015fas\u0131na veda edip, modern ve ak\u0131c\u0131 bir yakla\u015f\u0131mla projelerinizi hayata ge\u00e7irmeye haz\u0131r olun!<\/p>\n<p>Chrome uzant\u0131lar\u0131, web taray\u0131c\u0131m\u0131z\u0131n i\u015flevselli\u011fini art\u0131ran, kullan\u0131c\u0131lara \u00f6zel yetenekler sunan k\u00fc\u00e7\u00fck ama g\u00fc\u00e7l\u00fc yaz\u0131l\u0131m par\u00e7ac\u0131klar\u0131d\u0131r. Bir\u00e7o\u011fumuz i\u00e7in vazge\u00e7ilmez olan bu uzant\u0131lar, arka planda web sayfalar\u0131n\u0131 analiz etmekten, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc de\u011fi\u015ftirmeye, hatta belirli web siteleri i\u00e7in \u00f6zel ara\u00e7 \u00e7ubuklar\u0131 olu\u015fturmaya kadar geni\u015f bir yelpazede g\u00f6rev alabilir. Ancak, bir uzant\u0131n\u0131n arkas\u0131ndaki geli\u015ftirme s\u00fcreci, \u00f6zellikle yeni ba\u015flayanlar i\u00e7in g\u00f6z korkutucu olabilir. \u00d6ncelikle, bir Chrome uzant\u0131s\u0131n\u0131n temel yap\u0131s\u0131 genellikle birden fazla dosyadan olu\u015fur. Bu dosyalar aras\u0131nda <code>manifest.json<\/code> (uzant\u0131n\u0131n meta verilerini, izinlerini ve bile\u015fenlerini tan\u0131mlayan temel dosya), <code>background scripts<\/code> (uzant\u0131n\u0131n arka planda \u00e7al\u0131\u015fan ve genellikle olaylar\u0131 dinleyen ana mant\u0131\u011f\u0131), <code>content scripts<\/code> (web sayfalar\u0131n\u0131n DOM&#8217;unu de\u011fi\u015ftiren veya onlarla etkile\u015fim kuran betikler) ve <code>popup<\/code> sayfalar\u0131 (uzant\u0131n\u0131n simgesine t\u0131kland\u0131\u011f\u0131nda a\u00e7\u0131lan k\u00fc\u00e7\u00fck kullan\u0131c\u0131 aray\u00fczleri) bulunur.<\/p>\n<p>Geleneksel bir Chrome uzant\u0131s\u0131 geli\u015ftirirken, bu farkl\u0131 bile\u015fenleri y\u00f6netmek, aralar\u0131nda ileti\u015fimi sa\u011flamak ve nihayetinde da\u011f\u0131t\u0131m i\u00e7in paketlemek, belirli zorluklar\u0131 beraberinde getirir. \u00d6rne\u011fin, bir geli\u015ftiricinin hem JavaScript hem de HTML\/CSS dosyalar\u0131n\u0131 y\u00f6netmesi, bunlar\u0131n taray\u0131c\u0131 taraf\u0131ndan d\u00fczg\u00fcn bir \u015fekilde y\u00fcklenmesini sa\u011flamas\u0131 ve t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 do\u011fru bir \u015fekilde yap\u0131land\u0131rmas\u0131 gerekir. Dahas\u0131, modern web geli\u015ftirme s\u00fcre\u00e7lerinde s\u0131kl\u0131kla kullan\u0131lan mod\u00fcl sistemleri, TypeScript derlemesi veya CSS \u00f6n i\u015flemcileri gibi ara\u00e7lar\u0131n, uzant\u0131 geli\u015ftirme ortam\u0131na entegrasyonu ek bir karma\u015f\u0131kl\u0131k katman\u0131 ekleyebilir. Bu durum, \u00f6zellikle k\u00fc\u00e7\u00fck ve h\u0131zl\u0131 bir uzant\u0131 fikrini hayata ge\u00e7irmek isteyenler i\u00e7in ciddi bir ba\u015flang\u0131\u00e7 engeli olu\u015fturabilir. Her proje i\u00e7in ba\u015ftan bir derleme arac\u0131 (\u00f6rne\u011fin Webpack veya Rollup) kurmak, yap\u0131land\u0131rmak ve bak\u0131m\u0131n\u0131 yapmak, geli\u015ftirme s\u00fcresini uzatan ve verimlili\u011fi d\u00fc\u015f\u00fcren fakt\u00f6rlerdir. \u0130\u015fte Kiro, tam da bu geleneksel zorluklara modern ve zarif bir \u00e7\u00f6z\u00fcm sunarak, geli\u015ftiricilerin sadece kod yazmaya odaklanmas\u0131n\u0131 sa\u011flamay\u0131 hedefler. Tek dosya felsefesiyle, uzant\u0131 geli\u015ftirme s\u00fcrecindeki bu engelleri ortadan kald\u0131rmay\u0131 ba\u015far\u0131r.<\/p>\n<h2>Kiro Nedir ve Chrome Uzant\u0131s\u0131 Geli\u015ftirmeye Nas\u0131l Bir Kolayl\u0131k Getirir?<\/h2>\n<p>Kiro, modern JavaScript ve TypeScript tabanl\u0131 Chrome uzant\u0131lar\u0131 geli\u015ftirmek i\u00e7in tasarlanm\u0131\u015f yenilik\u00e7i bir derleme arac\u0131d\u0131r. Temel amac\u0131, uzant\u0131 geli\u015ftirme s\u00fcrecini m\u00fcmk\u00fcn oldu\u011funca basitle\u015ftirmek ve h\u0131zland\u0131rmakt\u0131r. Geleneksel uzant\u0131 geli\u015ftirme ortamlar\u0131n\u0131n aksine, Kiro&#8217;nun en dikkat \u00e7ekici \u00f6zelli\u011fi, tek bir JavaScript veya TypeScript dosyas\u0131ndan t\u00fcm bir Chrome uzant\u0131s\u0131n\u0131 olu\u015fturabilmesidir. Bu &#8220;tek dosya felsefesi&#8221;, geli\u015ftiricilerin farkl\u0131 uzant\u0131 bile\u015fenlerini (arka plan betikleri, i\u00e7erik betikleri, a\u00e7\u0131l\u0131r pencereler ve hatta se\u00e7enekler sayfalar\u0131) ayn\u0131 dosya i\u00e7inde tan\u0131mlamas\u0131na olanak tan\u0131r. Kiro, bu tek dosyay\u0131 al\u0131r, i\u00e7erisindeki \u00f6zel direktifleri yorumlar ve otomatik olarak bir Chrome uzant\u0131s\u0131n\u0131n gerektirdi\u011fi t\u00fcm bile\u015fenleri (HTML, CSS, JavaScript dosyalar\u0131 ve <code>manifest.json<\/code>) uygun bir \u015fekilde derler ve paketler.<\/p>\n<p>Kiro&#8217;nun sundu\u011fu kolayl\u0131klar sadece tek dosya yakla\u015f\u0131m\u0131yla s\u0131n\u0131rl\u0131 de\u011fildir. Ayn\u0131 zamanda geli\u015ftirme deneyimini de \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir. \u00d6rne\u011fin, <code>kiro dev<\/code> komutu ile canl\u0131 yeniden y\u00fckleme (hot-reloading) \u00f6zelli\u011fini etkinle\u015ftirebilirsiniz, bu da kodunuzda yapt\u0131\u011f\u0131n\u0131z de\u011fi\u015fikliklerin uzant\u0131n\u0131za an\u0131nda yans\u0131mas\u0131n\u0131 sa\u011flar. Bu \u00f6zellik, hata ay\u0131klama ve h\u0131zl\u0131 prototipleme s\u00fcre\u00e7leri i\u00e7in paha bi\u00e7ilmezdir. Ayr\u0131ca, Kiro varsay\u0131lan olarak TypeScript deste\u011fi sunar; bu da daha g\u00fcvenli ve \u00f6l\u00e7eklenebilir kod yazman\u0131za olanak tan\u0131rken, geli\u015fmi\u015f hata kontrol\u00fc ve kod tamamlama gibi IDE \u00f6zelliklerinden faydalanman\u0131z\u0131 sa\u011flar. Mod\u00fcler yap\u0131ya sahip oldu\u011fu i\u00e7in, projenize harici NPM paketlerini kolayca dahil edebilir ve modern JavaScript ekosisteminin t\u00fcm avantajlar\u0131ndan yararlanabilirsiniz. Kiro, arka planda geli\u015fmi\u015f derleme ve optimizasyon teknikleri kullanarak, ortaya \u00e7\u0131kan uzant\u0131n\u0131n performansl\u0131 ve kaynak t\u00fcketimi a\u00e7\u0131s\u0131ndan verimli olmas\u0131n\u0131 sa\u011flar. Bu, geli\u015ftiricilerin karma\u015f\u0131k derleme yap\u0131land\u0131rmalar\u0131yla u\u011fra\u015fmak yerine, do\u011frudan uzant\u0131lar\u0131n\u0131n \u00e7ekirdek i\u015flevselli\u011fine odaklanmalar\u0131na olanak tan\u0131r, b\u00f6ylece daha k\u0131sa s\u00fcrede daha kaliteli uzant\u0131lar ortaya \u00e7\u0131karabilirler.<\/p>\n<h2>Kiro ile \u0130lk Chrome Uzant\u0131n\u0131z\u0131 Olu\u015fturmaya Haz\u0131r m\u0131s\u0131n\u0131z?<\/h2>\n<p>Kiro ile ilk Chrome uzant\u0131n\u0131z\u0131 olu\u015fturmak, \u015fa\u015f\u0131rt\u0131c\u0131 derecede basittir. Bu b\u00f6l\u00fcmde, &#8220;Hello World&#8221; mesaj\u0131n\u0131 g\u00f6steren basit bir a\u00e7\u0131l\u0131r pencere (popup) uzant\u0131s\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l geli\u015ftirece\u011finizi \u00f6\u011frenece\u011fiz. \u0130lk olarak, Kiro&#8217;yu sisteminize kurman\u0131z gerekiyor. Kiro bir Node.js paketi oldu\u011fu i\u00e7in, sisteminizde Node.js ve npm&#8217;in (Node Package Manager) kurulu oldu\u011fundan emin olun. Kurulum i\u015flemi olduk\u00e7a basittir ve tek bir komutla global olarak ger\u00e7ekle\u015ftirilebilir:<\/p>\n<pre><code>\nnpm install -g kiro\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu komut, Kiro CLI'y\u0131 (Command Line Interface) sisteminize y\u00fckler. Kurulum tamamland\u0131ktan sonra, projeniz i\u00e7in yeni bir dizin olu\u015fturun ve i\u00e7ine girin:<\/p>\n<pre><code>\nmkdir my-first-kiro-extension\ncd my-first-kiro-extension\n    <\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi, t\u00fcm uzant\u0131 mant\u0131\u011f\u0131m\u0131z\u0131 i\u00e7erecek olan ana dosyay\u0131 olu\u015ftural\u0131m. Bu dosyan\u0131n ad\u0131 genellikle <code>index.ts<\/code> (TypeScript kullan\u0131yorsan\u0131z) veya <code>index.js<\/code> (JavaScript kullan\u0131yorsan\u0131z) olabilir. Biz TypeScript'i tercih edece\u011fiz:<\/p>\n<pre><code>\ntouch index.ts\n    <\/pre>\n<p><\/code><\/p>\n<p><code>index.ts<\/code> dosyas\u0131n\u0131n i\u00e7eri\u011fi, uzant\u0131m\u0131z\u0131n t\u00fcm i\u015flevselli\u011fini tan\u0131mlayacak. Kiro'nun sihirli g\u00fcc\u00fc, HTML i\u00e7eri\u011fini ve JavaScript mant\u0131\u011f\u0131n\u0131 ayn\u0131 dosya i\u00e7inde nas\u0131l y\u00f6netebildi\u011finde yatar. A\u015fa\u011f\u0131daki kod blo\u011fu, basit bir a\u00e7\u0131l\u0131r pencere olu\u015fturan bir Kiro uzant\u0131s\u0131n\u0131 g\u00f6stermektedir:<\/p>\n<pre><code>\n\/\/ index.ts\n\n\/\/ kiro:popup direktifi, bu blo\u011fun bir popup sayfas\u0131n\u0131 temsil etti\u011fini belirtir.\n\/\/ \u0130\u00e7indeki HTML, uzant\u0131 simgesine t\u0131kland\u0131\u011f\u0131nda g\u00f6r\u00fcnt\u00fclenecektir.\n\/* kiro:popup *\/\nexport const popup = <code><!DOCTYPE html>\n  <html>\n    <head>\n      <style>\n        body { width: 200px; height: 100px; display: flex; align-items: center; justify-content: center; font-family: sans-serif; }\n        h1 { color: #333; font-size: 1.2em; }\n      <\/style>\n    <\/head>\n    <body>\n      <h1>Merhaba, Kiro D\u00fcnyas\u0131!<\/h1>\n    <\/body>\n  <\/html><\/code>;\n\n\/\/ kiro:manifest direktifi, uzant\u0131n\u0131n manifest.json dosyas\u0131n\u0131 tan\u0131mlar.\n\/\/ Kiro, bu bilgiyi kullanarak manifest.json dosyas\u0131n\u0131 otomatik olarak olu\u015fturur.\n\/* kiro:manifest *\/\nexport const manifest = {\n  name: \"\u0130lk Kiro Uzant\u0131m\",\n  version: \"1.0\",\n  description: \"Kiro ile olu\u015fturulmu\u015f basit bir Chrome uzant\u0131s\u0131.\",\n  manifest_version: 3,\n  action: {\n    default_popup: \"popup.html\",\n    default_icon: {\n      \"16\": \"icons\/icon16.png\",\n      \"48\": \"icons\/icon48.png\",\n      \"128\": \"icons\/icon128.png\"\n    }\n  },\n  icons: {\n    \"16\": \"icons\/icon16.png\",\n    \"48\": \"icons\/icon48.png\",\n    \"128\": \"icons\/icon128.png\"\n  }\n};\n\n\/\/ Basit bir ikon dosyas\u0131 olu\u015fturdu\u011fumuzu varsayal\u0131m\n\/\/ kiro, belirtilen yoldaki dosyalar\u0131 otomatik olarak kopyalar.\n\/\/ Ger\u00e7ek bir senaryoda bu dosyalar\u0131 images\/icons dizinine koyard\u0131k.\n\/\/ \u015eimdilik bu b\u00f6l\u00fcm\u00fc atl\u0131yoruz ve manuel olarak ekleyece\u011fimizi varsay\u0131yoruz.\n\/\/ Uzman \u0130pucu: Kiro, statik dosyalar\u0131 (resimler, fontlar) manifest dosyas\u0131nda belirtilen veya kod i\u00e7inde referans verilen yollardan otomatik olarak bundle'a dahil eder. Bu, manuel kopyalama zahmetinden kurtar\u0131r.\n\nconsole.log(\"Kiro uzant\u0131s\u0131 y\u00fcklendi!\");\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kodda dikkat etmemiz gerekenler: <code>\/* kiro:popup *\/<\/code> ve <code>\/* kiro:manifest *\/<\/code> yorum sat\u0131rlar\u0131d\u0131r. Kiro, bu direktifleri kullanarak s\u0131ras\u0131yla uzant\u0131m\u0131z\u0131n a\u00e7\u0131l\u0131r pencere HTML'ini ve <code>manifest.json<\/code> dosyas\u0131n\u0131n i\u00e7eri\u011fini tan\u0131mlad\u0131\u011f\u0131m\u0131z\u0131 anlar. <code>manifest<\/code> nesnesi, uzant\u0131m\u0131z\u0131n ad\u0131n\u0131, s\u00fcr\u00fcm\u00fcn\u00fc, a\u00e7\u0131klamas\u0131n\u0131 ve hangi dosyalar\u0131n a\u00e7\u0131l\u0131r pencere olarak kullan\u0131laca\u011f\u0131n\u0131 belirtir. Ayr\u0131ca, uzant\u0131 simgeleri i\u00e7in de yollar tan\u0131mlanm\u0131\u015ft\u0131r. Ger\u00e7ek bir senaryoda, bu ikon dosyalar\u0131n\u0131 projemizin bir <code>icons<\/code> klas\u00f6r\u00fcne yerle\u015ftirmemiz gerekir. Kiro, derleme s\u0131ras\u0131nda bu dosyalar\u0131 otomatik olarak \u00e7\u0131kt\u0131 dizinine kopyalayacakt\u0131r.<\/p>\n<p>\u015eimdi uzant\u0131m\u0131z\u0131 derleyelim: \u00c7al\u0131\u015fma dizininizde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\nkiro build\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>dist<\/code> ad\u0131nda bir klas\u00f6r olu\u015fturacak ve uzant\u0131m\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli t\u00fcm HTML, JavaScript ve <code>manifest.json<\/code> dosyalar\u0131n\u0131 bu klas\u00f6re yerle\u015ftirecektir. Art\u0131k uzant\u0131n\u0131z\u0131 Chrome'a y\u00fcklemeye haz\u0131rs\u0131n\u0131z:<\/p>\n<ol>\n<li>Chrome taray\u0131c\u0131n\u0131z\u0131 a\u00e7\u0131n ve adres \u00e7ubu\u011funa <code>chrome:\/\/extensions<\/code> yaz\u0131n.<\/li>\n<li>Sa\u011f \u00fcst k\u00f6\u015fedeki \"Geli\u015ftirici modu\" anahtar\u0131n\u0131 a\u00e7\u0131n.<\/li>\n<li>\"Paketlenmemi\u015f uzant\u0131 y\u00fckle\" d\u00fc\u011fmesine t\u0131klay\u0131n.<\/li>\n<li>Proje dizininizdeki <code>dist<\/code> klas\u00f6r\u00fcn\u00fc se\u00e7in.<\/li>\n<\/ol>\n<p>Uzant\u0131n\u0131z ba\u015far\u0131yla y\u00fcklendi\u011finde, taray\u0131c\u0131n\u0131z\u0131n ara\u00e7 \u00e7ubu\u011funda yeni bir simge g\u00f6rmelisiniz. Bu simgeye t\u0131klad\u0131\u011f\u0131n\u0131zda \"Merhaba, Kiro D\u00fcnyas\u0131!\" yazan a\u00e7\u0131l\u0131r pencere kar\u015f\u0131n\u0131za \u00e7\u0131kacakt\u0131r. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, Kiro ile tek bir dosyadan tam i\u015flevsel bir uzant\u0131 olu\u015fturmak ger\u00e7ekten de kolay ve h\u0131zl\u0131d\u0131r. Hatta daha da ileri giderek, kodunuzu geli\u015ftirme s\u0131ras\u0131nda otomatik olarak g\u00fcncelleyebilir ve de\u011fi\u015fikliklerinizi an\u0131nda g\u00f6rebilirsiniz. Bunun i\u00e7in <code>kiro dev<\/code> komutunu kullanman\u0131z yeterlidir. Bu komut, kaynak kodunuzdaki de\u011fi\u015fiklikleri izler ve her kaydetti\u011finizde uzant\u0131y\u0131 yeniden derler, b\u00f6ylece Chrome'daki uzant\u0131y\u0131 manuel olarak yeniden y\u00fckleme ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r. Bu sayede, h\u0131zl\u0131 prototipleme ve geli\u015ftirme d\u00f6ng\u00fcleri elde edersiniz.<\/p>\n<h2>Tek Dosya Yetene\u011fini Ke\u015ffetmek: Content Script ve Background Script Entegrasyonu Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Kiro'nun tek dosya yakla\u015f\u0131m\u0131 sadece basit popup'lar i\u00e7in de\u011fil, ayn\u0131 zamanda daha karma\u015f\u0131k uzant\u0131 bile\u015fenleri olan <code>content script<\/code> ve <code>background script<\/code>'leri entegre etmek i\u00e7in de ge\u00e7erlidir. Bu yetenek, uzant\u0131n\u0131z\u0131n t\u00fcm mant\u0131\u011f\u0131n\u0131 tek bir merkezi konumda tutarak y\u00f6netimi inan\u0131lmaz derecede basitle\u015ftirir. Bir <code>content script<\/code>, bir web sayfas\u0131n\u0131n ba\u011flam\u0131nda \u00e7al\u0131\u015fan ve o sayfan\u0131n DOM'unu okuma, de\u011fi\u015ftirme veya olaylar\u0131n\u0131 dinleme yetene\u011fine sahip olan JavaScript kodudur. <code>Background script<\/code> ise, uzant\u0131n\u0131n t\u00fcm ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca arka planda \u00e7al\u0131\u015fan ve genellikle taray\u0131c\u0131 olaylar\u0131n\u0131 (sekme olu\u015fturma, gezinme, vb.) dinleyen, depolama alan\u0131na eri\u015fen ve di\u011fer uzant\u0131 bile\u015fenleriyle ileti\u015fim kuran bir betiktir.<\/p>\n<p>\u015eimdi, Kiro'nun \u00f6zel direktiflerini kullanarak ayn\u0131 <code>index.ts<\/code> dosyas\u0131 i\u00e7inde hem bir i\u00e7erik beti\u011fi hem de bir arka plan beti\u011fi nas\u0131l tan\u0131mlayaca\u011f\u0131m\u0131za dair bir \u00f6rnek inceleyelim. Bu vaka analizi olarak, ziyaret edilen her web sayfas\u0131nda belirli bir kelimeyi (\u00f6rne\u011fin \"Kiro\") vurgulayan ve arka planda bir saya\u00e7 tutan bir uzant\u0131 geli\u015ftirece\u011fiz. \u0130\u015fte <code>index.ts<\/code> dosyam\u0131z\u0131n g\u00fcncellenmi\u015f hali:<\/p>\n<pre><code>\n\/\/ index.ts\n\n\/\/ kiro:popup - \u00f6nceki \u00f6rnekteki popup sayfas\u0131\n\/* kiro:popup *\/\nexport const popup = <code><!DOCTYPE html>\n  <html>\n    <head>\n      <style>\n        body { width: 250px; height: 120px; display: flex; flex-direction: column; align-items: center; justify-content: center; font-family: sans-serif; background-color: #f0f4f8; }\n        h1 { color: #2c3e50; font-size: 1.2em; margin-bottom: 10px; }\n        p { color: #34495e; font-size: 0.9em; }\n        button { background-color: #3498db; color: white; border: none; padding: 8px 15px; border-radius: 4px; cursor: pointer; font-size: 0.9em; margin-top: 10px; }\n        button:hover { background-color: #2980b9; }\n      <\/style>\n    <\/head>\n    <body>\n      <h1>Kiro Vurgulay\u0131c\u0131<\/h1>\n      <p id=\"counter\">Toplam Vurgulama: 0<\/p>\n      <button id=\"resetButton\">Sayac\u0131 S\u0131f\u0131rla<\/button>\n      <script>\n        document.addEventListener(&#039;DOMContentLoaded&#039;, () => {\n          const counterElement = document.getElementById(&#039;counter&#039;);\n          const resetButton = document.getElementById(&#039;resetButton&#039;);\n\n          \/\/ Arka plan beti\u011finden saya\u00e7 bilgisini al\n          chrome.runtime.sendMessage({ type: \"GET_COUNT\" }, (response) => {\n            if (response && response.count !== undefined) {\n              counterElement.textContent = \\<\/code>Toplam Vurgulama: \\${response.count}\\<code>;\n            }\n          });\n\n          \/\/ Sayac\u0131 s\u0131f\u0131rlama d\u00fc\u011fmesine t\u0131klama olay\u0131n\u0131 dinle\n          resetButton.addEventListener(&#039;click&#039;, () => {\n            chrome.runtime.sendMessage({ type: \"RESET_COUNT\" }, (response) => {\n              if (response && response.count !== undefined) {\n                counterElement.textContent = \\<\/code>Toplam Vurgulama: \\${response.count}\\<code>;\n              }\n            });\n          });\n        });\n      <\/script>\n    <\/body>\n  <\/html><\/code>;\n\n\/\/ kiro:content-script direktifi, bu blo\u011fun bir i\u00e7erik beti\u011fi oldu\u011funu belirtir.\n\/\/ matches \u00f6zelli\u011fi, bu beti\u011fin hangi URL'lerde \u00e7al\u0131\u015faca\u011f\u0131n\u0131 tan\u0131mlar.\n\/* kiro:content-script *\/\nexport const contentScript = {\n  matches: [\"<all_urls>\"], \/\/ T\u00fcm URL'lerde \u00e7al\u0131\u015f\u0131r\n  runAt: \"document_idle\", \/\/ Sayfa y\u00fcklendikten sonra \u00e7al\u0131\u015f\u0131r\n  main: () => {\n    const targetWord = \"Kiro\";\n    const regex = new RegExp(targetWord, 'gi'); \/\/ B\u00fcy\u00fck\/k\u00fc\u00e7\u00fck harf duyars\u0131z global arama\n\n    \/\/ Sayfa i\u00e7eri\u011fini analiz et ve kelimeyi vurgula\n    function highlightText(node: Node) {\n      if (node.nodeType === Node.TEXT_NODE && node.parentNode && node.parentNode.nodeName !== 'SCRIPT' && node.parentNode.nodeName !== 'STYLE') {\n        const text = node.nodeValue;\n        if (text && regex.test(text)) {\n          const fragment = document.createDocumentFragment();\n          let lastIndex = 0;\n          let match;\n          while ((match = regex.exec(text)) !== null) {\n            fragment.appendChild(document.createTextNode(text.substring(lastIndex, match.index)));\n            const span = document.createElement('span');\n            span.style.backgroundColor = 'yellow';\n            span.style.fontWeight = 'bold';\n            span.textContent = match[0];\n            fragment.appendChild(span);\n            lastIndex = regex.lastIndex;\n            \/\/ Arka plan beti\u011fine mesaj g\u00f6ndererek sayac\u0131 art\u0131r\n            chrome.runtime.sendMessage({ type: \"INCREMENT_COUNT\" });\n          }\n          fragment.appendChild(document.createTextNode(text.substring(lastIndex)));\n          node.parentNode.replaceChild(fragment, node);\n        }\n      } else if (node.nodeType === Node.ELEMENT_NODE && node.childNodes) {\n        node.childNodes.forEach(highlightText);\n      }\n    }\n    highlightText(document.body);\n\n    console.log(\"Kiro vurgulay\u0131c\u0131 i\u00e7erik beti\u011fi etkin!\");\n  },\n};\n\n\/\/ kiro:background-script direktifi, bu blo\u011fun bir arka plan beti\u011fi oldu\u011funu belirtir.\n\/* kiro:background-script *\/\nexport const backgroundScript = {\n  main: () => {\n    let highlightCount = 0;\n\n    \/\/ Uzant\u0131n\u0131n y\u00fcklendi\u011fini kontrol et\n    chrome.runtime.onInstalled.addListener(() => {\n        console.log(\"Kiro Vurgulay\u0131c\u0131 y\u00fcklendi!\");\n        chrome.storage.local.get(['highlightCount'], (result) => {\n            if (result.highlightCount !== undefined) {\n                highlightCount = result.highlightCount;\n            }\n        });\n    });\n\n    \/\/ Mesajlar\u0131 dinle\n    chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {\n      if (message.type === \"INCREMENT_COUNT\") {\n        highlightCount++;\n        chrome.storage.local.set({ highlightCount: highlightCount });\n        sendResponse({ count: highlightCount });\n      } else if (message.type === \"GET_COUNT\") {\n        sendResponse({ count: highlightCount });\n      } else if (message.type === \"RESET_COUNT\") {\n        highlightCount = 0;\n        chrome.storage.local.set({ highlightCount: highlightCount });\n        sendResponse({ count: highlightCount });\n      }\n      return true; \/\/ Asenkron yan\u0131t i\u00e7in true d\u00f6nd\u00fcr\n    });\n\n    console.log(\"Kiro Vurgulay\u0131c\u0131 arka plan beti\u011fi etkin!\");\n  },\n};\n\n\/\/ kiro:manifest - uzant\u0131n\u0131n manifest.json dosyas\u0131\n\/* kiro:manifest *\/\nexport const manifest = {\n  name: \"Kiro Vurgulay\u0131c\u0131\",\n  version: \"1.0\",\n  description: \"Web sayfalar\u0131nda 'Kiro' kelimesini vurgular ve sayar.\",\n  manifest_version: 3,\n  permissions: [\"activeTab\", \"scripting\", \"storage\"], \/\/ Gerekli izinler\n  host_permissions: [\"<all_urls>\"], \/\/ \u0130\u00e7erik beti\u011fi i\u00e7in t\u00fcm URL'lere eri\u015fim\n  action: {\n    default_popup: \"popup.html\",\n    default_icon: {\n      \"16\": \"icons\/icon16.png\",\n      \"48\": \"icons\/icon48.png\",\n      \"128\": \"icons\/icon128.png\"\n    }\n  },\n  icons: {\n    \"16\": \"icons\/icon16.png\",\n    \"48\": \"icons\/icon48.png\",\n    \"128\": \"icons\/icon128.png\"\n  },\n  background: {\n    service_worker: \"background.js\" \/\/ Kiro, bu dosyay\u0131 otomatik olarak olu\u015fturur\n  },\n  content_scripts: [ \/\/ Kiro, bu b\u00f6l\u00fcm\u00fc otomatik olarak doldurur\n    {\n      matches: [\"<all_urls>\"],\n      js: [\"content.js\"] \/\/ Kiro, bu dosyay\u0131 otomatik olarak olu\u015fturur\n    }\n  ]\n};\n<\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Chrome uzant\u0131lar\u0131nda bile\u015fenler aras\u0131 ileti\u015fim, <code>chrome.runtime.sendMessage<\/code> ve <code>chrome.runtime.onMessage.addListener<\/code> API'leri arac\u0131l\u0131\u011f\u0131yla sa\u011flan\u0131r. Bu mekanizma, i\u00e7erik betiklerinin arka plan beti\u011fine veya tersine mesaj g\u00f6ndermesine olanak tan\u0131r, b\u00f6ylece uzant\u0131n\u0131z\u0131n farkl\u0131 par\u00e7alar\u0131 aras\u0131nda koordineli bir \u015fekilde veri al\u0131\u015fveri\u015fi yapabilirsiniz. \u00d6zellikle karma\u015f\u0131k uzant\u0131lar geli\u015ftirirken bu ileti\u015fim modelini iyi anlamak kritik \u00f6neme sahiptir.\n    <\/div>\n<p>Yukar\u0131daki kodda, <code>contentScript<\/code> nesnesi, <code>matches<\/code> \u00f6zelli\u011fiyle bu beti\u011fin hangi sayfalarda \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtiriz. <code>main<\/code> fonksiyonu ise i\u00e7erik beti\u011fi \u00e7al\u0131\u015ft\u0131\u011f\u0131nda ne olaca\u011f\u0131n\u0131 tan\u0131mlar; bu \u00f6rnekte, \"Kiro\" kelimesini arar ve buldu\u011funda sar\u0131 renkle vurgular. Her vurgulama yapt\u0131\u011f\u0131nda, arka plan beti\u011fine bir mesaj g\u00f6ndererek bir sayac\u0131n art\u0131r\u0131lmas\u0131n\u0131 ister. <code>backgroundScript<\/code> nesnesi, <code>main<\/code> fonksiyonu arac\u0131l\u0131\u011f\u0131yla arka plan mant\u0131\u011f\u0131n\u0131 i\u00e7erir. Bu k\u0131s\u0131mda, <code>chrome.runtime.onMessage.addListener<\/code> ile di\u011fer uzant\u0131 bile\u015fenlerinden gelen mesajlar\u0131 dinler ve sayac\u0131 g\u00fcnceller veya s\u0131f\u0131rlar. Ayr\u0131ca, <code>chrome.storage.local<\/code> kullanarak sayac\u0131 taray\u0131c\u0131n\u0131n yerel depolama alan\u0131nda kal\u0131c\u0131 hale getiririz, b\u00f6ylece taray\u0131c\u0131 kapat\u0131l\u0131p a\u00e7\u0131lsa bile saya\u00e7 de\u011feri korunur.<\/p>\n<p><code>manifest<\/code> nesnesinde ise, <code>permissions<\/code> ve <code>host_permissions<\/code> alanlar\u0131na gerekli izinleri ekledik (<code>activeTab<\/code>, <code>scripting<\/code> ve <code>storage<\/code>). <code>background<\/code> ve <code>content_scripts<\/code> alanlar\u0131 normalde manuel olarak belirtilse de, Kiro'nun ak\u0131ll\u0131 direktifleri sayesinde Kiro derleme s\u0131ras\u0131nda bu b\u00f6l\u00fcmleri sizin i\u00e7in otomatik olarak doldurur ve do\u011fru JavaScript dosyalar\u0131n\u0131 (<code>background.js<\/code> ve <code>content.js<\/code> gibi) olu\u015fturur. Bu, Kiro'nun tek dosya yakla\u015f\u0131m\u0131n\u0131n ne kadar g\u00fc\u00e7l\u00fc oldu\u011funu g\u00f6steren harika bir \u00f6rnektir. T\u00fcm karma\u015f\u0131k yap\u0131land\u0131rma ve dosya y\u00f6netimi Kiro taraf\u0131ndan halledilirken, siz sadece i\u015f mant\u0131\u011f\u0131n\u0131za odaklanabilirsiniz.<\/p>\n<p>Bu \u00f6rne\u011fi derlemek i\u00e7in yine <code>kiro build<\/code> komutunu kullanabilir, veya canl\u0131 geli\u015ftirme i\u00e7in <code>kiro dev<\/code> komutunu \u00e7al\u0131\u015ft\u0131rabilirsiniz. Uzant\u0131y\u0131 Chrome'a y\u00fckledikten sonra (\u00f6nceki s\u00fcr\u00fcm\u00fcn\u00fc kald\u0131r\u0131p, yeni dist klas\u00f6r\u00fcn\u00fc y\u00fcklemeniz gerekebilir), herhangi bir web sayfas\u0131n\u0131 ziyaret etti\u011finizde \"Kiro\" kelimesinin sar\u0131 renkle vurguland\u0131\u011f\u0131n\u0131 ve uzant\u0131 simgesine t\u0131klad\u0131\u011f\u0131n\u0131zda a\u00e7\u0131lan popup'ta vurgulama sayac\u0131n\u0131n artt\u0131\u011f\u0131n\u0131 g\u00f6receksiniz. Bu, Kiro'nun tek bir dosya i\u00e7inde farkl\u0131 uzant\u0131 bile\u015fenlerini nas\u0131l sorunsuz bir \u015fekilde birle\u015ftirebilece\u011finin g\u00fc\u00e7l\u00fc bir kan\u0131t\u0131d\u0131r.<\/p>\n<h2>Modern Geli\u015ftirme Pratikleri ile Kiro: TypeScript, CSS ve Asset Y\u00f6netimi<\/h2>\n<p>Kiro, sadece tek dosya yakla\u015f\u0131m\u0131yla de\u011fil, ayn\u0131 zamanda modern web geli\u015ftirme pratiklerini Chrome uzant\u0131lar\u0131na ta\u015f\u0131madaki yetene\u011fiyle de \u00f6ne \u00e7\u0131kar. TypeScript, CSS ve statik dosyalar\u0131n (asset'ler) y\u00f6netimi, Kiro ile olduk\u00e7a kolay ve entegredir. Bu da uzant\u0131lar\u0131n\u0131z\u0131 daha g\u00fcvenli, bak\u0131m\u0131 daha kolay ve g\u00f6rsel olarak daha \u00e7ekici hale getirmenizi sa\u011flar.<\/p>\n<h3>TypeScript Entegrasyonu ve Avantajlar\u0131<\/h3>\n<p>TypeScript, JavaScript'e iste\u011fe ba\u011fl\u0131 statik tipleme ekleyen bir s\u00fcper k\u00fcmesidir. B\u00fcy\u00fck projelerde veya ekiplerle \u00e7al\u0131\u015f\u0131rken kod kalitesini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi art\u0131rmak i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. Kiro, TypeScript'i do\u011fal olarak destekler. Yani, projenizi <code>.ts<\/code> uzant\u0131l\u0131 dosyalarla ba\u015flatabilir ve Kiro, derleme s\u0131ras\u0131nda bu dosyalar\u0131 otomatik olarak taray\u0131c\u0131lar\u0131n anlayabilece\u011fi standart JavaScript'e d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. TypeScript kullanman\u0131n avantajlar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Hata Yakalama:<\/strong> Derleme zaman\u0131nda potansiyel hatalar\u0131 yakalayarak \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131n\u0131 azalt\u0131r.<\/li>\n<li><strong>Kod Okunabilirli\u011fi:<\/strong> Tipler sayesinde kodun ne bekledi\u011fi ve ne d\u00f6nd\u00fcrd\u00fc\u011f\u00fc daha a\u00e7\u0131k hale gelir.<\/li>\n<li><strong>Geli\u015fmi\u015f IDE Deste\u011fi:<\/strong> Otomatik tamamlama, refactoring ve navigasyon gibi IDE \u00f6zelliklerini geli\u015ftirir.<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik:<\/strong> B\u00fcy\u00fck ve karma\u015f\u0131k uzant\u0131lar geli\u015ftirirken kod taban\u0131n\u0131n y\u00f6netimini kolayla\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Yukar\u0131daki \u00f6rneklerimizde zaten TypeScript kulland\u0131k, bu da Kiro'nun bu entegrasyonu ne kadar sorunsuz sa\u011flad\u0131\u011f\u0131n\u0131 g\u00f6steriyor.<\/p>\n<h3>CSS Entegrasyonu<\/h3>\n<p>Bir uzant\u0131n\u0131n kullan\u0131c\u0131 aray\u00fcz\u00fc sadece HTML ile de\u011fil, ayn\u0131 zamanda stil kurallar\u0131 sa\u011flayan CSS ile de g\u00fczelle\u015ftirilir. Kiro, CSS'i farkl\u0131 \u015fekillerde entegre etmenize olanak tan\u0131r:<\/p>\n<ol>\n<li><strong>Inline Stiller:<\/strong> HTML i\u00e7eri\u011fi i\u00e7inde <code><br \/>\n<style><\/code> etiketleri kullanarak CSS yazmak en basit y\u00f6ntemdir. \u0130lk popup \u00f6rne\u011fimizde bunu kulland\u0131k. K\u00fc\u00e7\u00fck stiller i\u00e7in yeterlidir.<\/li>\n<li><strong>CSS Dosyalar\u0131n\u0131 \u0130\u00e7e Aktarma:<\/strong> Daha b\u00fcy\u00fck ve organize stiller i\u00e7in ayr\u0131 CSS dosyalar\u0131 olu\u015fturabilir ve bunlar\u0131 JavaScript\/TypeScript dosyan\u0131zdan i\u00e7e aktarabilirsiniz. Kiro, bu i\u00e7e aktar\u0131lan CSS'i otomatik olarak i\u015fler ve uzant\u0131n\u0131z\u0131n derlenmi\u015f \u00e7\u0131kt\u0131s\u0131na dahil eder.<\/li>\n<\/ol>\n<p>\u00d6rne\u011fin, <code>styles.css<\/code> ad\u0131nda bir dosya olu\u015fturup i\u00e7ine stillerinizi yazabilir, ard\u0131ndan <code>index.ts<\/code> dosyan\u0131zda \u015fu \u015fekilde i\u00e7e aktarabilirsiniz:<\/p>\n<pre><code>\n\/\/ styles.css\nbody {\n  margin: 0;\n  padding: 15px;\n  background-color: #e0f7fa;\n  color: #00796b;\n  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n}\n\nh1 {\n  font-size: 1.5em;\n  color: #004d40;\n}\n    <\/pre>\n<p><\/code><\/p>\n<pre><code>\n\/\/ index.ts (CSS import)\nimport '.\/styles.css'; \/\/ CSS dosyas\u0131n\u0131 i\u00e7e aktarma\n\n\/* kiro:popup *\/\nexport const popup = <code><!DOCTYPE html>\n  <html>\n    <head>\n      <!-- Kiro, &#039;styles.css&#039;i otomatik olarak bundle&#039;a ekleyecek -->\n    <\/head>\n    <body>\n      <h1>Modern Stillerle Merhaba!<\/h1>\n    <\/body>\n  <\/html><\/code>;\n\/\/ ... di\u011fer uzant\u0131 kodlar\u0131\n    <\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Kiro, i\u00e7e aktar\u0131lan CSS dosyalar\u0131n\u0131 otomatik olarak uzant\u0131n\u0131z\u0131n \u00e7\u0131kt\u0131 dizinine yerle\u015ftirir ve <code>popup.html<\/code> gibi ilgili HTML dosyalar\u0131nda do\u011fru \u015fekilde referans g\u00f6sterir. Bu sayede, CSS y\u00f6netimi konusunda endi\u015felenmenize gerek kalmaz ve modern geli\u015ftirme al\u0131\u015fkanl\u0131klar\u0131n\u0131z\u0131 s\u00fcrd\u00fcrebilirsiniz.\n    <\/div>\n<h3>Statik Dosya ve Asset Y\u00f6netimi<\/h3>\n<p>\u00c7o\u011fu Chrome uzant\u0131s\u0131, ikonlar, resimler, fontlar veya di\u011fer statik dosyalar gibi \"asset\"lere ihtiya\u00e7 duyar. Kiro, bu dosyalar\u0131n y\u00f6netimini de basitle\u015ftirir. Manifest dosyas\u0131nda veya kod i\u00e7inde referans g\u00f6sterdi\u011finiz asset'leri, Kiro derleme s\u0131ras\u0131nda otomatik olarak al\u0131r ve <code>dist<\/code> klas\u00f6r\u00fcn\u00fcze kopyalar. Bu, manuel kopyalama veya karma\u015f\u0131k yap\u0131land\u0131rmalara gerek kalmadan, t\u00fcm statik dosyalar\u0131n\u0131z\u0131n uzant\u0131n\u0131zla birlikte d\u00fczg\u00fcn bir \u015fekilde paketlendi\u011fi anlam\u0131na gelir.<\/p>\n<p>\u00d6rne\u011fin, <code>manifest.json<\/code>'da bir ikon belirledi\u011finizde (yukar\u0131daki \u00f6rneklerde oldu\u011fu gibi), Kiro bu ikon dosyas\u0131n\u0131 projenizin k\u00f6k dizinindeki veya belirtilen alt dizinindeki (\u00f6rne\u011fin <code>icons\/icon16.png<\/code>) konumundan bularak \u00e7\u0131kt\u0131 klas\u00f6r\u00fcne ekler. Benzer \u015fekilde, e\u011fer bir HTML sayfas\u0131nda bir resme <code><img decoding=\"async\" src=\"images\/my-image.png\"><\/code> \u015feklinde referans verirseniz, Kiro bu resmi de bulup paketleyecektir. Bu ak\u0131ll\u0131 asset y\u00f6netimi, geli\u015ftiricilerin dosyalar\u0131 manuel olarak takip etme ve kopyalama y\u00fck\u00fcnden kurtar\u0131r, b\u00f6ylece daha verimli bir geli\u015ftirme s\u00fcreci sunar. K\u0131sacas\u0131, Kiro modern geli\u015ftirme ekosistemini Chrome uzant\u0131lar\u0131na getirerek, geli\u015ftiricilerin daha az yap\u0131land\u0131rma ile daha fazla i\u015f yapmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Kiro ile \u0130leri D\u00fczey Optimizasyonlar ve \u0130pu\u00e7lar\u0131<\/h2>\n<p>Kiro, temel geli\u015ftirme kolayl\u0131klar\u0131n\u0131n yan\u0131 s\u0131ra, uzant\u0131lar\u0131n\u0131z\u0131 optimize etmek ve daha verimli hale getirmek i\u00e7in de ileri d\u00fczey \u00f6zellikler sunar. Bu b\u00f6l\u00fcmde, \u00fcretim i\u00e7in optimizasyonlardan performans ipu\u00e7lar\u0131na ve mobil uyumlu tasar\u0131ma kadar \u00e7e\u015fitli konular\u0131 ele alaca\u011f\u0131z.<\/p>\n<h3>\u00dcretim \u0130\u00e7in Optimize Etme<\/h3>\n<p>Uzant\u0131n\u0131z\u0131 geli\u015ftirme a\u015famas\u0131nda <code>kiro dev<\/code> komutuyla \u00e7al\u0131\u015f\u0131rken, Kiro size h\u0131zl\u0131 geri bildirim sa\u011flamak i\u00e7in baz\u0131 optimizasyonlar\u0131 atlayabilir. Ancak, uzant\u0131n\u0131z\u0131 Chrome Web Ma\u011fazas\u0131'na g\u00f6ndermeden veya son kullan\u0131c\u0131lara da\u011f\u0131tmadan \u00f6nce, performans\u0131 art\u0131rmak ve dosya boyutunu k\u00fc\u00e7\u00fcltmek i\u00e7in \u00fcretim modunda derlemeniz \u00f6nemlidir. Bunu <code>kiro build<\/code> komutuyla yapars\u0131n\u0131z.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: <code>kiro build<\/code> komutu, kodunuzu k\u00fc\u00e7\u00fclt\u00fcr (minification), s\u0131k\u0131\u015ft\u0131r\u0131r (compression) ve gereksiz kodlar\u0131 (dead code elimination) kald\u0131r\u0131r. Bu i\u015flemler, uzant\u0131n\u0131z\u0131n daha h\u0131zl\u0131 y\u00fcklenmesini sa\u011flar ve kullan\u0131c\u0131lar\u0131n indirme boyutunu azalt\u0131r. \u00dcretim da\u011f\u0131t\u0131mlar\u0131 i\u00e7in daima <code>kiro build<\/code> \u00e7\u0131kt\u0131s\u0131n\u0131 kullan\u0131n.\n    <\/div>\n<p>Ayr\u0131ca, ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 y\u00f6netirken dikkatli olun. B\u00fcy\u00fck boyutlu k\u00fct\u00fcphaneler kullanmaktan ka\u00e7\u0131nmak veya yaln\u0131zca ihtiyac\u0131n\u0131z olan mod\u00fclleri i\u00e7e aktarmak, nihai uzant\u0131 boyutunu \u00f6nemli \u00f6l\u00e7\u00fcde d\u00fc\u015f\u00fcrebilir. Kiro, modern tree-shaking tekniklerini destekledi\u011fi i\u00e7in, sadece kulland\u0131\u011f\u0131n\u0131z kod par\u00e7ac\u0131klar\u0131n\u0131n derlemeye dahil edilmesini sa\u011flar.<\/p>\n<h3>Performans \u0130pu\u00e7lar\u0131<\/h3>\n<ol>\n<li><strong>DOM Manip\u00fclasyonunu Azalt\u0131n:<\/strong> \u00d6zellikle <code>content script<\/code>'lerde, DOM'da s\u0131k ve gereksiz de\u011fi\u015fiklikler yapmaktan ka\u00e7\u0131n\u0131n. Toplu de\u011fi\u015fiklikler veya sanal DOM kullanan k\u00fct\u00fcphaneler (\u00f6rne\u011fin React veya Vue gibi, Kiro bunlarla da entegre edilebilir) performans\u0131 art\u0131rabilir.<\/li>\n<li><strong>Asenkron \u0130\u015flemler:<\/strong> Network istekleri veya uzun s\u00fcren hesaplamalar\u0131 ana i\u015f par\u00e7ac\u0131\u011f\u0131nda (main thread) bloke etmeyin. <code>async\/await<\/code> veya <code>Promise<\/code>'lar\u0131 kullanarak i\u015flemleri asenkron hale getirin.<\/li>\n<li><strong>Depolama Kullan\u0131m\u0131:<\/strong> <code>chrome.storage.local<\/code> veya <code>chrome.storage.sync<\/code> API'lerini ak\u0131ll\u0131ca kullan\u0131n. S\u0131k s\u0131k veya b\u00fcy\u00fck miktarlarda veri yazmaktan\/okumaktan ka\u00e7\u0131n\u0131n. \u00d6nbellekleme mekanizmalar\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/li>\n<li><strong>Bellek Y\u00f6netimi:<\/strong> \u00d6zellikle uzun s\u00fcre \u00e7al\u0131\u015fan <code>background script<\/code>'lerde bellek s\u0131z\u0131nt\u0131lar\u0131na dikkat edin. Kullan\u0131lmayan event listener'lar\u0131 veya b\u00fcy\u00fck nesneleri temizlemeyi unutmay\u0131n.<\/li>\n<\/ol>\n<p>Performans, kullan\u0131c\u0131 deneyimi i\u00e7in kritik \u00f6neme sahiptir. Kiro, h\u0131zl\u0131 geli\u015ftirme d\u00f6ng\u00fcs\u00fc sayesinde performans testlerini ve optimizasyonlar\u0131 daha kolay yapman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Harici K\u00fct\u00fcphanelerle \u00c7al\u0131\u015fma (NPM Paketleri)<\/h3>\n<p>Kiro, modern bir derleme arac\u0131 olarak, NPM \u00fczerinden y\u00fckledi\u011finiz harici k\u00fct\u00fcphaneleri sorunsuz bir \u015fekilde kullanman\u0131za olanak tan\u0131r. \u00d6rne\u011fin, bir veri i\u015fleme k\u00fct\u00fcphanesi (lodash gibi) veya bir UI bile\u015fen k\u00fct\u00fcphanesi kullanmak isteyebilirsiniz. Bunun i\u00e7in projenize normal bir NPM paketi gibi y\u00fcklemeniz yeterlidir:<\/p>\n<pre><code>\nnpm install lodash\n    <\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, <code>index.ts<\/code> dosyan\u0131zda k\u00fct\u00fcphaneyi i\u00e7e aktarabilir ve kullanabilirsiniz:<\/p>\n<pre><code>\nimport { debounce } from 'lodash';\n\n\/\/ ... di\u011fer Kiro kodlar\u0131\n\n\/* kiro:content-script *\/\nexport const contentScript = {\n  matches: [\"<all_urls>\"],\n  main: () => {\n    const handleScroll = debounce(() => {\n      console.log(\"Kayd\u0131rma olay\u0131 debounced olarak \u00e7al\u0131\u015ft\u0131!\");\n    }, 200);\n\n    window.addEventListener('scroll', handleScroll);\n  }\n};\n    <\/pre>\n<p><\/code><\/p>\n<p>Kiro, bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 otomatik olarak alg\u0131lar, paketler ve uzant\u0131n\u0131z\u0131n derlenmi\u015f \u00e7\u0131kt\u0131s\u0131na dahil eder. Bu sayede, modern JavaScript ekosisteminin zengin k\u00fct\u00fcphane ve ara\u00e7lar\u0131ndan Chrome uzant\u0131lar\u0131n\u0131zda rahatl\u0131kla faydalanabilirsiniz.<\/p>\n<h3>Mobil Uyumlu Tasar\u0131m \u0130\u00e7in CSS Media Query \u00d6rne\u011fi<\/h3>\n<p>Chrome uzant\u0131lar\u0131n\u0131z\u0131n popup veya options sayfalar\u0131, bazen farkl\u0131 ekran boyutlar\u0131na veya cihazlara uyum sa\u011flamas\u0131 gerekebilir. \u00d6zellikle uzant\u0131n\u0131z\u0131 bir web uygulamas\u0131n\u0131n par\u00e7as\u0131 olarak d\u00fc\u015f\u00fcn\u00fcyorsan\u0131z veya gelecekte mobil taray\u0131c\u0131 uzant\u0131lar\u0131na d\u00f6n\u00fc\u015ft\u00fcrmeyi planl\u0131yorsan\u0131z, responsive tasar\u0131m \u00f6nemlidir. CSS Media Query'ler, bu uyumlulu\u011fu sa\u011flamak i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Kiro ile yaz\u0131lan uzant\u0131lar\u0131n HTML\/CSS k\u0131s\u0131mlar\u0131 standart web teknolojilerini kulland\u0131\u011f\u0131 i\u00e7in, medya sorgular\u0131n\u0131 kolayca uygulayabilirsiniz.<\/p>\n<pre><code>\n\/* styles.css veya popup i\u00e7indeki <style> etiketi *\/\nbody {\n  font-size: 16px;\n  background-color: #ffffff;\n}\n\n\/* Ekran geni\u015fli\u011fi 480 pikselden az oldu\u011funda uygulanacak stiller *\/\n@media (max-width: 480px) {\n  body {\n    font-size: 14px;\n    background-color: #f0f0f0;\n    padding: 10px;\n  }\n  h1 {\n    font-size: 1.2em;\n  }\n  button {\n    padding: 6px 10px;\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu basit \u00f6rnek, ekran geni\u015fli\u011fi belirli bir e\u015fi\u011fin alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde (\u00f6rne\u011fin mobil cihazlarda), uzant\u0131 popup'\u0131n\u0131n veya se\u00e7enekler sayfas\u0131n\u0131n yaz\u0131 tipi boyutunu, arka plan rengini ve d\u00fc\u011fme dolgusunu nas\u0131l de\u011fi\u015ftirebilece\u011fini g\u00f6stermektedir. Kiro, bu t\u00fcr stil tan\u0131mlar\u0131n\u0131 herhangi bir ek yap\u0131land\u0131rma olmadan do\u011frudan i\u015fler, bu da geli\u015ftiricilere tam bir esneklik sunar.<\/p>\n<p>Kiro, sadece ba\u015flang\u0131\u00e7 dostu olmakla kalmaz, ayn\u0131 zamanda deneyimli geli\u015ftiricilerin ihtiya\u00e7 duydu\u011fu t\u00fcm modern ara\u00e7 ve tekniklerle uyumludur. Bu ileri d\u00fczey optimizasyonlar ve entegrasyonlar sayesinde, performansl\u0131, bak\u0131m\u0131 kolay ve \u00f6zellik a\u00e7\u0131s\u0131ndan zengin Chrome uzant\u0131lar\u0131 geli\u015ftirmek art\u0131k \u00e7ok daha eri\u015filebilir hale gelmi\u015ftir.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: Bir Verimlilik Arac\u0131 Geli\u015ftirmek<\/h2>\n<p>\u015eimdiye kadar \u00f6\u011frendiklerimizi peki\u015ftirmek ve Kiro'nun ger\u00e7ek d\u00fcnya uygulamalar\u0131ndaki g\u00fcc\u00fcn\u00fc g\u00f6stermek i\u00e7in, basit ama i\u015flevsel bir verimlilik arac\u0131 geli\u015ftirelim: \"Sekme Kaydedici\". Bu uzant\u0131, kullan\u0131c\u0131n\u0131n o an a\u00e7\u0131k olan t\u00fcm sekmeleri tek bir t\u0131klamayla kaydetmesini, bu kay\u0131tlar\u0131 popup aray\u00fcz\u00fcnde g\u00f6r\u00fcnt\u00fclemesini ve daha sonra bu sekmeleri tek bir t\u0131klamayla yeniden a\u00e7mas\u0131n\u0131 sa\u011flayacak. Bu senaryo, <code>background script<\/code> (sekme bilgilerini y\u00f6netmek), <code>popup<\/code> (kullan\u0131c\u0131 aray\u00fcz\u00fc) ve <code>storage<\/code> (kaydedilen sekmeleri kal\u0131c\u0131 hale getirmek) aras\u0131ndaki etkile\u015fimi kapsayacak ve Kiro'nun tek dosya yetene\u011fini bir kez daha vurgulayacakt\u0131r.<\/p>\n<h3>Uzant\u0131n\u0131n Mimari Yakla\u015f\u0131m\u0131 ve Kullan\u0131lan Kiro \u00d6zellikleri<\/h3>\n<p>Bu uzant\u0131 i\u00e7in ana mant\u0131k, <code>background script<\/code> i\u00e7inde yer alacakt\u0131r. Bu betik, taray\u0131c\u0131dan sekmelerin listesini alacak ve bunlar\u0131 <code>chrome.storage.local<\/code> kullanarak kaydedecektir. <code>Popup<\/code> aray\u00fcz\u00fc ise bu kaydedilmi\u015f oturumlar\u0131 g\u00f6sterecek ve kullan\u0131c\u0131n\u0131n se\u00e7ilen bir oturumu yeniden a\u00e7mas\u0131n\u0131 veya silmesini sa\u011flayacakt\u0131r. Kiro'nun <code>\/* kiro:popup *\/<\/code>, <code>\/* kiro:background-script *\/<\/code> ve <code>\/* kiro:manifest *\/<\/code> direktiflerini kullanarak t\u00fcm bu bile\u015fenleri tek bir <code>index.ts<\/code> dosyas\u0131nda y\u00f6netece\u011fiz.<\/p>\n<pre><code>\n\/\/ index.ts: Sekme Kaydedici Uzant\u0131s\u0131\n\n\/\/ Ortak tipler ve yard\u0131mc\u0131 fonksiyonlar\ninterface TabInfo {\n  id: number;\n  url: string;\n  title: string;\n}\n\ninterface Session {\n  id: string; \/\/ Oturum kimli\u011fi (timestamp)\n  name: string;\n  tabs: TabInfo[];\n  timestamp: number;\n}\n\n\/\/ kiro:popup - Uzant\u0131n\u0131n kullan\u0131c\u0131 aray\u00fcz\u00fc\n\/* kiro:popup *\/\nexport const popup = <code><!DOCTYPE html>\n  <html>\n    <head>\n      <meta charset=\"UTF-8\">\n      <title>Sekme Kaydedici<\/title>\n      <style>\n        body { font-family: &#039;Segoe UI&#039;, Tahoma, Geneva, Verdana, sans-serif; width: 350px; padding: 15px; background-color: #f4f7f6; color: #333; }\n        h2 { color: #2c3e50; margin-top: 0; font-size: 1.3em; }\n        button { background-color: #3498db; color: white; border: none; padding: 8px 12px; border-radius: 4px; cursor: pointer; font-size: 0.9em; margin-right: 10px; margin-bottom: 15px; transition: background-color 0.2s; }\n        button:hover { background-color: #2980b9; }\n        .session-item { background-color: #ecf0f1; border-left: 5px solid #bdc3c7; padding: 10px; margin-bottom: 8px; display: flex; justify-content: space-between; align-items: center; border-radius: 4px; }\n        .session-item:hover { border-left-color: #3498db; }\n        .session-info span { display: block; font-size: 0.95em; color: #34495e; }\n        .session-info small { font-size: 0.8em; color: #7f8c8d; }\n        .session-actions button { margin: 0 5px; padding: 5px 9px; font-size: 0.8em; }\n        .session-actions .open { background-color: #27ae60; }\n        .session-actions .open:hover { background-color: #229954; }\n        .session-actions .delete { background-color: #e74c3c; }\n        .session-actions .delete:hover { background-color: #c0392b; }\n        #session-list { list-style: none; padding: 0; margin: 0; }\n        #session-list li:last-child { margin-bottom: 0; }\n        p#no-sessions { text-align: center; color: #7f8c8d; font-size: 0.9em; }\n      <\/style>\n    <\/head>\n    <body>\n      <h2>Sekme Kaydedici<\/h2>\n      <button id=\"saveCurrentTabs\">A\u00e7\u0131k Sekmeleri Kaydet<\/button>\n      <ul id=\"session-list\">\n        <p id=\"no-sessions\">Hen\u00fcz kaydedilmi\u015f oturum yok.<\/p>\n      <\/ul>\n\n      <script>\n        document.addEventListener(&#039;DOMContentLoaded&#039;, () => {\n          const saveButton = document.getElementById(&#039;saveCurrentTabs&#039;);\n          const sessionList = document.getElementById(&#039;session-list&#039;);\n          const noSessionsMessage = document.getElementById(&#039;no-sessions&#039;);\n\n          function renderSessions(sessions) {\n            sessionList.innerHTML = &#039;&#039;; \/\/ Listeyi temizle\n            if (sessions.length === 0) {\n              noSessionsMessage.style.display = &#039;block&#039;;\n              return;\n            } else {\n              noSessionsMessage.style.display = &#039;none&#039;;\n            }\n\n            sessions.sort((a, b) => b.timestamp - a.timestamp); \/\/ En yeni \u00fcste\n\n            sessions.forEach(session => {\n              const li = document.createElement(&#039;li&#039;);\n              li.className = &#039;session-item&#039;;\n              li.innerHTML = \\<\/code>\n                <div class=\"session-info\">\n                  <span>\\${session.name} (\\${session.tabs.length} sekme)<\/span>\n                  <small>\\${new Date(session.timestamp).toLocaleString()}<\/small>\n                <\/div>\n                <div class=\"session-actions\">\n                  <button class=\"open\" data-session-id=\"\\${session.id}\">A\u00e7<\/button>\n                  <button class=\"delete\" data-session-id=\"\\${session.id}\">Sil<\/button>\n                <\/div>\n              \\<code>;\n\n              sessionList.appendChild(li);\n            });\n          }\n\n          \/\/ Arka plan beti\u011finden oturumlar\u0131 y\u00fckle\n          chrome.runtime.sendMessage({ type: \"GET_SESSIONS\" }, (response) => {\n            if (response && response.sessions) {\n              renderSessions(response.sessions);\n            }\n          });\n\n          \/\/ Mevcut sekmeleri kaydet butonu\n          saveButton.addEventListener(&#039;click&#039;, () => {\n            const sessionName = prompt(\"Oturum i\u00e7in bir isim girin:\", \\<\/code>Oturum \\${new Date().toLocaleString()}\\<code>);\n            if (sessionName) {\n              chrome.runtime.sendMessage({ type: \"SAVE_TABS\", name: sessionName }, (response) => {\n                if (response && response.sessions) {\n                  renderSessions(response.sessions);\n                }\n              });\n            }\n          });\n\n          \/\/ Oturumlar\u0131 a\u00e7ma ve silme delegasyonu\n          sessionList.addEventListener(&#039;click&#039;, (event) => {\n            const target = event.target;\n            if (target.tagName === &#039;BUTTON&#039;) {\n              const sessionId = target.dataset.sessionId;\n              if (target.classList.contains(&#039;open&#039;)) {\n                chrome.runtime.sendMessage({ type: \"OPEN_SESSION\", sessionId: sessionId });\n              } else if (target.classList.contains(&#039;delete&#039;)) {\n                chrome.runtime.sendMessage({ type: \"DELETE_SESSION\", sessionId: sessionId }, (response) => {\n                  if (response && response.sessions) {\n                    renderSessions(response.sessions);\n                  }\n                });\n              }\n            }\n          });\n        });\n      <\/script>\n    <\/body>\n  <\/html><\/code>;\n\n\/\/ kiro:background-script - Uzant\u0131n\u0131n arka plan mant\u0131\u011f\u0131\n\/* kiro:background-script *\/\nexport const backgroundScript = {\n  main: () => {\n    const SESSIONS_KEY = 'savedSessions';\n    let savedSessions: Session[] = [];\n\n    \/\/ Uzant\u0131 y\u00fcklendi\u011finde veya g\u00fcncellendi\u011finde oturumlar\u0131 y\u00fckle\n    chrome.runtime.onInstalled.addListener(() => {\n      chrome.storage.local.get([SESSIONS_KEY], (result) => {\n        if (result[SESSIONS_KEY]) {\n          savedSessions = result[SESSIONS_KEY];\n        } else {\n          savedSessions = [];\n        }\n        console.log(\"Sekme Kaydedici y\u00fcklendi. Kaydedilmi\u015f oturumlar:\", savedSessions);\n      });\n    });\n\n    \/\/ Mesajlar\u0131 dinle\n    chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {\n      if (message.type === \"GET_SESSIONS\") {\n        sendResponse({ sessions: savedSessions });\n      } else if (message.type === \"SAVE_TABS\") {\n        chrome.tabs.query({ currentWindow: true }, (tabs) => {\n          const currentTabs: TabInfo[] = tabs.map(tab => ({\n            id: tab.id!,\n            url: tab.url!,\n            title: tab.title!,\n          }));\n          const newSession: Session = {\n            id: Date.now().toString(), \/\/ Benzersiz ID i\u00e7in timestamp\n            name: message.name || <code>Oturum ${new Date().toLocaleString()}<\/code>,\n            tabs: currentTabs,\n            timestamp: Date.now(),\n          };\n          savedSessions.push(newSession);\n          chrome.storage.local.set({ [SESSIONS_KEY]: savedSessions }, () => {\n            sendResponse({ sessions: savedSessions });\n          });\n        });\n        return true; \/\/ Asenkron yan\u0131t i\u00e7in true d\u00f6nd\u00fcr\n      } else if (message.type === \"OPEN_SESSION\") {\n        const sessionToOpen = savedSessions.find(s => s.id === message.sessionId);\n        if (sessionToOpen) {\n          \/\/ Mevcut pencereyi kapat\u0131p yeni bir pencerede a\u00e7 veya yeni bir pencere a\u00e7\n          \/\/ Basitlik ad\u0131na, yeni bir pencerede a\u00e7al\u0131m\n          chrome.windows.create({\n            url: sessionToOpen.tabs.map(tab => tab.url),\n            focused: true\n          });\n        }\n      } else if (message.type === \"DELETE_SESSION\") {\n        savedSessions = savedSessions.filter(s => s.id !== message.sessionId);\n        chrome.storage.local.set({ [SESSIONS_KEY]: savedSessions }, () => {\n          sendResponse({ sessions: savedSessions });\n        });\n        return true; \/\/ Asenkron yan\u0131t i\u00e7in true d\u00f6nd\u00fcr\n      }\n    });\n\n    console.log(\"Sekme Kaydedici arka plan beti\u011fi etkin!\");\n  },\n};\n\n\/\/ kiro:manifest - Uzant\u0131n\u0131n manifest.json dosyas\u0131\n\/* kiro:manifest *\/\nexport const manifest = {\n  name: \"Sekme Kaydedici\",\n  version: \"1.0\",\n  description: \"A\u00e7\u0131k sekmeleri kaydetmenizi ve yeniden a\u00e7man\u0131z\u0131 sa\u011flar.\",\n  manifest_version: 3,\n  permissions: [\"tabs\", \"storage\", \"windows\"], \/\/ Sekmelere, depolamaya ve pencere y\u00f6netimine eri\u015fim\n  action: {\n    default_popup: \"popup.html\",\n    default_icon: {\n      \"16\": \"icons\/icon16.png\",\n      \"48\": \"icons\/icon48.png\",\n      \"128\": \"icons\/icon128.png\"\n    }\n  },\n  icons: {\n    \"16\": \"icons\/icon16.png\",\n    \"48\": \"icons\/icon48.png\",\n    \"128\": \"icons\/icon128.png\"\n  },\n  background: {\n    service_worker: \"background.js\"\n  }\n};\n    <\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Chrome'un Manifest V3 modelinde, <code>background script<\/code>'ler art\u0131k Service Worker olarak \u00e7al\u0131\u015f\u0131r. Kiro, bu ge\u00e7i\u015fi sizin i\u00e7in otomatik olarak y\u00f6netir ve <code>background.js<\/code> dosyas\u0131n\u0131 bir Service Worker olarak derler. Bu, uzant\u0131n\u0131z\u0131n daha verimli ve g\u00fcvenli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.\n    <\/div>\n<p>Bu kod blo\u011funda, <code>backgroundScript<\/code> i\u00e7indeki <code>chrome.tabs.query<\/code> API'si ile mevcut sekmeleri al\u0131yoruz ve <code>chrome.storage.local.set<\/code> ile kaydediyoruz. <code>popup<\/code> i\u00e7erisindeki JavaScript kodu ise <code>chrome.runtime.sendMessage<\/code> ile bu arka plan beti\u011fiyle ileti\u015fim kurarak sekmeleri kaydediyor, listeliyor, a\u00e7\u0131yor veya siliyor. <code>manifest<\/code> dosyas\u0131nda ise <code>\"tabs\"<\/code>, <code>\"storage\"<\/code> ve <code>\"windows\"<\/code> izinlerini belirterek uzant\u0131m\u0131z\u0131n ihtiya\u00e7 duydu\u011fu yetkilendirmeleri sa\u011flad\u0131k.<\/p>\n<p>Bu vaka analizi, Kiro'nun tek dosya yetene\u011fini kullanarak karma\u015f\u0131k bir uzant\u0131 geli\u015ftirmeyi nas\u0131l kolayla\u015ft\u0131rd\u0131\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a g\u00f6stermektedir. T\u00fcm mant\u0131k, aray\u00fcz ve yap\u0131land\u0131rma bilgileri tek bir <code>index.ts<\/code> dosyas\u0131nda merkezile\u015ftirilmi\u015ftir. Kiro, bu dosyay\u0131 al\u0131p sorunsuz bir \u015fekilde bir Chrome uzant\u0131s\u0131 olarak derleyerek, geli\u015ftiricilerin sadece fikre ve kodu yazmaya odaklanmas\u0131n\u0131 sa\u011flar. Bu sayede, \"Sekme Kaydedici\" gibi verimlilik ara\u00e7lar\u0131n\u0131 \u00e7ok daha h\u0131zl\u0131 ve hatas\u0131z bir \u015fekilde hayata ge\u00e7irebilirsiniz.<\/p>\n<h2>Sonu\u00e7: Kiro ile Chrome Uzant\u0131 Geli\u015ftirmenin Gelece\u011fi<\/h2>\n<p>Chrome uzant\u0131lar\u0131, web taray\u0131c\u0131m\u0131z\u0131n sa\u011flad\u0131\u011f\u0131 deneyimi d\u00f6n\u00fc\u015ft\u00fcrme potansiyeline sahip k\u00fc\u00e7\u00fck ama g\u00fc\u00e7l\u00fc ara\u00e7lard\u0131r. Geleneksel olarak, bu uzant\u0131lar\u0131 geli\u015ftirmek karma\u015f\u0131k dosya yap\u0131land\u0131rmalar\u0131, birden fazla dosya t\u00fcr\u00fcn\u00fcn y\u00f6netimi ve \u00f6zel derleme s\u00fcre\u00e7leri nedeniyle zorlay\u0131c\u0131 olabilirdi. Ancak Kiro, modern bir yakla\u015f\u0131mla bu zorluklar\u0131n \u00fcstesinden gelerek, geli\u015ftiricilere tek bir JavaScript veya TypeScript dosyas\u0131ndan tam te\u015fekk\u00fcll\u00fc Chrome uzant\u0131lar\u0131 olu\u015fturma yetene\u011fi sunar. Bu rehberde, Kiro'nun temel kavramlar\u0131ndan ba\u015flayarak, basit bir \"Hello World\" popup'\u0131ndan, <code>content script<\/code> ve <code>background script<\/code> entegrasyonuna, modern geli\u015ftirme pratikleri (TypeScript, CSS ve asset y\u00f6netimi) ve ileri d\u00fczey optimizasyonlara kadar geni\u015f bir yelpazeyi ele ald\u0131k. Ayr\u0131ca, \"Sekme Kaydedici\" gibi ger\u00e7ek d\u00fcnya senaryolar\u0131nda Kiro'nun nas\u0131l kullan\u0131labilece\u011fini de g\u00f6rd\u00fck.<\/p>\n<p>Kiro'nun sundu\u011fu tek dosya felsefesi, canl\u0131 yeniden y\u00fckleme (hot-reloading) ile h\u0131zl\u0131 geli\u015ftirme d\u00f6ng\u00fcs\u00fc, TypeScript deste\u011fi, otomatik asset y\u00f6netimi ve NPM paketleriyle sorunsuz entegrasyon gibi \u00f6zellikler, uzant\u0131 geli\u015ftirme s\u00fcrecini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r ve basitle\u015ftirir. Art\u0131k geli\u015ftiriciler, karma\u015f\u0131k derleme yap\u0131land\u0131rmalar\u0131yla u\u011fra\u015fmak yerine, yarat\u0131c\u0131 fikirlerine ve uzant\u0131lar\u0131n\u0131n \u00e7ekirdek i\u015flevselli\u011fine daha fazla odaklanabilirler. Bu, hem deneyimli geli\u015ftiricilerin verimlili\u011fini art\u0131r\u0131r hem de yeni ba\u015flayanlar\u0131n Chrome uzant\u0131 d\u00fcnyas\u0131na daha kolay ad\u0131m atmas\u0131n\u0131 sa\u011flar. Kiro ile Chrome uzant\u0131 geli\u015ftirmenin gelece\u011fi, \u015f\u00fcphesiz daha h\u0131zl\u0131, daha ak\u0131c\u0131 ve daha keyifli olacak. Dijital d\u00fcnyay\u0131 \u015fekillendiren bu g\u00fc\u00e7l\u00fc ara\u00e7lar\u0131 kullanarak, kendi inovatif \u00e7\u00f6z\u00fcmlerinizi hayata ge\u00e7irmek i\u00e7in \u00f6n\u00fcn\u00fczde hi\u00e7bir engel kalmayacak.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt><strong>Kiro sadece Chrome uzant\u0131lar\u0131 i\u00e7in mi ge\u00e7erlidir?<\/strong><\/dt>\n<dd>\u015eu anki odak noktas\u0131 Chrome uzant\u0131lar\u0131d\u0131r. Ancak, Kiro'nun alt\u0131nda yatan prensipler ve mimari, di\u011fer Chromium tabanl\u0131 taray\u0131c\u0131lar (Edge, Brave vb.) ve potansiyel olarak Firefox gibi di\u011fer taray\u0131c\u0131lar i\u00e7in de uzant\u0131 geli\u015ftirmeye uyarlanabilir. Taray\u0131c\u0131 API'leri aras\u0131ndaki uyumluluk, bu entegrasyonun anahtar\u0131n\u0131 olu\u015fturur.<\/dd>\n<dt><strong>Kiro ile geli\u015ftirilen uzant\u0131lar Manifest V3'e uyumlu mu?<\/strong><\/dt>\n<dd>Evet, kesinlikle. Kiro, Manifest V3 standartlar\u0131na tam uyumlu uzant\u0131lar olu\u015fturur. Geli\u015fmi\u015f g\u00fcvenlik ve performans sunan Service Worker tabanl\u0131 arka plan betiklerini ve di\u011fer V3 gereksinimlerini otomatik olarak ele al\u0131r, b\u00f6ylece uyumluluk konusunda endi\u015felenmenize gerek kalmaz.<\/dd>\n<dt><strong>Kiro'yu kullanarak React veya Vue gibi modern framework'lerle uzant\u0131 geli\u015ftirebilir miyim?<\/strong><\/dt>\n<dd>Evet, Kiro, NPM paketlerini ve mod\u00fcler JavaScript\/TypeScript'i destekledi\u011fi i\u00e7in React, Vue veya Svelte gibi pop\u00fcler UI framework'lerini uzant\u0131lar\u0131n\u0131z\u0131n popup, options veya content script b\u00f6l\u00fcmlerinde kullanabilirsiniz. Kiro, bu framework'leri do\u011fru \u015fekilde derleyecek ve paketleyecektir. Bu, daha karma\u015f\u0131k ve etkile\u015fimli kullan\u0131c\u0131 aray\u00fczleri olu\u015fturman\u0131z\u0131 sa\u011flar.<\/dd>\n<dt><strong>Uzant\u0131mda harici API'lere istek g\u00f6nderebilir miyim?<\/strong><\/dt>\n<dd>Evet, uzant\u0131lar\u0131n\u0131zdan harici API'lere (\u00f6rne\u011fin bir web servisi) istek g\u00f6nderebilirsiniz. Bunun i\u00e7in <code>manifest.json<\/code> dosyan\u0131zda <code>\"permissions\"<\/code> alan\u0131na gerekli host izinlerini (\u00f6rne\u011fin <code>\"https:\/\/api.example.com\/*\"<\/code>) eklemeniz yeterlidir. Kiro, bu izinleri manifest dosyas\u0131na otomatik olarak ekleyecektir.<\/dd>\n<dt><strong>Kiro ile uzant\u0131m\u0131n g\u00fcncellemelerini nas\u0131l y\u00f6netirim?<\/strong><\/dt>\n<dd>Uzant\u0131n\u0131z\u0131 g\u00fcncelledi\u011finizde, <code>index.ts<\/code> dosyan\u0131zdaki <code>manifest<\/code> nesnesinde <code>\"version\"<\/code> numaras\u0131n\u0131 art\u0131rman\u0131z \u00f6nemlidir (\u00f6rne\u011fin, \"1.0\"dan \"1.1\"e). Ard\u0131ndan, <code>kiro build<\/code> komutuyla yeni bir <code>dist<\/code> klas\u00f6r\u00fc olu\u015fturup, Chrome Web Ma\u011fazas\u0131'na bu yeni s\u00fcr\u00fcm\u00fc y\u00fckleyebilirsiniz. Kullan\u0131c\u0131lar\u0131n taray\u0131c\u0131lar\u0131, otomatik olarak yeni s\u00fcr\u00fcm\u00fc alg\u0131layacak ve g\u00fcncelleyecektir.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Web taray\u0131c\u0131 uzant\u0131lar\u0131, dijital deneyimimizi ki\u015fiselle\u015ftirmenin ve geli\u015ftirmenin g\u00fc\u00e7l\u00fc bir yolunu sunar. Ancak, bir Chrome uzant\u0131s\u0131 geli\u015ftirmek genellikle&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-35639","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>Kiro ile Tek Dosyadan Tam Kapsaml\u0131 Chrome Uzant\u0131s\u0131na: Ad\u0131m Ad\u0131m Rehber<\/title>\n<meta name=\"description\" content=\"Web taray\u0131c\u0131 uzant\u0131lar\u0131, dijital deneyimimizi ki\u015fiselle\u015ftirmenin ve geli\u015ftirmenin g\u00fc\u00e7l\u00fc bir yolunu sunar. Ancak, bir Chrome uzant\u0131s\u0131 geli\u015ftirmek genellikle karma\u015f\u0131k bir yap\u0131land\u0131rma, \u00e7ok say\u0131da dosya ve \u00f6zel bir derleme s\u00fcreci gerektirebilir. Peki, ya bu s\u00fcreci basitle\u015ftiren, tek bir dosyadan tam i\u015flevsel bir uzant\u0131 olu\u015fturman\u0131za olanak tan\u0131yan bir ara\u00e7 olsayd\u0131? \u0130\u015fte tam da bu noktada Kiro devreye giriyor. Bu kapsaml\u0131 rehberde, Kiro kullanarak s\u0131f\u0131rdan, tek bir JavaScript veya TypeScript dosyas\u0131ndan ba\u015flayarak, tam te\u015fekk\u00fcll\u00fc bir Chrome uzant\u0131s\u0131n\u0131 nas\u0131l ad\u0131m ad\u0131m geli\u015ftirebilece\u011finizi, geli\u015fmi\u015f \u00f6zelliklerini ve ger\u00e7ek d\u00fcnya senaryolar\u0131ndaki uygulamalar\u0131n\u0131 ke\u015ffedece\u011fiz. Geleneksel uzant\u0131 geli\u015ftirme karma\u015fas\u0131na veda edip, modern ve ak\u0131c\u0131 bir yakla\u015f\u0131mla projelerinizi hayata ge\u00e7irmeye haz\u0131r olun!\" \/>\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\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kiro ile Tek Dosyadan Tam Kapsaml\u0131 Chrome Uzant\u0131s\u0131na: Ad\u0131m Ad\u0131m Rehber\" \/>\n<meta property=\"og:description\" content=\"Web taray\u0131c\u0131 uzant\u0131lar\u0131, dijital deneyimimizi ki\u015fiselle\u015ftirmenin ve geli\u015ftirmenin g\u00fc\u00e7l\u00fc bir yolunu sunar. Ancak, bir Chrome uzant\u0131s\u0131 geli\u015ftirmek genellikle karma\u015f\u0131k bir yap\u0131land\u0131rma, \u00e7ok say\u0131da dosya ve \u00f6zel bir derleme s\u00fcreci gerektirebilir. Peki, ya bu s\u00fcreci basitle\u015ftiren, tek bir dosyadan tam i\u015flevsel bir uzant\u0131 olu\u015fturman\u0131za olanak tan\u0131yan bir ara\u00e7 olsayd\u0131? \u0130\u015fte tam da bu noktada Kiro devreye giriyor. Bu kapsaml\u0131 rehberde, Kiro kullanarak s\u0131f\u0131rdan, tek bir JavaScript veya TypeScript dosyas\u0131ndan ba\u015flayarak, tam te\u015fekk\u00fcll\u00fc bir Chrome uzant\u0131s\u0131n\u0131 nas\u0131l ad\u0131m ad\u0131m geli\u015ftirebilece\u011finizi, geli\u015fmi\u015f \u00f6zelliklerini ve ger\u00e7ek d\u00fcnya senaryolar\u0131ndaki uygulamalar\u0131n\u0131 ke\u015ffedece\u011fiz. Geleneksel uzant\u0131 geli\u015ftirme karma\u015fas\u0131na veda edip, modern ve ak\u0131c\u0131 bir yakla\u015f\u0131mla projelerinizi hayata ge\u00e7irmeye haz\u0131r olun!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-02T01:31:17+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=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Kiro ile Tek Dosyadan Tam Kapsaml\u0131 Chrome Uzant\u0131s\u0131na: Ad\u0131m Ad\u0131m Rehber\",\"datePublished\":\"2025-12-02T01:31:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/\"},\"wordCount\":4560,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/\",\"name\":\"Kiro ile Tek Dosyadan Tam Kapsaml\u0131 Chrome Uzant\u0131s\u0131na: Ad\u0131m Ad\u0131m Rehber\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-02T01:31:17+00:00\",\"description\":\"Web taray\u0131c\u0131 uzant\u0131lar\u0131, dijital deneyimimizi ki\u015fiselle\u015ftirmenin ve geli\u015ftirmenin g\u00fc\u00e7l\u00fc bir yolunu sunar. Ancak, bir Chrome uzant\u0131s\u0131 geli\u015ftirmek genellikle karma\u015f\u0131k bir yap\u0131land\u0131rma, \u00e7ok say\u0131da dosya ve \u00f6zel bir derleme s\u00fcreci gerektirebilir. Peki, ya bu s\u00fcreci basitle\u015ftiren, tek bir dosyadan tam i\u015flevsel bir uzant\u0131 olu\u015fturman\u0131za olanak tan\u0131yan bir ara\u00e7 olsayd\u0131? \u0130\u015fte tam da bu noktada Kiro devreye giriyor. Bu kapsaml\u0131 rehberde, Kiro kullanarak s\u0131f\u0131rdan, tek bir JavaScript veya TypeScript dosyas\u0131ndan ba\u015flayarak, tam te\u015fekk\u00fcll\u00fc bir Chrome uzant\u0131s\u0131n\u0131 nas\u0131l ad\u0131m ad\u0131m geli\u015ftirebilece\u011finizi, geli\u015fmi\u015f \u00f6zelliklerini ve ger\u00e7ek d\u00fcnya senaryolar\u0131ndaki uygulamalar\u0131n\u0131 ke\u015ffedece\u011fiz. Geleneksel uzant\u0131 geli\u015ftirme karma\u015fas\u0131na veda edip, modern ve ak\u0131c\u0131 bir yakla\u015f\u0131mla projelerinizi hayata ge\u00e7irmeye haz\u0131r olun!\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kiro ile Tek Dosyadan Tam Kapsaml\u0131 Chrome Uzant\u0131s\u0131na: Ad\u0131m Ad\u0131m Rehber\"}]},{\"@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":"Kiro ile Tek Dosyadan Tam Kapsaml\u0131 Chrome Uzant\u0131s\u0131na: Ad\u0131m Ad\u0131m Rehber","description":"Web taray\u0131c\u0131 uzant\u0131lar\u0131, dijital deneyimimizi ki\u015fiselle\u015ftirmenin ve geli\u015ftirmenin g\u00fc\u00e7l\u00fc bir yolunu sunar. Ancak, bir Chrome uzant\u0131s\u0131 geli\u015ftirmek genellikle karma\u015f\u0131k bir yap\u0131land\u0131rma, \u00e7ok say\u0131da dosya ve \u00f6zel bir derleme s\u00fcreci gerektirebilir. Peki, ya bu s\u00fcreci basitle\u015ftiren, tek bir dosyadan tam i\u015flevsel bir uzant\u0131 olu\u015fturman\u0131za olanak tan\u0131yan bir ara\u00e7 olsayd\u0131? \u0130\u015fte tam da bu noktada Kiro devreye giriyor. Bu kapsaml\u0131 rehberde, Kiro kullanarak s\u0131f\u0131rdan, tek bir JavaScript veya TypeScript dosyas\u0131ndan ba\u015flayarak, tam te\u015fekk\u00fcll\u00fc bir Chrome uzant\u0131s\u0131n\u0131 nas\u0131l ad\u0131m ad\u0131m geli\u015ftirebilece\u011finizi, geli\u015fmi\u015f \u00f6zelliklerini ve ger\u00e7ek d\u00fcnya senaryolar\u0131ndaki uygulamalar\u0131n\u0131 ke\u015ffedece\u011fiz. Geleneksel uzant\u0131 geli\u015ftirme karma\u015fas\u0131na veda edip, modern ve ak\u0131c\u0131 bir yakla\u015f\u0131mla projelerinizi hayata ge\u00e7irmeye haz\u0131r olun!","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\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Kiro ile Tek Dosyadan Tam Kapsaml\u0131 Chrome Uzant\u0131s\u0131na: Ad\u0131m Ad\u0131m Rehber","og_description":"Web taray\u0131c\u0131 uzant\u0131lar\u0131, dijital deneyimimizi ki\u015fiselle\u015ftirmenin ve geli\u015ftirmenin g\u00fc\u00e7l\u00fc bir yolunu sunar. Ancak, bir Chrome uzant\u0131s\u0131 geli\u015ftirmek genellikle karma\u015f\u0131k bir yap\u0131land\u0131rma, \u00e7ok say\u0131da dosya ve \u00f6zel bir derleme s\u00fcreci gerektirebilir. Peki, ya bu s\u00fcreci basitle\u015ftiren, tek bir dosyadan tam i\u015flevsel bir uzant\u0131 olu\u015fturman\u0131za olanak tan\u0131yan bir ara\u00e7 olsayd\u0131? \u0130\u015fte tam da bu noktada Kiro devreye giriyor. Bu kapsaml\u0131 rehberde, Kiro kullanarak s\u0131f\u0131rdan, tek bir JavaScript veya TypeScript dosyas\u0131ndan ba\u015flayarak, tam te\u015fekk\u00fcll\u00fc bir Chrome uzant\u0131s\u0131n\u0131 nas\u0131l ad\u0131m ad\u0131m geli\u015ftirebilece\u011finizi, geli\u015fmi\u015f \u00f6zelliklerini ve ger\u00e7ek d\u00fcnya senaryolar\u0131ndaki uygulamalar\u0131n\u0131 ke\u015ffedece\u011fiz. Geleneksel uzant\u0131 geli\u015ftirme karma\u015fas\u0131na veda edip, modern ve ak\u0131c\u0131 bir yakla\u015f\u0131mla projelerinizi hayata ge\u00e7irmeye haz\u0131r olun!","og_url":"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-02T01:31:17+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Kiro ile Tek Dosyadan Tam Kapsaml\u0131 Chrome Uzant\u0131s\u0131na: Ad\u0131m Ad\u0131m Rehber","datePublished":"2025-12-02T01:31:17+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/"},"wordCount":4560,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/","name":"Kiro ile Tek Dosyadan Tam Kapsaml\u0131 Chrome Uzant\u0131s\u0131na: Ad\u0131m Ad\u0131m Rehber","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-02T01:31:17+00:00","description":"Web taray\u0131c\u0131 uzant\u0131lar\u0131, dijital deneyimimizi ki\u015fiselle\u015ftirmenin ve geli\u015ftirmenin g\u00fc\u00e7l\u00fc bir yolunu sunar. Ancak, bir Chrome uzant\u0131s\u0131 geli\u015ftirmek genellikle karma\u015f\u0131k bir yap\u0131land\u0131rma, \u00e7ok say\u0131da dosya ve \u00f6zel bir derleme s\u00fcreci gerektirebilir. Peki, ya bu s\u00fcreci basitle\u015ftiren, tek bir dosyadan tam i\u015flevsel bir uzant\u0131 olu\u015fturman\u0131za olanak tan\u0131yan bir ara\u00e7 olsayd\u0131? \u0130\u015fte tam da bu noktada Kiro devreye giriyor. Bu kapsaml\u0131 rehberde, Kiro kullanarak s\u0131f\u0131rdan, tek bir JavaScript veya TypeScript dosyas\u0131ndan ba\u015flayarak, tam te\u015fekk\u00fcll\u00fc bir Chrome uzant\u0131s\u0131n\u0131 nas\u0131l ad\u0131m ad\u0131m geli\u015ftirebilece\u011finizi, geli\u015fmi\u015f \u00f6zelliklerini ve ger\u00e7ek d\u00fcnya senaryolar\u0131ndaki uygulamalar\u0131n\u0131 ke\u015ffedece\u011fiz. Geleneksel uzant\u0131 geli\u015ftirme karma\u015fas\u0131na veda edip, modern ve ak\u0131c\u0131 bir yakla\u015f\u0131mla projelerinizi hayata ge\u00e7irmeye haz\u0131r olun!","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/kiro-ile-tek-dosyadan-tam-kapsamli-chrome-uzantisina-adim-adim-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Kiro ile Tek Dosyadan Tam Kapsaml\u0131 Chrome Uzant\u0131s\u0131na: Ad\u0131m Ad\u0131m Rehber"}]},{"@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\/35639","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=35639"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35639\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35639"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35639"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}