Yanıt hala oluşturulurken artık daha fazla arayüz oluşturuluyor. Kullanıcı arayüzü tek bir durumda başlar, daha fazla veri geldikçe güncellenir. Bunu sohbet uygulamalarında, günlüklerde, transkripsiyon araçlarında ve diğer gerçek zamanlı sistemlerde görebilirsiniz.
İşin zor kısmı,arayüz sabit bir durumda değil; yeni içerik geldikçe değişmeye devam ediyor. Çizgilerin uzadığı ve yeni blokların ortaya çıktığı yerlerde büyür. Ekranın hemen altında olan bir şey aniden hareket edebilir ve kullanıcının kaydırma konumunu yönetmek zorlaşır. Kullanıcı arayüzü zaten etkileşimdeyken kullanıcı arayüzünün bazı bölümleri eksik bile olabilir.
Bu yazıda, basit bir arayüz alacağız ve bunu düzgün bir şekilde ele almasını sağlayacağız. Okuma deneyimini bozmadan işlerin nasıl sabit tutulacağına, kaydırmanın nasıl yönetileceğine ve kısmi içeriğin nasıl oluşturulacağına bakacağız.
Akış Kullanıcı Arayüzü Aslında Neye Benziyor?İçeriği farklı şekillerde yayınlayan üç demo oluşturdum: bir sohbet balonu, bir günlük akışı ve bir transkripsiyon görünümü. Yüzeyde farklı görünürler, ancak hepsi aynı üç sorunla karşılaşırlar.
Birincisi şef.kaydır. İçerik içeri aktarılırken, çoğu arayüz görünüm alanını en alta sabit tutar. Sadece izliyorsanız bu işe yarar, ancak bir şeyler okumak için yukarı kaydırdığınızda sayfa tekrar aşağı kayar. Bunu sen istemedin. Arayüz senin için karar verdi ve şimdi okumak yerine onunla savaşıyorsun.
İkincisi de Emre.düzen kayması. İçerik akışı, konteynerlerin sürekli büyüdüğü ve büyüdükçe aşağıdaki her şeyin aşağı doğru kaydığı anlamına gelir. Tıklamak üzere olduğunuz bir düğme artık olduğu yerde değil. Okuduğunuz bir satır taşındı. Sayfa bozuk değil; sadece hiçbir şey rahatça etkileşime girecek kadar uzun süre sabit kalmıyor.
Üçüncüsü değil.işleme frekansı. Tarayıcılar ekranı saniyede yaklaşık 60 kez boyar, ancak akışlar bundan çok daha hızlı gelebilir. Bu, tarayıcının sayfadaki her şeyin dahili temsili olan DOM'un, kullanıcının asla göremeyeceği çerçeveler için güncellenmesi anlamına gelir. Her güncellemenin hala bir maliyeti vardır ve bu maliyet, performans düşmeye başlayana kadar sessizce artar.
Her demoyu incelerken, işlerin nerede kötü hissetmeye başladığına dikkat edin. Arayüzün yolunuza çıkmaya başladığı o küçük sürtünme anı. Tam olarak bunu düzeltmek için buradayız.
Örnek 1: Yapay Zeka Sohbet Yanıtlarının AkışıBu en bilinen durumdur. TıklarsınızCanlı Akışve mesaj, tıpkı tipik bir yapay zeka sohbet arayüzü gibi, token bazında büyümeye başlar.

İşte denemenizi istediğim şey:
- Simgeye ve açılır menüye tıklandığında farklı seçenekler içeren farklı iletişim kutuları görüntülenir. Canlı AkışButon
- Mesaj akışı sırasında yukarı kaydırmayı deneyin.
- Hızı artırın (10 ms gibi bir değere).
İnce ama önemli bir şey fark edeceksiniz: Kullanıcı arayüzü sizi aşağı çekmeye çalışıyor. Temel olarak, dikkatinizin nerede olması gerektiği konusunda sizin için bir karar vermektir.
Bu bir örnek. Bir başkasına bakalım.
Örnek 2: Günlük Görüntüleyicide Canlı İşlemeBu örnek yüzeyde farklı görünüyor, ancak sorun aslında ilk örneğe çok benziyor. Zamanla uzayan bir mesaj yerine, bir terminal veya günlük akışı gibi sürekli olarak yeni satırlar eklenir.
Buradaki ilginç kısım kuyruk geçişi. Etkileşim ve kararlı arayüzler arasındaki dengeyi çok açık hale getirir:

Yine, denemenizi istediğim şey şu:
- Simgeye ve açılır menüye tıklandığında farklı seçenekler içeren farklı iletişim kutuları görüntülenir. BaşlaButon
- Günlüklerin kabın yüksekliğini geçmesine izin verin.
- Başlangıca ilerleyin.
- Akışı durdurun ve "kuyruk" seçeneğini devre dışı bırakın.
Kuyruk etkinleştirildiğinde, kullanıcı arayüzünün yeni içeriği takip ettiğine dikkat edin. Ama yukarı kaydırıp yerinde kalamıyorsun. Bunun yerine, akışı durdurmanız veya içeriği keşfetmek için "kuyruk" özelliğini etkinleştirmeniz gerekir.
Örnek 3: Gerçek Zamanlı Ölçümleri Gösteren Kontrol PaneliBu durumda, kullanıcı arayüzü yerinde güncellenir:
- Sayılar değişir,
- Grafik kayması,
- Değerler sürekli yenilenir.

Bu sefer parşömen gerginliği yok ama farklı bir konu ortaya çıkıyor. Bundan sonra buna gireceğiz.
Kullanıcı Arayüzü Neden Kararsız Hissediyor ve Nasıl OnarılırSohbet demosunu denediyseniz ve yanıtlar gelirken yukarı doğru kaydırdıysanız, ilk sorunu hemen fark etmiş olabilirsiniz: Kullanıcı arayüzü güncellenirken sizi en son yayınlanan içeriğe geri çekmeye devam ediyor. Bu sizi bağlamın dışına çıkarır ve içeriği geçtikten sonra tam olarak sindirmeniz için asla zaman tanımaz.
Aynı sorunu ikinci örnek olan günlük görüntüleyicide de görüyoruz. Kuyruk geçişi olmadan, akışlı içerik kaydırma konumunuzu geçersiz kılar.
Bunlar, geleneksel anlamda kod hataları ürettikleri hatalar değildir; daha ziyade, kod hatalarını etkileyen erişilebilirlik sorunlarıdır.tümübununla birlikte, işinizi planlarken ve test ederken dikkatli UX hususları ile düzeltilebilir ve önlenebilirler.
Öngörülebilir Kaydırma Davranışını Sağlayın
Amaç budur:
- Kullanıcının akışın altında olduğunu tespit ederken otomatik kaydırmayı etkinleştirin.
- Kullanıcı yukarı kaydırdığında otomatik kaydırmayı durdur.
- Kullanıcı akışın altına geri dönerse otomatik kaydırmaya devam edin.
Bunu yapmak için, kullanıcının kasıtlı olarak alttan uzaklaşıp uzaklaşmadığını bilmemiz gerekir; bu, kaydırma konumu manuel olarak değiştirildiğinde doğru olduğunu varsayabiliriz. Bu davranışı bir bayrakla izleyebiliriz.
let userScrolled = false;
chatEl.addEventListener (' scroll ', () => {
const gap = chatEl.scrollHeight
- chatEl.scrollTop
- chatEl.clientHeight;
userScrolled = gap > 60
;});
Bu60pxeşik önemlidir. Bu olmadan, kullanıcı gerçekten kaydırma yapmamış olsa bile, küçük düzen değişiklikleri (yeni bir satır gibi) kısa bir süre boşluk yaratır ve otomatik kaydırmayı keser.
Şimdi, yalnızca kullanıcının kaydırma konumu akışın kaydırma yüksekliğine eşit olduğunda, yani kullanıcı akışın alt kısmında olduğunda otomatik kaydırmayı etkinleştirdiğimizden emin olalım:
function autoScroll() {
if (!userScrolled) {
chatEl.scrollTop = chatEl.scrollHeight
;}}
Gözden kaçırması kolay küçük bir şey: Sıfırlamamız gerekiyoruserScrolledyeni bir akış başladığında. Aksi takdirde, önceki bir mesajdan bir kaydırma, bir sonraki mesaj için otomatik kaydırmayı sessizce devre dışı bırakabilir.
Yerleşim Kararlılığını Sağlamlaştırma
Bunu ilk örnekte de gördük. Yeni içerikler geldikçe, düzen atlar veya değişir, bu da sizi mevcut bağlamınızın dışına çıkarır. Neyin değiştiği konusunda net olmak gerekirse: geniş anlamda sayfa düzeni değil, doğrudan sohbet balonunun altındaki içeriktir.
Ayrıca koda bakmadan önce seslenmeye değer daha ince bir eser var: imleç titremesi. Çünkü siliyoruzinnerHTMLve her kene üzerindeki her öğeyi yeniden oluşturarak, imleç yok edilir ve yüksek hızlarda saniyede 80 kereye kadar sürekli olarak yeniden eklenir.
Normal hızda gözden kaçırmak kolaydır, ancak kaydırıcıyı yaklaşık 30 ms'ye kadar yavaşlatın ve metnin sonunda soluk ama kalıcı bir titreme göreceksiniz. Yeniden oluşturma modelini düzelttikten sonra, titreme tamamen kaybolur.

Bu değişikliklerin hiçbiri kendi başına büyük bir çaba değildir. Ancak bir kez yerleştirildiklerinde, arayüz her güncellemeye körü körüne tepki vermeyi durdurur. İçerik hala sürekli olarak gelse de, okunması daha kolay, kontrol edilmesi daha kolay ve çok daha az dikkat dağıtıcı hale gelir.
İstikrarlı, öngörülebilir ve iyi bir kullanıcı deneyimi sağlamak için dikkate alınması gereken daha fazla husus vardır. Örneğin, akışın ortasında akış iptal edilirse ne olur? Azaltılmış hareket, klavye navigasyonu ve ekran okuyucu erişilebilirliği gibi konularda kullanıcı tercihlerine saygı gösterilmesini sağlamak için ne yapabiliriz? Şimdi bunlara geçelim.
Kesintili Akışları İşlemeÇoğu akış arabirimi, akışı durdurmanın veya iptal etmenin bir yolunu içerir. Bunu demolarda gördük. Ancak durmak genellikle kullanıcı arayüzünü garip bir durumda bırakır. İmleç yanıp sönmeye devam edebilir, düğmeler güncellenmez ve mesaj, bitmediğine dair net bir gösterge olmadan akışın ortasında donar.
Sorun, durdurmanın genellikle tek bir şey yapmak için kablolu olmasıdır: zamanlayıcıyı iptal etmek. Bu yeterli değil. Ayrıca (1) bekleyen arabelleği temizlemeniz, (2) imleci kaldırmanız, (3) yanıtı eksik olarak işaretlemeniz ve (4) düğmeleri sıfırlamanız gerekir. Bunları şu şekilde başarıyoruz.
1. Akışı Temiz Bir Şekilde Durdurun
İşte nestopStreamsırayla yapması gerekenler:
- Zamanlayıcıyı iptal edin ve
isStreamingişaretleyin, böylece daha fazla kene çalışmaz. - Uygulamayı temizle
requestAnimationFrame(raf) arabelleği, böylece bir sonraki karede hala kuyruğa giren hiçbir şey yazılmaz.
function stopStream() {
clearTimeout(streamTimer);
isStreaming = false;
pending ='';
rafQueued = false;}
Temizleniyorbekliyorözellik önemlidir, çünkü henüz temizlenmemiş son akış örneğinden arabelleğe alınmış karakterler olabilir. Temizlemezseniz, bir sonrakirequestAnimationFrameateşler, tamponu boşaltır ve akış resmi olarak durduktan sonra bu karakterleri DOM'a yazar.
Şimdi çağırarak imleci kaldırmaya geçiyoruzmarkStoppedkabarcık üzerinde:
if (cursorEl&& cursorEl.parentNode) cursorEl.remove ();
markStopped(aiBubble);
stopBtn.style.display = 'yok ';
retryBtn.style.display = '';
playBtn.style.display = '';
setStatus(' Durdu ', 'durdu ');
chat.removeEventListener(' kaydırma ', onScroll);
}
. cursorEl.parentNodekontrol orada çünküstopStreamakışın ortasında yeni bir mesaj çıktığında dahili olarak da çağrılır, bu noktada imleç zaten gitmiş olabilir.çıkarbağımsız bir düğüm atıyor, bu yüzden önce kontrol ediyoruz.
markStoppedbalonun altına küçük bir etiket ekler, böylece kullanıcı yanıtın bitmediğini bilir:
function markStopped(bubble) {
if (!bubble) return;
bubble.classList.add(' durdu ');
const label = document.createElement(' span ');
label.className = 'durdurulmuş etiket ';
label.textContent = 'yanıt durduruldu ';
bubble.appendChild(etiket);
}
Boş kontrol tarihiBaloncukaI mesaj öğesi başlatılmadan önce yangınları durduran kenar durumunu ele alır, bu da kullanıcının baloncuk görünmeden önce 300 ms'lik gecikme sırasında durdurmayı tıklaması durumunda gerçekleşebilir.
Yeniden Deneme Seçeneği Sağlayın
Akış basitçe durursa — belki bir ağ sorunu veya başka bir beklenmedik hata nedeniyle — kullanıcıya akışı yeniden denemek için bir yol sağlamalıyız. Bunun temel anlamı, kullanıcı arayüzünün en üste geri dönmek, istemi yeniden okumak ve yeniden yazmak için gereken pahalı işi yapmasını önlemektir. Yeniden deneme seçeneğinde, kullanıcının yalnızca bir düğmeye tıklaması yeterlidir ve akış mevcut konumdan yeniden başlatılır.
Bunun işe yaraması için, akış başladığında soruyu aklımızda tutmamız gerekir:
let lastQuestion = '';
function startStream(soru, cevap) {
lastQuestion = soru;
// kurulumun geri kalanı...
}
Ardından, yeniden deneme denemesi başladığında, her şeyi sıfırlar ve yeni bir başlangıç yaparız:
function retryStream () {
if (currentMsgEl && currentMsgEl.parentNode) {
currentMsgEl.remove();
} charIndex
= 0;
userScrolled = false;
pending ='';
rafQueued = false;
isStreaming = true;
retryBtn.style.display =' none ';
stopBtn.style.display = '';
setStatus(' Akış... ', 'akış ');
chat.addEventListener(' scroll ', onScroll, {passive:true});
setTimeout(() => {
initAIMsg ();
kene(lastAnswer);
}, 200);
}
Sıfırlama kritik öneme sahiptir. Her devlet parçası, tıpkı yepyeni bir akış gibi, başlangıç değerine geri dönmelidir.
Not:Mesaj satırının tamamını kaldırıyoruz (currentMsgElsadece baloncuk değil). Sadece balon çıkarılırsa, düzen sargısı ve avatar kalıcı kalır ve yapıyı bozar.
Akış Ortasında Yeni Bir Mesaj Gönder
Gözden kaçırması kolay bir avantaj daha var. Kullanıcı hala bir akış çalışırken yeni bir mesaj gönderirse, aynı anda iki döngü DOM'a yazılır. Sonuç dağınıktır ve farklı yanıtlardan karakterler birbirine karışır.
İşte yapmanız gerekenler: Yeni bir akışa başlamadan önce mevcut akışı durdurun.
function startStream(soru, cevap) {
if (isStreaming) {
clearTimeout (streamTimer);
isStreaming = false;
pending = '';
rafQueued = false;
if (cursorEl&& cursorEl.parentNode) cursorEl.remove ();
chat.removeEventListener(' scroll ', onScroll);
}
// now reset and start fresh
charIndex = 0;
userScrolled = false;
isStreaming = true;
lastQuestion = soru;
// ...
}
Burada, aramak yerine temizliği sıraya koyuyoruzstopStreamdoğrudan çünküstopStreamayrıca ararmarkStoppedve düğmeleri sıfırlar. Bir sonraki demoda üç davranış da birbirine bağlanmıştır. Bir akış başlatabilir, akışın ortasında "Durdur" a basabilir ve imleç kaybolur, "yanıt durduruldu" etiketi görünür ve "Yeniden Dene" düğmeleri görüntülenir.

Akış arayüzleri genellikle bir fare ile oluşturulur ve test edilir, bu nedenle bir tarayıcıda kendilerini iyi hissedebilirler, ancak bir ekran okuyucunun yeni içeriği duyurup duyurmadığı gibi dikkate alınmamış olabilecek diğer durumlarda bozulabilirler. Veya bir klavyeyle gezinmek, işler geliştikçe sıkışabilir veya odağını kaybedebilir. Ve elbette, hareketli metin rahatsız edici olabilir — hatta devre dışı bırakılabilir —hareket hassasiyeti olanlarBölge yöneticilerini kısa mesafelerde taşıyacak, sırtı ve bacakları kuvvetli personel alınacaktır.
İşin iyi yanı, bu şeyleri barındırmak için her şeyi yeniden inşa etmenize gerek olmamasıdır; zaten orada olanın üstüne oturan çözümlerle düzeltilebilirler.
Yardımcı Teknolojiyi Canlı Bölgelerle Barındırma
Ekran okuyucular, kendiliğinden ortaya çıkan içeriği otomatik olarak duyurmaz. Genellikle kullanıcı yanlarına taşındığında bir şeyler okurlar. Dolayısıyla, metnin zaman içinde biriktiği bir akış kullanıcı arayüzünde hiçbir şey duyurulmaz. İçerik orada ama kullanıcı hiçbir şey duymuyor.
Düzeltme şu şekildediraria - live. Tarayıcıya bir konteyneri izlemesini ve kullanıcının odağını hareket ettirmesine gerek kalmadan güncellemeleri olduğu gibi duyurmasını söyler.
<div
id=" chat "
role=" log"
aria - live =" kibar "
aria - atomic =" yanlış"
aria - label="Sohbet mesajları"
></ div>
role=" log "yardımcı teknolojiye bunun çalışan bir transkript gibi bir güncelleme akışı olduğunu söyler. Bazı araçlar bunu otomatik olarak halleder, ancak davranışların tutarlı kalması için açık olmak daha güvenlidir.aria - atomic =" false "yalnızca yeni içeriğin duyurulmasını sağlar. Bu olmadan, bazı ekran okuyucular her güncellemede tüm mesajı tekrar okumaya çalışır ve bu da hızla kullanılamaz hale gelir.aria - live="kibar"kuyruklar kesintiye uğratmak yerine günceller. KullanınGirişkensadece hatalar gibi gerçekten acil dikkat gerektiren şeyler için.
Eksik Durumların Ele Alınması
Daha önce, akışın ortasında akış durduğunda mesaja bir "Yanıt Durduruldu" etiketi ekledik. Görsel olarak bu kadarı yeterli. Ancak bir ekran okuyucu için bu değişikliğin duyurulması gerekiyor.
Mesaj canlı bir bölge içinde olduğu içinaria - live="kibar", etiket DOM'a eklendiğinde otomatik olarak yeni içerik olarak duyurulacaktır. Canlı bölge duyuruyu zaten gerçekleştirir, bu nedenle etiketin kendisinde ek ARIA'ya gerek yoktur.
. Tekrar denedaha sonra görünen düğmenin de bağlama ihtiyacı vardır. Bir ekran okuyucu basitçe "Yeniden dene, düğme" diyorsa, bunun hangi eylemi ifade ettiği açık değildir. Bunu bir ekleyerek düzeltebilirsinizaria - labelorijinal soruyu içeren:
retryBtn.setAttribute(
'aria - label ',
`Yeniden Dene: ${lastQuestion.slice (0, 60
)}');
Burada yapabileceğiniz şey, sayfa yüklendiğinde değil, düğme göründüğünde bu etiketi ayarlamaktır:
retryBtn.style.display = 'satır içi blok ';
retryBtn.setAttribute(
'aria - label ',
`Yeniden Dene: ${lastQuestion.slice (0, 60
)}');
Biz de diyoruzretryBtn.focus()durduktan sonra. Bu şekilde, klavye kullanıcılarıSekmebir sonraki eylemi bulmak için klavyeyi kullanın.
Yardımcı teknoloji ile test:Ekran okuyucuların bunu nasıl duyurduğuna dair varsayımlara güvenmeyin. NVDA (Windows), JAWS (Windows) veya VoiceOver (Mac/iOS) gibi gerçek araçlarla test edin. Tarayıcı DevTools size erişilebilirlik ağacında nelerin göründüğünü gösterebilir, ancak içeriğin nasıl göründüğünü söyleyemez.Gerçek bir ekran okuyucu, duyurunun doğru zamanda ve doğru şekilde gerçekleşip gerçekleşmediğini ortaya çıkaracaktır.
Klavye Gezinme Hesabı
Kullanıcı arayüzü canlıyken kontrollerin klavyeyle çalışması gerekir, bu nedenle Durdur düğmesine erişilebilir olmalıdır. Fare kullanmayan biri için, Sekme + Enter, çalışan bir akışı iptal etmenin tek yoludur.
KullanmaHiçbiri gösterdüğmeleri gizlemek için uygundur; düğmeleri sekme sırasından kaldırır. Sorun, aşağıdaki gibi şeyleri kullanmaktır:Saydamlık:veya Gizli Görünürlük. Bunlar öğeleri görsel olarak gizler, ancak yine de odaklanabilirler, bu nedenle kullanıcılar göremedikleri bir şeye sekme takarlar.
Kullanım: odak - görünürböylece odak halkası klavye navigasyonu için görünür, ancak fare tıklamaları için görünmez:
btn: odak - görünür {
anahat: 2px katı #1d9e75;
outline - offset: 2px;}
Mesajın içindeki imleçaria - hidden =" true ". Bu sadece görsel. Bu olmadan, bazı ekran okuyucular onu dikkat dağıtıcı olan metin olarak okumaya çalışırlar.
Hareket Hassasiyeti
Pratik olarak her yapay zeka arayüzünde gördüğümüz daktilo etkisi sürekli hareket üretir. Daha önce tartıştığımız gibi, belirli hareket miktarları devre dışı bırakılabilir. Neyse ki, tarayıcılarazaltılmış hareketi tercih eder, bir kullanıcının işletim sistemi seviyesindeki hareket tercihlerini tespit etmektedir.
Akış için en iyi yaklaşım basittir: animasyonu atlayın ve tam yanıtı bir kerede verin. İçerik, yalnızca hareket olmadan aynı kalır.
const reducedMotion = window.matchMedia(
'( azaltılmış - hareketi tercih eder: azaltın )')
.matches;
if (reducedMotion) {
initAIMsg ();
for (const char of text) appendChar(char);
if (cursorEl&& cursorEl.parentNode) cursorEl.remove ();
done ();
return
;}
tik(metin); // normal animasyon
CSS'de, imleç yanıp sönmesinin de durması gerekir. Küçük bir ayrıntı olmasına rağmen, yanıp sönen bir imleç öğesiyanıp sönen içerikHer gün
@media (azaltılmış hareketi tercih eder: azalt) {
.cursor {animation:none; opacity: 1;}}
İşte başlıyoruz! Aşağıdaki demo, bu makaledeki her şeyi bir araya getiriyor, böylece bu modellerin pratikte nasıl çalıştığını görebilirsiniz. Ayrıca azaltılmış bir hareket geçişi içerir, böylece anında oluşturma sürümünü kolayca test edebilirsiniz.

Akış çoğunlukla çözülür. Sunucudan istemciye veri almak artık zor kısım değil. Kırılan şey, üstündeki kullanıcı arayüzüdür.
İçerik sürekli güncellendiğinde, kaydırma davranışı, düzen kararlılığı, oluşturma zamanlaması ve arayüzün kullanıcı eylemlerine nasıl tepki verdiği gibi küçük şeyler önemli olmaya başlar. Bunlar iyi ele alınmazsa, kullanıcı arayüzü kararsız ve kullanımı zor hisseder.
Bu makaledeki kalıplar bunu şu şekilde düzeltir:
- Kaydırma konumunun kullanıcının kontrolünde tutulması,
- Sadece değişenleri güncellemek,
- Çerçeve başına harmanlama renderları,
- Durdurma ve yeniden deneme eylemlerinin ele alınması ve
- Arayüzün erişilebilir hale getirilmesi.
Bunların hepsine her zaman ihtiyacınız yok. Ancak akış söz konusu olduğunda, bunlar genellikle işlerin ters gittiği yerlerdir.
Daha Fazla Okuma
- Sunucu Tarafından Gönderilen Olayları Kullanma
Bir bağlantı nasıl açılır, olaylarla nasıl başa çıkılır ve gerektiğinde nasıl yeniden bağlanılır. Bu taşıma katmanı, buradaki her şey buna dayanıyor. - Akış API'si
Doğrudan şuradan veri akışıgetirme. SSE'den daha fazla kontrole ihtiyacınız olduğunda kullanışlıdır. - Chrome DevTools Performans paneli
Performans iyileştirmelerini doğrulayabilmeniz için yerleşim yeniden hesaplamalarını ve boya maliyetlerini görmenize yardımcı olur. - “İklim değişikliği ile mücadele ve uyum çabalarında, kapsamlı ve işlevsel bir uluslararası iş birliğiBüyük DOM Boyutları Etkileşimi Nasıl Etkiler ve Bu konuda Yapabilecekleriniz”, Jeremy Wagner
Büyük DOM ağaçları neden işleri yavaşlatır ve uzun akış oturumlarında nasıl kontrol altında tutulur.




