Mayıs 2022'de Aurora ve Angular ekipleri, Angular için bir resim yönergesi üzerinde birlikte çalışacaklarını duyurdu. Direktif, Angular 14.2 sürümünün bir parçası olarak kısa süre önce geliştirici önizlemesi için yayınlandı. Bu yayında, yeni resim yönergesinin (NgOptimizedImage
) Angular'da resim optimizasyonunu nasıl desteklediğinden bahsedilmektedir.
Arka plan
Görseller, web kullanıcı deneyiminin yaygın ve önemli bir bileşenidir.Web sayfalarının %99,9'u bir veya daha fazla resim için istek oluşturur. Ayrıca, sayfa başına 982 kilobayt ortanca değeri oluşturan resimler de sayfa ağırlığına en çok katkıda bulunan öğelerdir.
Resimler, sayıları ve boyutlarındaki artış nedeniyle web sayfalarının performansını düşürebilir ve Önemli Web Verileri metriklerini etkileyebilir. 2021'de masaüstü sayfalarının% 79,4'ünde bir resim, Largest Contentful Paint (LCP) öğesiydi. Dolayısıyla, optimize edilmiş resimler oluşturmak birçoğumuz için sürekli bir uğraş haline geldi.
Aurora ekibi, geliştiricilerin karşılaştığı yaygın sorunlara yerleşik çözümler sağlamak için çerçevelerin gücünden yararlanmanın önemli olduğuna inanıyor. Resim optimizasyonu alanındaki ilk girişimleri, Next.js resim bileşeni oldu. Bu bileşeni, resim optimizasyonunun geliştirici deneyimini (DX) iyileştirmenin, çerçeveleri kullanan daha fazla uygulama için performans kazancı sağlayıp sağlayamayacağına dair bir test alanı olarak değerlendirdiler.
Next.js kullanıcısı Leboncoin'in verdiği ilk sonuç grubu cesaret vericiydi. Leboncoin, next/image
kullanmaya başladıktan sonra LCP'de önemli bir iyileşme (2,4 saniyeden 1,7 saniyeye) gözlemledi. Toplulukta daha sonra next/image
kullanılması, Next.js kaynaklarının LCP eşiklerine ulaşmasında önemli bir rol oynadı. Kısa süre içinde diğer çerçevelerdeki benzer özellikler için istekler almaya başladılar ve bunlardan biri Angular oldu.
Sonuç olarak Aurora, bu çerçevelerin görüntü bileşenlerinin prototipini oluşturmak için Angular ve Nuxt'a danıştı. Nuxt resim bileşeni geçen yıl kullanıma sunuldu. Resim optimizasyonu varsayılan değerlerini Angular'a getirmek için Angular resim yönergesi (NgOptimizedImage
) yayınlandı.
Fırsat
Angular, günümüzde geliştiricilerin kullandığı önde gelen JavaScript çerçevelerinden biridir. Mobil cihazlarda HTTPArchive tarafından taranan kaynakların 50 binden fazlası tarafından kullanılıyor ve NPM'de haftalık 3 milyon indirme sayısına ulaşılıyor.
Core Web Vitals puanlarına bakıldığında, "iyi" LCP eşiklerini karşılayan Angular kaynakları yüzdesi için hâlâ çalışma yapılması gerekiyor. Haziran 2022'de Angular sitelerinin yalnızca% 18,74'ü mobil cihazlarda iyi LCP değerine sahipti. Mobil ve masaüstündeki web sayfalarının% 70'inden fazlası için resimler LCP öğesi olduğundan, optimize edilmemiş LCP resimleri, Angular web sitelerinde düşük LCP'nin ana nedenlerinden biri olabilir.
Angular resim yönergesi, bu sayıları artırmaya yardımcı olmak için tasarlanmıştır.
NgOptimizeImage direktifi için MVP
Angular resim yönergesinin MVP'si, tasarımı Angular'ın istemci tarafı oluşturma deneyimine uyarlarken Aurora'nın bugüne kadar oluşturduğu resim bileşenlerinden alınan derslere dayanarak geliştirilmiştir. Standart resim optimizasyonu sorunlarının çoğu, aşağıdaki adımlardan biri kullanılarak giderilmiştir:
- Güçlü varsayılanlar sağlama.
- En iyi uygulamalara uygunluğu sağlamak için hata veya uyarı verme.
Tasarımın öne çıkan özellikleri şunlardır:
Akıllı geç yükleme
Sayfa yüklendiğinde kullanıcının göremeyeceği resimler (örneğin, ekranın alt kısmındaki resimler veya gizli dönen resimler) ideal olarak geç yüklenmiş olmalıdır. Geç yükleme, tarayıcı kaynaklarını diğer önemli metin, medya veya komut dosyalarını yükleyebilmesi için serbest bırakır. Çoğu resim kritik değildir ve geç yüklenmesi gerekir.Bununla birlikte, 2021'de sayfaların yalnızca% 7,8'inde yerel geç yükleme kullanılmıştır.
Angular resim yönergesi, kritik olmayan resimleri varsayılan olarak geç yükler ve yalnızca
priority
olarak işaretlenen resimleri etraflıca yükler. Bu, çoğu resmin optimum yükleme davranışını sergilemesini sağlar.Kritik görüntülere öncelik verme
Kaynak ipuçları eklemek (ör.
preload
veyapreconnect
) kullanmak önerilen en iyi uygulamalardan biridir. Ancak çoğu uygulama bunları kullanmamaktadır. 2021 Web Almanağı'na göre mobil sayfaların sadece% 12,7'si önceden bağlantı ipuçlarını, mobil sayfaların yalnızca% 22,1'i önceden yükleme ipuçlarını kullanır.Resimler öncelikli olarak işaretlendiğinde resim yönergesi iki ön tarafta çalışır.
- Resmin getirme önceliğini
"high"
olarak ayarlar. Böylece tarayıcı, resmi yüksek öncelikli olarak indirmesi gerektiğini bilir. - Geliştirme modunda, bir çalışma zamanı denetimi resmin kaynağına karşılık gelen bir
preconnect
kaynak ipucunun eklendiğini onaylar.
Geliştirme modunda direktif, LCP görüntüsünün beklendiği gibi
priority
olarak işaretlendiğini doğrulamak için PerformanceObserver API'yi de kullanır.priority
olarak işaretlenmemişse bir hata verilir ve geliştiriciden, LCP görüntüsünepriority
özelliğini eklemesi istenir.Sonuçta bu otomasyon ve uygunluk kombinasyonu, LCP resminde
preconnect
ipucuna,high
değerine sahipfetchpriority
özellik değerine sahip olmasını ve geç yüklenmemesini sağlar.- Resmin getirme önceliğini
Popüler resim araçları için optimize edilmiş yapılandırma
Angular uygulamalarının, genellikle varsayılan olarak optimizasyon hizmetleri sağlayan resim CDN'leri kullanması önerilir.
Bu direktif, resim CDN'lerinin uygulamada yapılandırılması için özellikle cazip bir geliştirici deneyimi (DX) sunarak kullanılmasını teşvik eder. Yapılandırmanızda CDN sağlayıcısını ve temel URL'nizi tanımlamanıza olanak tanıyan bir yükleyici API'sini destekler. Yapılandırıldıktan sonra, işaretlemede öğe adını tanımlamanız yeterlidir. Örneğin,
// in module providers: provideImgixLoader('https://mysite.net/assets/') // in markup <img ngSrc="image.png" > <img ngSrc="image2.png" >
Bu, aşağıdaki resim etiketlerini eklemeye eşdeğerdir ve geliştiricilerin her resme eklemesi gereken işaretlemeyi azaltır.
<img src="https://mysite.net/assets/image.png"> <img src="https://mysite.net/assets/image2.png">
Görüntü yönergesi, yerleşik yükleyicilere en popüler görüntü CDN'leri için optimum yapılandırma sunar. Bu yükleyiciler, her CDN'de önerilen resim biçimi ve sıkıştırma ayarlarının kullanılmasını sağlamak için resim URL'lerini otomatik olarak biçimlendirir.
Yerleşik hatalar ve uyarılar
Direktif, yukarıdaki yerleşik optimizasyonlara ek olarak, geliştiricilerin resim işaretlemede önerilen en iyi uygulamalara uyduğundan emin olmayı sağlayan yerleşik denetimler de içerir. Resim yönergesi aşağıdaki kontrolleri gerçekleştirir.
Boyutlandırılmamış resimler: Resim işaretlemesi açık bir genişlik ve yükseklik tanımlamamışsa resim yönergesi hata bildirir. Boyutlandırılmamış resimler düzen kaymalarına neden olabilir ve bu durum sayfanın Cumulative Layout Shift (CLS) metriğini etkileyebilir. Bunu önlemek için önerilen en iyi uygulama, resimlerde
width
veheight
özelliklerinin belirtilmesidir.En boy oranı: Resim yönergesi bir hata göndererek HTML'de tanımlanan
width
:height
en boy oranının, oluşturulan resmin asıl en boy oranına yakın olup olmadığını geliştiricilere bildirir. Bu durum, görüntünün ekranda bozuk görünmesine neden olabilir. Bu, aşağıdaki durumlarda gerçekleşebilir:- Yanlışlıkla farklı boyutlar (genişlik veya yükseklik) tanımlamışsınızdır veya
- CSS'nizde bir boyutu yüzdeye göre tanımlarken diğerini tanımlamadıysanız (örneğin,
width: 100%
, resmin her iki boyutta da büyütülebilmesi içinheight: auto
gerekir).
Büyük boyutlu resimler: Resim bir
srcset
tanımlamıyorsa ve gerçek resim, oluşturulan resimden önemli ölçüde büyükse yönerge,srcset
vesizes
özelliklerinin kullanılmasını öneren bir uyarı gösterir.Resim yoğunluğu:
srcset
içine, piksel yoğunluğu3x
üzerinde olan bir resim eklemeye çalışırsanız yönerge hata verir.2x
üzerindeki tanımlayıcılar, yüksek çözünürlüklü mobil cihazları büyük boyutlu resimleri indirmeye zorlamak gibi istenmeyen bir sonuç doğuracağından genellikle önerilmez. Dahası, insan gözü 2x'in üzerindeki bir farkı ayırt edemez.
Meydan okumalar
NgOptimizedImage
tasarlanırken en büyük zorluk, resim optimizasyonu stratejilerini istemci tarafı çerçeveyle çalışacak şekilde uyarlamaktı. Next.js'de Sunucu Tarafında Oluşturma (SSR) veya Statik Site Oluşturma (SSG), Angular'da ise İstemci Tarafında Oluşturma (CSR) varsayılan oluşturma deneyimidir. Angular, SSR kitaplığını (angle/universal) desteklese de Angular uygulamalarının çoğu (~%60) CSR'yi kullanır.
Resim yönergesi, tamamen CSR'nin Angular uygulamalarındaki genel kullanım senaryosuna uyacak şekilde oluşturulmuştur. Bu durum ek kısıtlamaları beraberinde getirdi ve ekip, MT uygulamaları için özel optimizasyonların nasıl geliştirileceğini yeniden düşünmek zorunda kaldı.
Karşılaşılan zorluklardan bazıları şunlardır:
Destekleyici kaynak ipuçları
Kritik öğeleri önceden yüklemek, tarayıcının bu öğeleri daha erken keşfetmesine yardımcı olur. Ancak, Angular uygulamalarında kaynak ipuçları eklemek karmaşık bir işlemdir, çünkü:
Manuel Ekleme: Geliştiricilerin
preload
kaynak ipucunu manuel olarak eklemeleri zordur. Angular, projenin tamamı veya web sitesindeki tüm rotalar için tek bir paylaşılan index.html dosyası kullanır. Bu nedenle, dokümanın<head>
özelliği her rota için aynıdır (en azından servis zamanında).<head>
öğesine herhangi birpreload
ipucu eklemek, gerekli olmadığında bile kaynağın tüm rotalar için önceden yükleneceği anlamına gelir. Bu nedenle,preload
ipuçlarının manuel olarak eklenmesi önerilmez.Oluşturma sırasında otomatik ekleme: Bir CSR uygulamasında oluşturma sırasında dokümanın başına önceden yükleme ipuçları eklemek üzere çerçeveyi kullanmak işe yaramaz. Oluşturma işlemi JavaScript indirilip yürütüldükten sonra gerçekleştiğinden
<head>
öğesi herhangi bir değer içermeyecek kadar geç oluşturulur.Direktifin ilk sürümünde,
preconnect
vefetchpriority
ipuçlarının bir kombinasyonupreload
yerine resme öncelik verir. Ancak Aurora, derleme zamanında kaynak ipuçlarının otomatik olarak eklenmesini etkinleştirmek için Angular CLI ekibiyle şu anda çalışıyor. Bizi izlemeye devam edin.Sunucudaki resim boyutunu ve biçimini optimize etme
Angular uygulamaları genellikle istemci tarafında oluşturulduğu için dosya sistemindeki resimler istek zamanında sıkıştırılamaz ve olduğu gibi sunulur. Bu nedenle, resimleri sıkıştırmak ve isteğe bağlı olarak WebP veya AVIF gibi modern biçimlere dönüştürmek için resim CDN'lerinin kullanılması önerilir.
Bu yönerge, görüntü CDN'lerinin kullanılmasını zorunlu kılmasa da yönergeyle birlikte kullanılması kesinlikle önerilir. Dahili yükleyiciler doğru yapılandırma seçeneklerinin kullanılmasını sağlar.
Etki
Aşağıdaki demo, Angular resim yönergesinin resim performansında oluşturabileceği farkı gösterir. İki web sitesini karşılaştırır:
Web Sitesi Bir: Imgix CDN üzerinden sunulan görüntülerle (varsayılan yapılandırma seçenekleriyle) yerel <img>
öğeleri kullanır.
Web Sitesi İki: Tüm resimler için resim yönergesini kullanın. Ayrıca, yönergenin verdiği hatalar veya uyarılar tarafından doğrudan önerilen optimizasyonları da içerir.
Ekip, görüntü yönergesinin gerçek kurumsal Angular uygulamaları üzerindeki performans etkisini doğrulamak için iş ortaklarıyla birlikte çalıştı.
Bu iş ortaklarından biri de Land's End'di. Sitelerinin, gerçek uygulamaların karşılaşabileceği sonuçlar açısından iyi bir test senaryosu olması bekleniyordu.
Ekiplerin kalite güvencesi ortamlarında Lighthouse laboratuvar testi, görüntü yönergesi kullanılmadan önce ve kullanıldıktan sonra gerçekleştirildi. Masaüstünde ortalama LCP değeri 12, 0 saniyeden 3, 0 saniyeye düştü. Bu da LCP'de% 75'lik bir iyileşme sağladı. Mobil cihazlarda ortalama LCP 20,2 saniyeden 12,0 saniyeye düştü (%40,6 iyileşme).
Geleceğin Yol Haritası
Bu, Angular resim yönergesinin tasarımının yalnızca ilk bölümüdür. Gelecekteki sürümler için planlanan birçok başka özellik bulunmaktadır. Bunlardan bazıları:
Duyarlı resimler için daha iyi destek:
NgOptimizedImage
şu andasrcset
kullanımını desteklemektedir ancaksrcset
vesizes
özellikleri her resim için manuel olarak sağlanmalıdır. Gelecekte, direktifsrcset
vesizes
özelliklerini otomatik olarak oluşturabilir.Kaynak ipuçlarını otomatik olarak yerleştirme
Kritik LCP görüntüleri için önceden bağlanma ve önceden yükleme etiketleri oluşturmak üzere Angular CLI ile entegrasyon mümkün olabilir.
Angular SSR desteği
MVP sürümü, Angular MT kısıtlamaları dikkate alınarak tasarlanmıştır, ancak Angular SSR (açısal/evrensel) için resim optimizasyonu çözümlerini araştırmak da önemli olacaktır.
Geliştirici deneyimiyle ilgili iyileştirmeler
NgOptimizedImage
, her resim içinwidth
veheight
özelliklerinin belirtilmesini gerektirir. Ancak, bunları her görüntü için belirtmek bazı geliştiriciler için yorucu olabilir. Bir sonraki iterasyonda geliştirici deneyimini aşağıdaki şekilde iyileştirme potansiyeli vardır:- Tanımlanması için açık bir genişlik/yükseklik gerektirmeyen ek bir modu (Next.js'deki"
fill
" resim düzeni seçeneğine benzer) destekleyin. - Resmin gerçek boyutlarını belirleyerek yerel görüntülerin genişliğini ve yüksekliğini otomatik olarak ayarlamak için CLI entegrasyonunu kullanma.
- Tanımlanması için açık bir genişlik/yükseklik gerektirmeyen ek bir modu (Next.js'deki"
Sonuç
Angular resim yönergesi, 14.2.0 sürümündeki geliştirici önizleme sürümünden itibaren aşamalı olarak geliştiricilere sunulacaktır. NgOptimizedImage
adlı satıcıyı deneyin ve geri bildirim gönderin.
Katkıları için Katie Hempenius ve Alex Castle'a özel teşekkürlerimizi sunuyoruz.