Sağlam bir JavaScript performans altyapısı oluşturmak için metrikleri, araçları ve uygulama stratejilerini kapsayan, web uygulaması performansını iyileştirmeye yönelik pratik bir rehber.
JavaScript Performans Altyapısı: Bir Uygulama Çerçevesi
Günümüzün rekabetçi dijital dünyasında, web sitesi ve web uygulaması performansı her şeyden önemlidir. Yavaş yükleme süreleri, takılan animasyonlar ve yanıt vermeyen arayüzler, kullanıcıların hayal kırıklığına uğramasına, etkileşimin azalmasına ve nihayetinde gelir kaybına yol açabilir. İyi tasarlanmış bir JavaScript performans altyapısı, performans darboğazlarını belirlemek, teşhis etmek ve çözmek için kritik öneme sahiptir ve sorunsuz ve keyifli bir kullanıcı deneyimi sağlar. Bu kılavuz, temel metrikleri, gerekli araçları ve pratik uygulama stratejilerini kapsayarak böyle bir altyapı oluşturmak için kapsamlı bir çerçeve sunmaktadır.
Neden Bir JavaScript Performans Altyapısına Yatırım Yapmalısınız?
Ayrıntılara girmeden önce, sağlam bir performans altyapısına yatırım yapmanın faydalarını anlayalım:
- İyileştirilmiş Kullanıcı Deneyimi (UX): Daha hızlı yükleme süreleri ve daha akıcı etkileşimler, doğrudan daha iyi bir kullanıcı deneyimine dönüşerek kullanıcı memnuniyetini ve bağlılığını artırır. Örneğin, Google tarafından yapılan bir araştırma, sayfaların yüklenmesi 3 saniyeden uzun sürerse mobil site ziyaretlerinin %53'ünün terk edildiğini bulmuştur.
- Artan Dönüşüm Oranları: Hızlı ve duyarlı bir web sitesi, kullanıcıları bir satın alma işlemi yapma, bir form doldurma veya bir bültene kaydolma gibi istenen eylemleri tamamlamaya teşvik eder. Amazon, sayfa yükleme süresindeki her 100 milisaniyelik iyileşmeye %1'lik bir gelir artışı atfettiğiyle ünlüdür.
- Daha İyi Arama Motoru Optimizasyonu (SEO): Google gibi arama motorları, iyi performansa sahip web sitelerine öncelik verir ve onları arama sonuçlarında daha yüksek sıralamalarla ödüllendirir. Yükleme hızını, etkileşimi ve görsel kararlılığı ölçen Core Web Vitals (Önemli Web Verileri), artık önemli bir sıralama faktörüdür.
- Azaltılmış Altyapı Maliyetleri: Optimize edilmiş kod ve verimli kaynak kullanımı, sunucu yükünü, bant genişliği tüketimini ve genel altyapı maliyetlerini azaltabilir.
- Daha Hızlı Pazara Sunma Süresi: İyi kurulmuş bir performans testi ve izleme sistemi, geliştiricilerin performans gerilemelerini hızla belirlemesine ve çözmesine olanak tanıyarak geliştirme döngüsünü hızlandırır ve yeni özelliklerin pazara sunulma süresini kısaltır.
- Veri Odaklı Optimizasyon: Kapsamlı performans verileriyle ekipler, uygulamanın hangi alanlarının optimize edileceği konusunda bilinçli kararlar alabilir ve çabalarının en büyük etkiyi yaratacak alanlara odaklanmasını sağlayabilir.
Takip Edilecek Temel Performans Metrikleri
Herhangi bir performans altyapısının temeli, temel performans metriklerini doğru bir şekilde ölçme ve izleme yeteneğidir. İşte dikkate alınması gereken bazı temel metrikler:
Ön Uç Metrikleri
- İlk Zengin İçerikli Boyama (FCP - First Contentful Paint): Ekranda ilk içerik parçasının (metin, resim vb.) görüntülenmesi için geçen süreyi ölçer. İyi bir FCP skoru 1.8 saniyenin altındadır.
- En Büyük Zengin İçerikli Boyama (LCP - Largest Contentful Paint): Ekranda en büyük içerik öğesinin (örneğin, bir ana görsel) görüntülenmesi için geçen süreyi ölçer. İyi bir LCP skoru 2.5 saniyenin altındadır.
- İlk Girdi Gecikmesi (FID - First Input Delay): Tarayıcının ilk kullanıcı etkileşimine (örneğin, bir düğmeye tıklama veya bir bağlantıya dokunma) yanıt vermesi için geçen süreyi ölçer. İyi bir FID skoru 100 milisaniyenin altındadır.
- Kümülatif Düzen Kayması (CLS - Cumulative Layout Shift): Sayfanın görsel kararlılığını ölçer. Sayfa yükleme sürecinde meydana gelen beklenmedik düzen kaymalarının miktarını ölçer. İyi bir CLS skoru 0.1'in altındadır.
- Etkileşime Hazır Olma Süresi (TTI - Time to Interactive): Sayfanın tamamen etkileşimli hale gelmesi, yani kullanıcının sayfadaki tüm öğelerle güvenilir bir şekilde etkileşime girebilmesi için geçen süreyi ölçer.
- Toplam Engelleme Süresi (TBT - Total Blocking Time): Sayfa yükleme işlemi sırasında ana iş parçacığının engellendiği ve kullanıcı etkileşimini önlediği toplam süreyi ölçer.
- Sayfa Yükleme Süresi: Sayfanın tamamen yüklenmesi ve oluşturulması için geçen toplam süre.
- Kaynak Yükleme Süreleri: Resimler, betikler ve stil sayfaları gibi tekil kaynakların yüklenmesi için geçen süre.
- JavaScript Yürütme Süresi: Kodun ayrıştırılması, derlenmesi ve çalıştırılması da dahil olmak üzere JavaScript kodunun yürütülmesi için geçen süre.
- Bellek Kullanımı: JavaScript kodunun kullandığı bellek miktarı.
- Saniye Başına Kare Sayısı (FPS): Animasyonların ve geçişlerin akıcılığını ölçer. Akıcı bir kullanıcı deneyimi için genellikle 60 FPS hedefi istenir.
Arka Uç Metrikleri
- Yanıt Süresi: Sunucunun bir isteğe yanıt vermesi için geçen süre.
- İş Çıktısı (Throughput): Sunucunun saniyede işleyebileceği istek sayısı.
- Hata Oranı: Hata ile sonuçlanan isteklerin yüzdesi.
- CPU Kullanımı: Sunucunun kullandığı CPU kaynaklarının yüzdesi.
- Bellek Kullanımı: Sunucunun kullandığı bellek miktarı.
- Veritabanı Sorgu Süresi: Veritabanı sorgularının yürütülmesi için geçen süre.
Performans İzleme ve Optimizasyon için Gerekli Araçlar
JavaScript performansını izlemeye ve optimize etmeye yardımcı olacak çeşitli araçlar mevcuttur. İşte en popüler ve etkili seçeneklerden bazıları:
Tarayıcı Geliştirici Araçları
Modern tarayıcılar, JavaScript kodunu profillemek, ağ isteklerini analiz etmek ve performans darboğazlarını belirlemek için kullanılabilecek güçlü geliştirici araçları sağlar. Bu araçlara genellikle F12'ye (veya macOS'ta Cmd+Opt+I) basılarak erişilir. Temel özellikler şunları içerir:
- Performans Sekmesi: CPU kullanımı, bellek ayırma ve oluşturma süreleri dahil olmak üzere uygulamanızın performansını kaydetmenize ve analiz etmenize olanak tanır.
- Ağ Sekmesi: Yükleme süreleri, başlıklar ve yanıt gövdeleri dahil olmak üzere ağ istekleri hakkında ayrıntılı bilgi sağlar.
- Konsol Sekmesi: JavaScript hatalarını ve uyarılarını görüntüler, ayrıca JavaScript kodunu yürütmenize ve değişkenleri incelemenize olanak tanır.
- Bellek Sekmesi: Bellek kullanımını izlemenize ve bellek sızıntılarını belirlemenize olanak tanır.
- Lighthouse (Chrome Geliştirici Araçları'nda): Web sayfalarının performansını, erişilebilirliğini, SEO'sunu ve en iyi uygulamalarını denetleyen otomatik bir araçtır. Sayfa performansını iyileştirmek için eyleme geçirilebilir öneriler sunar.
Gerçek Kullanıcı İzleme (RUM) Araçları
RUM araçları, gerçek kullanıcılardan gerçek dünya koşullarında performans verileri toplayarak gerçek kullanıcı deneyimine dair değerli bilgiler sağlar. Örnekler şunları içerir:
- New Relic: Hem ön uç hem de arka uç uygulamaları için ayrıntılı performans verileri sağlayan kapsamlı bir izleme platformudur.
- Datadog: New Relic'e benzer özellikler sunan ve çok çeşitli diğer araçlar ve hizmetlerle entegrasyonlar sağlayan bir başka popüler izleme platformudur.
- Sentry: Öncelikle hata takibi ile bilinmesine rağmen, Sentry aynı zamanda performans izleme yetenekleri de sunarak hataları performans sorunlarıyla ilişkilendirmenize olanak tanır.
- Raygun: Performans sorunlarına ilişkin eyleme geçirilebilir bilgiler sağlamaya odaklanan kullanıcı dostu bir izleme platformudur.
- Google Analytics: Öncelikle web sitesi analizi için kullanılsa da, Google Analytics sayfa yükleme süresi ve hemen çıkma oranı gibi bazı temel performans metrikleri de sağlar. Ancak, daha ayrıntılı performans izlemesi için özel bir RUM aracı kullanılması önerilir.
Sentetik İzleme Araçları
Sentetik izleme araçları, gerçek kullanıcıları etkilemeden önce performans sorunlarını proaktif olarak belirlemek için kullanıcı etkileşimlerini simüle eder. Bu araçlar, dünyanın dört bir yanındaki farklı konumlardan düzenli bir programda testler çalıştıracak şekilde yapılandırılabilir. Örnekler şunları içerir:
- WebPageTest: Bir web sayfasının performansını farklı konumlardan ve tarayıcılardan test etmenizi sağlayan ücretsiz ve açık kaynaklı bir araçtır.
- Pingdom: Çalışma süresi izleme, performans izleme ve gerçek kullanıcı izleme sağlayan bir web sitesi izleme hizmetidir.
- GTmetrix: Web sitesi performansını analiz etmek ve iyileştirme için öneriler sunmak için popüler bir araçtır.
- Lighthouse CI: Performans gerilemelerini otomatik olarak izlemek ve önlemek için Lighthouse denetimlerini CI/CD hattınıza entegre eder.
Profil Oluşturma Araçları
Profil oluşturma araçları, JavaScript kodunun yürütülmesi hakkında ayrıntılı bilgi sağlayarak performans darboğazlarını belirlemenize ve daha hızlı yürütme için kodu optimize etmenize olanak tanır. Örnekler şunları içerir:
- Chrome Geliştirici Araçları Profiler: Chrome Geliştirici Araçları'nda yer alan ve JavaScript kodunun performansını kaydetmenize ve analiz etmenize olanak tanıyan yerleşik bir profil oluşturucudur.
- Node.js Profiler: Node.js, sunucu tarafı JavaScript kodunu profil oluşturmak için kullanılabilecek yerleşik bir profil oluşturucu sağlar.
- V8 Profiler: V8 JavaScript motoru, JavaScript kodunun yürütülmesi hakkında daha ayrıntılı bilgi edinmek için kullanılabilecek kendi profil oluşturucusunu sağlar.
Paketleme ve Küçültme Araçları
Bu araçlar, birden çok dosyayı tek bir dosyada birleştirerek ve dosya boyutunu küçültmek için gereksiz karakterleri (örneğin, boşluk, yorumlar) kaldırarak JavaScript kodunu optimize eder. Örnekler şunları içerir:
- Webpack: JavaScript, CSS ve diğer varlıkları paketlemek için kullanılabilecek popüler bir modül paketleyicisidir.
- Parcel: Kullanımı kolay ve hızlı derleme süreleri sağlayan sıfır yapılandırmalı bir paketleyicidir.
- Rollup: Özellikle JavaScript kütüphaneleri ve çerçeveleri oluşturmak için çok uygun bir modül paketleyicisidir.
- esbuild: Go dilinde yazılmış son derece hızlı bir JavaScript paketleyicisi ve küçültücüsüdür.
- Terser: Bir JavaScript ayrıştırıcı, karıştırıcı ve sıkıştırıcı araç takımıdır.
Kod Analiz Araçları
Bu araçlar, olası performans sorunlarını belirlemek ve kodlama standartlarını uygulamak için JavaScript kodunu analiz eder. Örnekler şunları içerir:
- ESLint: Kodlama standartlarını uygulamak ve olası hataları belirlemek için kullanılabilecek popüler bir JavaScript linter'ıdır.
- JSHint: ESLint'e benzer işlevsellik sağlayan bir başka popüler JavaScript linter'ıdır.
- SonarQube: Kod kalitesinin sürekli denetimi için bir platformdur.
Uygulama Çerçevesi: Adım Adım Bir Kılavuz
Sağlam bir JavaScript performans altyapısı oluşturmak, dikkatli planlama, uygulama ve sürekli izleme gerektiren yinelemeli bir süreçtir. İşte çabalarınıza rehberlik edecek adım adım bir çerçeve:
1. Performans Hedeflerini ve Amaçlarını Tanımlayın
Net ve ölçülebilir performans hedefleri ve amaçları tanımlayarak başlayın. Bu hedefler, genel iş hedeflerinizle ve kullanıcı beklentilerinizle uyumlu olmalıdır. Örneğin:
- Sayfa yükleme süresini %20 azaltmak.
- İlk Zengin İçerikli Boyama'yı (FCP) 1.8 saniyenin altına düşürmek.
- İlk Girdi Gecikmesi'ni (FID) 100 milisaniyenin altına düşürmek.
- Web sitesi dönüşüm oranlarını %5 artırmak.
- Hata oranlarını %10 azaltmak.
2. Doğru Araçları Seçin
İhtiyaçlarınıza ve bütçenize en uygun araçları seçin. Araçları seçerken aşağıdaki faktörleri göz önünde bulundurun:
- Özellikler: Araç, performansı izlemek ve optimize etmek için ihtiyacınız olan özellikleri sağlıyor mu?
- Kullanım Kolaylığı: Aracın kullanımı ve yapılandırılması kolay mı?
- Entegrasyon: Araç, mevcut geliştirme ve dağıtım iş akışınızla entegre oluyor mu?
- Maliyet: Aracın maliyeti nedir ve bütçeniz dahilinde mi?
- Ölçeklenebilirlik: Araç, artan ihtiyaçlarınızı karşılayacak şekilde ölçeklenebilir mi?
İyi bir başlangıç noktası, ilk analiz için tarayıcı geliştirici araçlarından yararlanmak ve ardından daha kapsamlı bir görünüm için RUM ve sentetik izleme araçlarıyla desteklemektir.
3. Performans İzlemeyi Uygulayın
Seçtiğiniz araçları kullanarak performans izlemeyi uygulayın. Bu şunları içerir:
- Uygulamanızı enstrümante etmek: Performans verilerini toplamak için uygulamanıza kod eklemek. Bu, RUM araçlarını kullanmayı veya temel metrikleri izlemek için manuel olarak kod eklemeyi içerebilir.
- İzleme araçlarınızı yapılandırmak: İhtiyacınız olan verileri toplamak için izleme araçlarınızı ayarlamak.
- Uyarılar ayarlamak: Performans sorunları ortaya çıktığında sizi bilgilendirmek için uyarılar yapılandırmak. Örneğin, sayfa yükleme süresi belirli bir eşiği aştığında veya hata oranları önemli ölçüde arttığında sizi bilgilendirecek uyarılar ayarlayabilirsiniz.
4. Performans Verilerini Analiz Edin
Performans darboğazlarını ve iyileştirme alanlarını belirlemek için topladığınız performans verilerini düzenli olarak analiz edin. Bu şunları içerir:
- Yavaş yüklenen sayfaları belirlemek: Beklenenden daha uzun sürede yüklenen sayfaları belirlemek.
- Yavaş yüklenen kaynakları belirlemek: Beklenenden daha uzun sürede yüklenen kaynakları (örneğin, resimler, betikler, stil sayfaları) belirlemek.
- JavaScript performans darboğazlarını belirlemek: Performans sorunlarına neden olan JavaScript kodunu belirlemek.
- Sunucu tarafı performans darboğazlarını belirlemek: Performans sorunlarına neden olan sunucu tarafı kodunu veya veritabanı sorgularını belirlemek.
Belirli performans sorunlarına derinlemesine inmek ve kök nedeni belirlemek için tarayıcı geliştirici araçlarını ve profil oluşturma araçlarını kullanın.
5. Kodunuzu ve Altyapınızı Optimize Edin
Belirlediğiniz performans sorunlarını gidermek için kodunuzu ve altyapınızı optimize edin. Bu şunları içerebilir:
- Görüntüleri optimize etmek: Görüntüleri sıkıştırmak, uygun görüntü formatlarını kullanmak ve duyarlı görüntüler kullanmak.
- JavaScript ve CSS'yi küçültmek: Dosya boyutunu küçültmek için JavaScript ve CSS dosyalarından gereksiz karakterleri kaldırmak.
- JavaScript dosyalarını birleştirmek (bundle): HTTP isteklerinin sayısını azaltmak için birden çok JavaScript dosyasını tek bir dosyada birleştirmek.
- Kod Bölme (Code Splitting): Uygulamanızın her sayfası veya bölümü için yalnızca gerekli JavaScript kodunu yüklemek.
- İçerik Dağıtım Ağı (CDN) kullanmak: Farklı coğrafi konumlardaki kullanıcılar için yükleme sürelerini iyileştirmek üzere statik varlıklarınızı (örneğin, resimler, betikler, stil sayfaları) dünya çapında birden çok sunucuya dağıtmak.
- Önbelleğe Alma (Caching): Sunucuya yapılan istek sayısını azaltmak için statik varlıkları tarayıcıda ve sunucuda önbelleğe almak.
- Veritabanı sorgularını optimize etmek: Sorgu performansını iyileştirmek için veritabanı sorgularını optimize etmek.
- Sunucu donanımını yükseltmek: Sunucu performansını iyileştirmek için sunucu donanımını yükseltmek.
- Daha hızlı bir web sunucusu kullanmak: Nginx veya Apache gibi daha hızlı bir web sunucusuna geçmek.
- Görüntüleri ve diğer kaynakları tembel yükleme (lazy loading): Kritik olmayan kaynakların yüklenmesini, ihtiyaç duyulana kadar ertelemek.
- Kullanılmayan JavaScript ve CSS'yi kaldırmak: Tarayıcının indirmesi, ayrıştırması ve yürütmesi gereken kod miktarını azaltmak.
6. Değişikliklerinizi Test Edin ve Doğrulayın
İstenen etkiyi yarattıklarından ve herhangi bir yeni performans sorunu yaratmadıklarından emin olmak için değişikliklerinizi test edin ve doğrulayın. Bu şunları içerir:
- Performans testleri çalıştırmak: Değişikliklerinizin performans metrikleri üzerindeki etkisini ölçmek için performans testleri çalıştırmak.
- Sentetik izleme kullanmak: Gerçek kullanıcıları etkilemeden önce performans sorunlarını proaktif olarak belirlemek için sentetik izleme araçlarını kullanmak.
- Gerçek kullanıcı verilerini izlemek: Değişikliklerinizin kullanıcı deneyimini iyileştirdiğinden emin olmak için gerçek kullanıcı verilerini izlemek.
7. Performans Testini ve İzlemeyi Otomatikleştirin
Performansın zamanla en uygun düzeyde kalmasını sağlamak için performans testini ve izlemeyi otomatikleştirin. Bu şunları içerir:
- Performans testini CI/CD hattınıza entegre etmek: Derleme ve dağıtım sürecinizin bir parçası olarak otomatik olarak performans testleri çalıştırmak.
- Otomatik uyarılar ayarlamak: Performans sorunları ortaya çıktığında sizi bilgilendirmek için otomatik uyarılar yapılandırmak.
- Düzenli performans incelemeleri planlamak: Eğilimleri ve iyileştirme alanlarını belirlemek için performans verilerini düzenli olarak gözden geçirmek.
8. Yineleyin ve İyileştirin
Performans optimizasyonu sürekli bir süreçtir. Topladığınız verilere ve aldığınız geri bildirimlere dayanarak performans altyapınızı sürekli olarak yineleyin ve iyileştirin. Performans hedeflerinizi ve amaçlarınızı düzenli olarak gözden geçirin ve stratejinizi gerektiği gibi ayarlayın.
JavaScript Performans Optimizasyonu için Gelişmiş Teknikler
Temel optimizasyon stratejilerinin ötesinde, çeşitli gelişmiş teknikler JavaScript performansını daha da artırabilir:
- Web Workers: Ana iş parçacığını engellemeyi önlemek ve kullanıcı arayüzü yanıt verebilirliğini iyileştirmek için hesaplama açısından yoğun görevleri arka plan iş parçacıklarına yükleyin. Örneğin, görüntü işleme, veri analizi veya karmaşık hesaplamalar bir Web Worker'da gerçekleştirilebilir.
- Service Workers: Çevrimdışı işlevsellik, önbelleğe alma ve anlık bildirimleri etkinleştirin. Service Worker'lar ağ isteklerini kesebilir ve önbelleğe alınmış içeriği sunarak sayfa yükleme sürelerini iyileştirebilir ve özellikle zayıf ağ bağlantısı olan alanlarda daha güvenilir bir kullanıcı deneyimi sağlayabilir.
- WebAssembly (Wasm): Diğer dillerde (örneğin, C++, Rust) yazılmış kodu, tarayıcıda neredeyse yerel performansla yürütülebilen ikili bir talimat formatı olan WebAssembly'ye derleyin. Bu, özellikle oyun, video düzenleme veya bilimsel simülasyonlar gibi hesaplama açısından yoğun görevler için kullanışlıdır.
- Sanallaştırma (örn. React'in `react-window`, `react-virtualized`): Yalnızca ekranda görünen öğeleri oluşturarak büyük listeleri veya tabloları verimli bir şekilde işleyin. Bu teknik, büyük veri kümeleriyle uğraşırken performansı önemli ölçüde artırır.
- Debouncing ve Throttling: Kaydırma, yeniden boyutlandırma veya tuşa basma gibi olaylara yanıt olarak işlevlerin yürütülme hızını sınırlayın. Debouncing, bir işlevin yürütülmesini belirli bir hareketsizlik süresinden sonraya ertelerken, throttling bir işlevin yürütülmesini dönem başına belirli bir sayıyla sınırlar.
- Memoization: Pahalı işlev çağrılarının sonuçlarını önbelleğe alın ve aynı girdiler tekrar sağlandığında bunları yeniden kullanın. Bu, aynı argümanlarla sık sık çağrılan işlevler için performansı önemli ölçüde artırabilir.
- Tree Shaking: JavaScript paketlerinden kullanılmayan kodu eleyin. Webpack, Parcel ve Rollup gibi modern paketleyiciler, ölü kodu otomatik olarak kaldırabilir, paketin boyutunu küçültebilir ve yükleme sürelerini iyileştirebilir.
- Önceden Getirme ve Önceden Yükleme (Prefetching ve Preloading): Tarayıcıya gelecekte ihtiyaç duyulacak kaynakları getirmesi için ipucu verin. Prefetching, sonraki sayfalarda ihtiyaç duyulması muhtemel olan kaynakları getirirken, preloading mevcut sayfada ihtiyaç duyulan ancak oluşturma sürecinin ilerleyen aşamalarına kadar keşfedilmeyen kaynakları getirir.
Sonuç
Sağlam bir JavaScript performans altyapısı oluşturmak, kullanıcılarına değer sunmak için web uygulamalarına güvenen her kuruluş için kritik bir yatırımdır. Doğru araçları dikkatli bir şekilde seçerek, etkili izleme uygulamalarını uygulayarak ve kodu ve altyapıyı sürekli olarak optimize ederek, etkileşimi, dönüşümleri ve nihayetinde iş başarısını artıran hızlı, duyarlı ve keyifli bir kullanıcı deneyimi sağlayabilirsiniz. Performans optimizasyonunun tek seferlik bir görev olmadığını, sürekli dikkat ve iyileştirme gerektiren devam eden bir süreç olduğunu unutmayın. Veri odaklı bir yaklaşımı benimseyerek ve sürekli olarak performansı iyileştirmenin yeni yollarını arayarak, rekabette bir adım önde olabilir ve gerçekten olağanüstü bir kullanıcı deneyimi sunabilirsiniz.
Bu kapsamlı kılavuz, bir JavaScript performans altyapısı oluşturmak ve sürdürmek için bir çerçeve sunmaktadır. Bu adımları izleyerek ve bunları özel ihtiyaçlarınıza uyarlayarak, günümüz kullanıcılarının taleplerini karşılayan yüksek performanslı bir web uygulaması oluşturabilirsiniz.