Чи слід вставляти зображення як data / base64 в CSS або HTML


131

Щоб зменшити кількість запитів на сервері, я вставив деякі зображення (PNG & SVG) як BASE64 безпосередньо в css. (Автоматизовано в процесі збирання)

подобається це:

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

Це хороша практика? Чи є причини, щоб цього уникнути? Чи є якісь основні веб-переглядачі, які не мають підтримки URL-адреси даних?

Питання про бонус: чи є сенс робити це і для CSS & JS?


1
не багато людей вже використовують IE7, і для всіх недоліків дійсно хороший перевернутий результат - менше файлів зображень для управління! тобто якщо вам потрібно намалювати спеціальні лінії для компонента дерева, то вбудовані крихітні зображення ліктя в сам css у поєднанні з повтором-x або повторити-y усуває необхідність переконатися, що зайві файли зображень знаходяться в потрібному місці (з дуже малою кількістю) накладні для цього випадку використання)
DaveAlger

Відповіді:


153

Це хороша практика? Чи є причини, щоб цього уникнути?

Це звичайно хороша практика, як правило, лише для дуже малих зображень CSS, які будуть використовуватися разом (як CSS-спрайти), коли сумісність IE не має значення, а збереження запиту важливіше, ніж кешованість.

Він має ряд помітних недоліків:

  • Не працює взагалі в IE6 та 7.

  • Працює з ресурсами лише до 32 кб в IE8 . Це обмеження, яке застосовується після кодування base64. Іншими словами, не більше 32768 символів.

  • Він зберігає запит, але замість нього роздуває HTML-сторінку! І робить зображення неможливими для кешування. Вони завантажуються щоразу, коли міститься сторінка або аркуш стилів.

  • Кодування Base64 розширює розміри зображень на 33%.

  • Якщо їх подають на ресурсі gzipped, data:зображення майже напевно становлять жахливу напругу на ресурсах сервера! Зображення традиційно дуже стисне для процесора, з дуже невеликим зменшенням розміру.


2
@meo цікавий момент. Я думаю, що це погано для роботи gzip, оскільки зображення зазвичай дуже оптимально стиснуті. Стиснення їх коштує жахливий обсяг процесорного простору для одноцифрового збільшення відсотків. Спробуйте gzipping файл JPG, і ви побачите, що ви маєте на увазі. Я відредагую це у відповідь
Pekka

1
я знаю, що gzipping стиснені зображення - це не шлях. Але я думав, що, можливо, його ефективніше на основі 64. Тим більше, коли у вас є більше одного зображення у джерелі.
мео

2
@meo nope, він не буде більш ефективним для base64 ні за яких обставин, оскільки основні шаблони все ще будуть стислими даними зображення, які щойно трапляються, виражаються в позначенні base64.
Pekka

1
@meo ах, я бачу. Це взагалі не працюватиме в IE і має ту ж проблему кешируемости. Ви зберігаєте запит, але кожен запит на сторінку збільшується в розмірі. Зазвичай, напевно, набагато краще, щоб все було компактне в один CSS і один файл JS
Pekka

5
Він НЕ роздуває HTML-сторінку, коли ви вставляєте зображення у файл CSS, як вказує питання.
Даніель Бердслі

38

Тут, мабуть, загальні відповіді дозволяють припустити, що це не потрібно з ряду законних причин. Однак, все це, здається, нехтує поведінкою сучасних додатків та процесом побудови.

Це не неможливо (і насправді досить просто) розробити простий процес, який буде проходити через зображення папок і генерувати єдиний CSS з усіма зображеннями цієї папки.

Цей css буде повністю кешований і різко скоротить зворотні поїздки до сервера, що так само правильно підказує @MemeDeveloper одним із найбільших хітів продуктивності.

Звичайно, це злом. без сумніву. те саме, що спрайт - хак. У досконалому світі це не знадобиться, до цього часу можлива практика, якщо потрібно виправити:

  1. Сторінка з декількома зображеннями, які не легко "сприймаються".
  2. Повернення до серверів - це фактичне вузьке місце (думаю, мобільний).
  3. швидкість (до рівня мілісекунд) дійсно така важлива для вашого випадку використання.
  4. Вам не байдуже (як слід, якщо ви хочете, щоб мережа рухалася вперед) про IE5 та IE6.

мій погляд.


4
На це слід звернути увагу, щоб отримати більше уваги. інші відповіді є своєрідними застарілими - вони говорять про IE6, в той час як IE8 є своєрідним застарілим в наші дні ... (і спасибі за це)
Герцел Гіннес

11

Це не вдала практика. Деякі браузери не підтримують URI даних (наприклад, IE 6 і 7) або підтримка обмежена (наприклад, 32 КБ для IE8).

Дивіться також цю статтю у Вікіпедії для отримання повної інформації про недоліки URI даних:

Недоліки

  • URI даних не кешуються окремо від документів, що містять їх (наприклад, CSS або HTML файли), тому дані завантажуються щоразу, коли містяться документи перезавантажуються.
  • Вміст має бути перекодовано та повторно вбудовано щоразу, коли внесені зміни.
  • Internet Explorer у версії 7 (приблизно 15% ринку станом на січень 2011 року) не має підтримки.
  • Internet Explorer 8 обмежує URI даних максимальною довжиною 32 КБ.
  • Дані включаються як простий потік, і багато середовищ обробки (наприклад, веб-браузери) можуть не підтримувати використання контейнерів (таких як multipart/alternativeабо message/rfc822) для забезпечення більшої складності, таких як метадані, стиснення даних або узгодження вмісту.
  • URI-файли даних, кодовані Base64, на 1/3 більше, ніж їх двійковий еквівалент. (Однак цей наклад зменшується до 2-3%, якщо сервер HTTP стискає відповідь за допомогою gzip)
  • URI даних ускладнюють програмне забезпечення для безпеки фільтрувати вміст.

3
CSS повторно завантажуються при кожному запиті? Це новий! Плюс, якби ви коли-небудь архівували файл у своєму житті, ви помітили б, що рівень стиснення не становить 2-3%! Якщо я не помиляюся, я вперше побачив цю техніку, реалізовану на yahoo.com. ... Очевидно, це не найкраща практика!
StefanNch

@StefanNch це не те, що йдеться. У витязі "документ, що містить документ" посилається на файл css.
Крістоф

9

Я використовував дані-урі близько місяця, і я просто перестав їх використовувати, оскільки вони зробили мої таблиці стилів абсолютно величезними.

Data-uri працюють в IE6 / 7 (вам просто потрібно подати файл mhtml цим браузерам).

Єдиною перевагою, яку я отримав від використання даних-урі, було те, що мої фонові зображення видавалися, як тільки було завантажено таблицю стилів, на відміну від поступового завантаження, яке ми бачимо інакше

Приємно, що у нас є ця методика, але я не буду її занадто сильно використовувати. Я радимо спробувати це, хоча б ви знали самі


3

Я б більше схильний використовувати CSS Sprites для комбінування зображень та збереження на запитах. Я ніколи не пробував техніку base64, але це, мабуть, не працює в IE6 та IE7. Також означає, що якщо якісь зображення змінюються, то, звичайно, вам доведеться відновити повністю втрачене, якщо, звичайно, у вас є декілька файлів CSS.


У мене вже спрайти, мені було цікаво, чи можу я ще більше оптимізувати цей метод.
meo

2

Я не маю уявлення про загальні найкращі практики, але я, наприклад, не хотів би бачити таку річ, якби міг у цьому допомогти. :)

У веб-браузерах та серверах є вбудована кількість кешованих речей, тому я б подумав, що найкраще зробити, щоб ваш сервер сказав клієнту кешувати файли зображень. Якщо б у вас на сторінці не було чималих зображень, я б не подумав, що накладні витрати на кілька запитів - це велика справа. Браузери, як правило, використовуватимуть одне і те ж з'єднання для запиту безлічі файлів, тому нових мережевих з'єднань не встановлюється, якщо тільки обсяг трафіку через заголовки HTTP не є значним порівняно з розміром файлів зображень, я б не переймався багаторазовими запитами. .

Чи є причини, чому, на вашу думку, наразі надто багато запитів на сервер?


4
тому що кількість запитів є одним з найбільших звернень до парфу, якщо ви дбаєте про перф, його перше, що потрібно спробувати вирішити. дивіться yahoo's take developer.yahoo.com/performance/rules.html "Зменшення кількості компонентів в свою чергу зменшує кількість HTTP-запитів, необхідних для візуалізації сторінки. Це ключ до швидших сторінок."
MemeDeveloper

0

Я б запропонував це для крихітних зображень, які використовуються дуже часто, наприклад, звичайних піктограм веб-програми.

  • Крихітна, тому що кодування Base64 збільшує розмір
  • Часто використовується, тому що це виправдовує більший час початкового завантаження

Звичайно, потрібно пам’ятати про проблеми з підтримкою старих браузерів. Крім того, може бути хорошою ідеєю використовувати можливості фреймворку для автоматичного вбудовування зображень за допомогою таких URL-адрес, як ClientBundle GWT, або принаймні використовувати класи CSS замість того, щоб безпосередньо додавати його до стилю елемента.

Більше інформації зібрано тут: http://davidbcalhoun.com/2011/when-to-base64-encode-images-and-when-not-to/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.