B2B Bayi ve CRM Sistemlerinde Veri Güvenliği ve KVKK Uyumluluğu
Kapalı devre çalışan şirket içi panellerde role tabanlı yetkilendirme (RBAC), SQL injection koruması ve veri şifreleme yöntemleri.
Yazıyı Oku ➔Google’ın hız kriterlerinde yeni standart INP (Interaction to Next Paint) oldu. Sayfanızın yalnızca hızlı yüklenmesi artık yetmiyor; kullanıcının tıkladığı butona, açtığı menüye ya da doldurduğu forma milisaniyeler içinde görsel yanıt vermesi gerekiyor. Bu yazıda INP’nin ne olduğunu, nasıl ölçüldüğünü ve INP optimizasyonu için uyguladığımız teknikleri kod örnekleriyle anlatıyoruz.
tufiworks olarak gereksiz script yüklerini temizleyerek ve asenkron veri akışları kurgulayarak web sitelerini performans zirvesine taşıyoruz. Aşağıda bu sürecin arkasındaki yöntemleri adım adım bulabilirsiniz.
Interaction to Next Paint, bir kullanıcının sayfayla etkileşime geçmesi (tıklama, dokunma veya klavye tuşuna basma) ile tarayıcının bu etkileşimin sonucunu ekrana çizmesi arasında geçen süreyi ölçen bir metriktir. INP, sayfa ziyareti boyunca gerçekleşen etkileşimleri gözlemler ve en yavaş etkileşimlerden birini (çok sayıda etkileşim olan sayfalarda aşırı uç değerler göz ardı edilerek) sayfanın genel yanıt verme skoru olarak raporlar.
Google, Mart 2024’te INP’yi Core Web Vitals setine dahil etti ve yalnızca ilk etkileşimin gecikmesini ölçen First Input Delay (FID) metriğinin yerine koydu. Sektörde bu değişim sıklıkla Core Web Vitals 2.0 olarak anılıyor; bu resmî bir Google adı olmasa da ölçüm yaklaşımındaki köklü değişikliği iyi özetliyor: Artık sadece “ilk izlenim” değil, ziyaretin tamamındaki etkileşim deneyimi değerlendiriliyor.
Her etkileşimin süresi üç parçanın toplamıdır. INP nasıl iyileştirilir sorusunun cevabı da bu üç aşamayı ayrı ayrı ele almaktan geçer:
Google’ın belirlediği eşik değerleri şöyledir:
Bu değerlendirme, gerçek kullanıcı verilerinin 75. yüzdelik dilimine göre yapılır. Yani “iyi” sınıfına girebilmek için sayfa ziyaretlerinin en az yüzde 75’inde INP değerinin 200 ms veya altında olması gerekir. Mobil ve masaüstü verileri ayrı ayrı değerlendirildiği için özellikle daha zayıf işlemcili mobil cihazlarda ölçüm yapmak önemlidir.
Core Web Vitals, Google sayfa deneyimi sinyallerinin bir parçasıdır. Google, sıralamada içerik alaka düzeyinin hâlâ belirleyici olduğunu belirtse de sayfa deneyimi benzer kalitedeki sayfalar arasında fark yaratabilir. Daha da önemlisi, INP doğrudan kullanıcının hissettiği deneyimi yansıtır:
Bu nedenle INP’yi bir SEO kalemi olmanın ötesinde, site hızı optimizasyonu ve kullanıcı deneyimi stratejisinin merkezine yerleştiriyoruz.
INP bir etkileşim metriği olduğu için en güvenilir veri, gerçek kullanıcılardan toplanan saha verisidir (field data). Laboratuvar araçları ise sorunun kaynağını bulmak için kullanılır.
web-vitals kütüphanesiyle temel bir ölçüm kurulumu:
import { onINP } from 'web-vitals/attribution';
onINP((metric) => {
// metric.value: INP süresi (ms)
// metric.attribution: yavaş etkileşimin hangi öğede ve hangi aşamada yaşandığı
navigator.sendBeacon('/analytics', JSON.stringify({
value: metric.value,
target: metric.attribution.interactionTarget
}));
});
attribution sürümü, yavaşlığın hangi öğeden kaynaklandığını ve süreyi girdi gecikmesi, işleme süresi ve sunum gecikmesi olarak ayrıştırarak raporlar. Bu bilgi, optimizasyona nereden başlanacağını belirlemek için çok değerlidir.
INP sorunlarının büyük çoğunluğu ana iş parçacığını uzun süre meşgul eden JavaScript kodundan kaynaklanır. Bu yüzden JavaScript performans optimizasyonu, INP iyileştirmenin temelidir. Projelerimizde en sık uyguladığımız teknikleri aşağıda paylaşıyoruz.
Her ek script, ana iş parçacığında yer kaplar. İlk adımımız her zaman mevcut yükü sadeleştirmektir:
50 ms’den uzun süren her JavaScript görevi “uzun görev” olarak kabul edilir ve bu süre boyunca tarayıcı kullanıcı etkileşimlerine yanıt veremez. Büyük işleri küçük parçalara bölüp aralarda ana iş parçacığına kontrolü geri vermek girdi gecikmesini belirgin şekilde azaltabilir:
function yieldToMain() {
if ('scheduler' in window && 'yield' in scheduler) {
return scheduler.yield();
}
return new Promise((resolve) => setTimeout(resolve, 0));
}
async function processItems(items) {
let lastYield = performance.now();
for (const item of items) {
processItem(item);
// Yaklaşık her 50 ms'de bir ana iş parçacığına nefes aldır
if (performance.now() - lastYield > 50) {
await yieldToMain();
lastYield = performance.now();
}
}
}
scheduler.yield() henüz tüm tarayıcılarda desteklenmediği için örnekte setTimeout tabanlı bir yedek çözüm kullanıyoruz.
Kullanıcıya etkileşimin algılandığını hemen göstermek, INP için kritik önemdedir. Kritik olmayan işleri bir sonraki kare çizildikten sonra çalıştırabilirsiniz:
button.addEventListener('click', () => {
// 1. Anında görsel geri bildirim
button.classList.add('is-loading');
// 2. Ağır işi bir sonraki boyamadan sonraya ertele
requestAnimationFrame(() => {
setTimeout(() => {
updateCart();
sendAnalyticsEvent('add_to_cart');
}, 0);
});
});
Arama kutusu, filtreleme veya pencere yeniden boyutlandırma gibi saniyede onlarca kez tetiklenebilen olaylarda her tetiklemede ağır işlem çalıştırmak ana iş parçacığını kilitler. Debounce, işlemi kullanıcı yazmayı bıraktıktan sonra bir kez çalıştırır:
function debounce(fn, delay = 300) {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => fn(...args), delay);
};
}
const searchInput = document.querySelector('#search');
searchInput.addEventListener('input', debounce((event) => {
fetchResults(event.target.value);
}, 300));
Büyük veri setlerini filtrelemek, sıralamak veya işlemek gibi DOM’a erişim gerektirmeyen işler, ayrı bir iş parçacığında çalışan Web Worker’lara devredilebilir. Böylece ana iş parçacığı kullanıcı etkileşimlerine yanıt vermek için serbest kalır.
main.js
const worker = new Worker('/js/filter-worker.js');
filterInput.addEventListener('input', (event) => {
worker.postMessage({ products, query: event.target.value });
});
worker.onmessage = (event) => {
renderProductList(event.data);
};
filter-worker.js
self.onmessage = (event) => {
const { products, query } = event.data;
const q = query.toLowerCase();
const result = products.filter((p) => p.name.toLowerCase().includes(q));
self.postMessage(result);
};
Etkileşim sırasında senkron çalışan ağ istekleri veya büyük veri işleme adımları kullanıcıyı bekletir. Veri çağrılarını async/await ile asenkron hâle getiriyor, arayüzü önce iskelet (skeleton) görünümlerle güncelliyor, veriyi ise hazır olduğunda yerleştiriyoruz. Bu yaklaşım, etkileşim ile ilk görsel yanıt arasındaki süreyi kısaltır.
Sunum gecikmesinin başlıca nedenlerinden biri, büyük ve karmaşık DOM yapılarıdır. Her etkileşimde tarayıcının yeniden hesaplaması gereken öğe sayısı arttıkça boyama süresi uzar:
Bir optimizasyonun gerçekten işe yarayıp yaramadığını görmek için ölçülebilir bir karşılaştırma şarttır. Projelerimizde şu süreci izliyoruz:
Kendi sitenizde de bu yöntemi uygulamanızı öneririz: Değişiklik öncesi ve sonrası PageSpeed Insights ekran görüntülerini saklamak, hem ekibinize hem de paydaşlarınıza ilerlemeyi somut olarak göstermenin en pratik yoludur.
Core Web Vitals’taki bu dönüşüm, performansı yalnızca “sayfa ne kadar hızlı açılıyor?” sorusundan çıkarıp “sayfa kullanıcıya ne kadar hızlı yanıt veriyor?” sorusuna taşıdı. INP optimizasyonu; doğru ölçüm, gereksiz script yükünün temizlenmesi ve akıllı JavaScript mimarisiyle ulaşılabilir bir hedeftir.
tufiworks olarak gereksiz script yüklerini temizleyerek ve asenkron veri akışları kurgulayarak web sitenizi performans zirvesine taşıyoruz. Sitenizin INP değerini analiz etmek ve somut bir iyileştirme planı oluşturmak isterseniz ekibimizle iletişime geçebilirsiniz.
Bu yazıyla ilgili en çok merak edilenler, kısa ve net yanıtlarıyla.
INP (Interaction to Next Paint), kullanıcının sayfayla etkileşime geçmesi (tıklama, dokunma veya tuşa basma) ile tarayıcının bu etkileşimin sonucunu ekrana çizmesi arasında geçen süreyi ölçen bir Core Web Vitals metriğidir. Sayfa ziyareti boyunca gerçekleşen etkileşimleri değerlendirir ve en yavaşlarından birini raporlar.
Google’a göre 200 ms veya altı “iyi”, 200–500 ms arası “iyileştirilmesi gerekiyor”, 500 ms üzeri ise “zayıf” kabul edilir. Değerlendirme, gerçek kullanıcı verilerinin 75. yüzdelik dilimine göre yapılır.
Gerçek kullanıcı verisi için PageSpeed Insights’ın saha verisi bölümünü, Google Search Console’daki Core Web Vitals raporunu ve web-vitals JavaScript kütüphanesini kullanabilirsiniz. Sorunların kaynağını bulmak için ise Chrome DevTools Performance paneli ve Lighthouse’un timespan modu faydalıdır.
Evet. Google, Mart 2024’te INP’yi Core Web Vitals’a dahil ederek First Input Delay (FID) metriğinin yerine koydu. FID yalnızca ilk etkileşimin girdi gecikmesini ölçerken, INP ziyaret boyunca tüm etkileşimlerin tam yanıt süresini dikkate alır.
En etkili yöntemler; gereksiz JavaScript’i temizlemek, uzun görevleri küçük parçalara bölmek, etkileşimlerde önce görsel geri bildirim vermek, sık tetiklenen olaylarda debounce kullanmak, ağır hesaplamaları Web Worker’lara taşımak ve DOM boyutunu küçültmektir.
Standart Lighthouse analizi sayfa yüklemesini simüle eder ve kullanıcı etkileşimi içermez. Bu nedenle INP yerine, ana iş parçacığının ne kadar engellendiğini gösteren Total Blocking Time (TBT) metriğini raporlar. TBT’yi düşürmek genellikle INP’nin iyileşmesine de katkı sağlar.
Kapalı devre çalışan şirket içi panellerde role tabanlı yetkilendirme (RBAC), SQL injection koruması ve veri şifreleme yöntemleri.
Yazıyı Oku ➔Modern kurumsal yazılımlarda ve SaaS projelerinde performans, tip güvenliği ve esnek Filament PHP panel mimarisinin detaylı incelemesi.
Yazıyı Oku ➔Güvenli, token doğrulamalı (Laravel Sanctum) ve hızlı yanıt veren mikroservis API altyapıları inşa etmenin püf noktaları.
Yazıyı Oku ➔Markanız için lüks web tasarımı, özel UI/UX mimarisi veya kurumsal kimlik projesi başlatın.
Proje Başlatın ➔