Görüntüleri veri / base64 olarak CSS veya HTML'ye yerleştirmeli miyim


131

Sunucudaki istek sayısını azaltmak için bazı görüntüleri (PNG ve SVG) BASE64 olarak doğrudan css'e katıştırdım. (Oluşturma sürecinde otomatiktir)

bunun gibi:

background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAFWHRTb2Z0d2FyZQBBZG etc...);

Bu iyi bir uygulama mı? Bundan kaçınmak için bazı nedenler var mı? Veri url desteği olmayan bazı büyük tarayıcılar var mı?

Bonus soru: Bunu CSS ve JS için de yapmak mantıklı mı?


1
artık pek çok insan IE7 kullanmıyor ve tüm olumsuzluklar için gerçekten iyi bir ters - yönetilmesi gereken daha az görüntü dosyası var! Örneğin, bir ağaç bileşeni için özel çizgiler çizmeniz gerekiyorsa, tekrar-x veya tekrar-y ile birlikte küçük dirsek görüntülerini css'e gömmek, fazladan görüntü dosyalarının doğru yerde olduğundan emin olma ihtiyacını ortadan kaldırır (çok az bu kullanım durumu için ek yük)
DaveAlger

Yanıtlar:


153

Bu iyi bir uygulama mı? Bundan kaçınmak için bazı nedenler var mı?

IE uyumluluğunun önemli olmadığı ve isteği kaydetmenin önbellekten daha önemli olduğu durumlarda, genellikle yalnızca birlikte kullanılacak çok küçük CSS görüntüleri için (CSS sprite'lar gibi) iyi bir uygulamadır.

Bir dizi kayda değer dezavantajı vardır:

  • IE6 ve 7'de hiç çalışmıyor.

  • IE8'de yalnızca 32k boyutuna kadar olan kaynaklar için çalışır . Bu, base64 kodlamasından sonra geçerli olan sınırdır. Diğer bir deyişle, 32768 karakterden uzun olamaz.

  • Bir isteği kaydeder, ancak bunun yerine HTML sayfasını şişirir! Ve görüntüleri önbelleğe alınamaz hale getirir. İçeren sayfa veya stil sayfası her yüklendiğinde yüklenirler.

  • Base64 kodlaması, görüntü boyutlarını% 33 oranında şişiriyor.

  • Gzip ile sıkıştırılmış bir kaynakta sunulursa, data:görüntüler sunucunun kaynakları üzerinde neredeyse kesinlikle korkunç bir yük oluşturacaktır! Görüntüler, boyutta çok az küçülme ile geleneksel olarak sıkıştırmak için çok yoğun CPU kullanır.


2
@meo ilginç nokta. Bunun gzip performansı için kötü olmasını bekliyorum, çünkü resimler genellikle zaten en iyi şekilde sıkıştırılmıştır. Bunları sıkıştırmak, tek basamaklı yüzde kazançlar için korkunç miktarda CPU alanına mal olur. Bir JPG dosyasını gziplemeyi deneyin ve ne demek istediğinizi göreceksiniz. Bunu yanıt olarak düzenleyeceğim
Pekka

1
Sıkıştırılmış resimleri gzip etmenin yapılacak yol olmadığını biliyorum. Ama bunun temel 64'te daha etkili olabileceğini düşünüyordum. Özellikle kaynakta birden fazla görüntünüz olduğunda.
meo

2
@meo hayır, herhangi bir koşulda base64 üzerinde daha etkili olmayacaktır, çünkü temel modeller hala base64 gösteriminde ifade edilen sıkıştırılmış görüntü verileri olacaktır.
Pekka

1
@meo ah, görüyorum. Bu, IE'de hiç çalışmaz ve aynı önbelleğe alınabilirlik sorununa sahiptir: Bir isteği kaydedersiniz, ancak her sayfa isteğinin boyutu büyür. Her şeyi tek bir CSS ve bir JS dosyasında sıkıştırmak genellikle çok daha iyidir
Pekka

5
Bu mu DEĞİL soru gösterir gibi bir CSS dosyasındaki görüntüleri gömme zaman HTML sayfası kabartmak.
Daniel Beardsley

38

Buradaki ortak cevaplar, bir dizi yasal nedenlerden dolayı bunun gerekli olmadığını gösteriyor gibi görünüyor. Ancak, tüm bunlar modern uygulama davranışını ve oluşturma sürecini ihmal ediyor gibi görünüyor.

Bir klasör görüntülerinde gezinecek ve bu klasörün tüm görüntüleriyle tek bir CSS oluşturacak basit bir işlem tasarlamak imkansız değil (ve aslında oldukça kolay).

Bu css tam olarak önbelleğe alınacak ve sunucuya gidiş gelişleri önemli ölçüde azaltacaktır; bu, @MemeDeveloper'ın en büyük performans hitlerinden biri tarafından doğru bir şekilde önerildiği gibi.

Elbette, hack. şüphesiz. Sprite'ın bir hack olduğu gibi. Mükemmel dünyada buna gerek olmayacak, o zamana kadar, düzeltmeniz gereken şey şuysa, bu olası bir uygulamadır:

  1. Kolayca "spritable" olmayan birden çok görüntü içeren sayfa.
  2. Sunuculara gidiş dönüş gerçek bir darboğazdır (mobil düşünün).
  3. hız (milisaniye düzeyinde) kullanım durumunuz için gerçekten çok önemlidir.
  4. IE5 ve IE6'yı umursamıyorsun (gerektiği gibi, internetin ilerlemesini istiyorsan).

benim görüşüm.


4
Daha fazla dikkat çekmek için buna olumlu oy verilmelidir. diğer cevaplar biraz eski - IE6 hakkında konuşuyorlar, ancak IE8 bu günlerde biraz modası geçmiş ... (ve bunun için teşekkürler)
Hertzel Guinness

11

Bu iyi bir uygulama değil. Bazı tarayıcılar veri URI'lerini desteklemiyor (örn. IE 6 ve 7) veya destek sınırlıdır (örn. IE8 için 32KB).

Veri URI dezavantajları hakkında tüm ayrıntılar için şu Wikipedia makalesine de bakın:

Dezavantajları

  • Veri URI'leri, içerdikleri belgelerden (örn. CSS veya HTML dosyaları) ayrı olarak önbelleğe alınmaz, bu nedenle, içeren belgeler her yeniden indirildiğinde veriler indirilir.
  • Her değişiklik yapıldığında içerik yeniden kodlanmalı ve yeniden yerleştirilmelidir.
  • Sürüm 7 aracılığıyla Internet Explorer (Ocak 2011 itibarıyla pazarın yaklaşık% 15'i) destekten yoksundur.
  • Internet Explorer 8, veri URI'larını maksimum 32 KB uzunluğunda sınırlar.
  • Veriler basit bir akış olarak dahil edilir ve birçok işleme ortamı (web tarayıcıları gibi ) meta veriler, veri sıkıştırma veya içerik anlaşması gibi daha fazla karmaşıklık sağlamak için kapsayıcıların ( multipart/alternativeveya gibi message/rfc822) kullanılmasını desteklemeyebilir .
  • Base64 olarak kodlanmış veri URI'leri, ikili eşdeğerlerinden 1/3 boyut olarak daha büyüktür. (Ancak, HTTP sunucusu yanıtı gzip kullanarak sıkıştırırsa bu ek yük% 2-3'e düşer)
  • Veri URI'leri, güvenlik yazılımının içeriği filtrelemesini zorlaştırır.

3
Her talepte CSS yeniden indirilir mi? Bu yeni bir tane! Ayrıca, hayatınızda bir dosyayı arşivlediyseniz, sıkıştırma oranının% 2-3 olmadığını fark etmişsinizdir! Yanılmıyorsam, ilk önce yahoo.com'da uygulanan bu tekniği gördüm. ... açıkça iyi bir uygulama değil!
StefanNch

@StefanNch söylediği bu değil. Alıntıda, "içeren belge" css dosyasını ifade eder.
Christophe

9

Data-uri'leri yaklaşık bir aydır kullanıyordum ve onları kullanmayı bıraktım çünkü stil sayfalarımı kesinlikle muazzam hale getirdiler.

Data-uri'ler IE6 / 7'de çalışır (sadece bu tarayıcılara bir mhtml dosyası sunmanız gerekir ).

Data-uri'leri kullanmaktan elde ettiğim tek avantaj, arka plan resimlerimin stil sayfası indirilir indirilmez, aksi durumda gördüğümüz kademeli yüklemenin aksine oluşturulmasıydı.

Bu tekniğin mevcut olması güzel, ancak gelecekte onu çok fazla kullanmayacağım. Yine de denemenizi tavsiye ederim, sadece kendiniz tanımanız için


3

Resimleri birleştirmek ve isteklerden tasarruf etmek için CSS Sprite'ı kullanmaya daha meyilliydim. Base64 tekniğini hiç denemedim ama görünüşe göre IE6 ve IE7'de çalışmıyor. Ayrıca, herhangi bir görüntü değişirse, elbette birden fazla CSS dosyanız yoksa, tüm kayıpları yeniden iletmeniz gerektiği anlamına gelir.


Zaten sprite'ım var, bu yöntemle daha da optimize edip edemeyeceğimi merak ediyordum.
meo

2

Genel en iyi uygulamalar hakkında hiçbir fikrim yok, ancak kimse yardım edebilseydim bu tür şeyleri görmek istemem. :)

Web tarayıcıları ve sunucularında bir sürü önbellekleme malzemesi bulunur, bu yüzden en iyi seçeneğinizin sunucunuzun istemciye görüntü dosyalarını önbelleğe almasını söylemesini sağlamak olduğunu düşünürdüm. Bir sayfada gerçekten çok sayıda küçük resim yoksa, birden fazla isteğin ek yükünün bu kadar önemli olduğunu düşünmezdim. Tarayıcılar genellikle çok sayıda dosya istemek için aynı bağlantıyı kullanır, bu nedenle yeni ağ bağlantıları kurulmaz, bu nedenle HTTP üstbilgilerinden geçen trafik hacmi resim dosyalarının boyutuna kıyasla önemli olmadığı sürece birden fazla istek için çok fazla endişelenmem .

Şu anda sunucuya giden çok fazla istek olduğunu düşünmenizin nedenleri var mı?


4
çünkü istek sayısı, denenecek ve üstesinden gelinmesi gereken ilk şeyi mükemmelleştirmek istiyorsanız, en büyük mükemmel sonuçlardan biridir. yahoo'nun developer.yahoo.com/performance/rules.html almasına bakın "Bileşenlerin sayısını azaltmak, sırayla sayfayı oluşturmak için gereken HTTP isteklerinin sayısını azaltır. Bu, daha hızlı sayfaların anahtarıdır."
MemeDeveloper

0

Bunu çok sık kullanılan küçük resimler için öneririm, örneğin bir web uygulamasının genel simgeleri.

  • Küçük, çünkü Base64 kodlaması boyutu büyütür
  • Genellikle kullanılır, çünkü bu daha uzun ilk yükleme süresini haklı çıkarır

Elbette eski tarayıcılarla ilgili destek sorunları akılda tutulmalıdır. Ayrıca, GWT'nin ClientBundle'ı gibi bir veri url'lerini görüntülere otomatik olarak satır içi yapmak için bir çerçevenin yeteneğini kullanmak veya en azından doğrudan öğenin stiline eklemek yerine CSS sınıflarını kullanmak iyi bir fikir olabilir.

Daha fazla bilgi burada toplanmıştır: http://davidbcalhoun.com/2011/when-to-base64-encode-images-and-when-not-to/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.