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

131

Чтобы уменьшить количество запросов на сервере, я встроил некоторые изображения (PNG и SVG) как BASE64 прямо в CSS. (Это автоматизировано в процессе сборки)

как это:

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

Это хорошая практика? Есть ли причины избегать этого? Есть ли какие-то основные браузеры, в которых нет поддержки URL-адресов данных?

Бонусный вопрос: имеет ли смысл делать то же самое для CSS и JS?

MeO
источник
1
не многие люди уже используют IE7, и, несмотря на все недостатки, есть действительно хороший плюс - меньше файлов изображений для управления! то есть, если вам нужно нарисовать специальные линии для компонента дерева, тогда встраивание крошечных изображений локтей в сам css в сочетании с repeat-x или repeat-y устраняет необходимость убедиться, что дополнительные файлы изображений находятся в нужном месте (с очень небольшим накладные расходы для этого
варианта

Ответы:

153

Это хорошая практика? Есть ли причины избегать этого?

Обычно это хорошая практика только для очень маленьких изображений CSS, которые будут использоваться вместе (например, спрайтов CSS), когда совместимость с IE не имеет значения, а сохранение запроса более важно, чем кэшируемость.

У него есть ряд заметных недостатков:

  • Совершенно не работает в IE6 и 7.

  • Работает только для ресурсов размером до 32 КБ в IE8 . Это предел, который применяется после кодирования base64. Другими словами, не более 32768 символов.

  • Он сохраняет запрос, но вместо этого раздувает HTML-страницу! И делает изображения не кэшируемыми. Они загружаются каждый раз, когда загружается содержащаяся страница или таблица стилей.

  • Кодировка Base64 увеличивает размер изображений на 33%.

  • Если они обслуживаются в gzip-архиве, data:изображения почти наверняка будут сильно загружать ресурсы сервера! Обычно для сжатия изображений требуется очень много ресурсов процессора, при очень небольшом уменьшении размера.

Пекка
источник
2
@meo интересный момент. Я полагаю, что это плохо для производительности gzip, так как изображения обычно уже очень оптимально сжаты. Их сжатие требует ужасного количества места на процессоре для однозначного процента прироста. Попробуйте сжать файл JPG, и вы поймете, что имеете в виду. Я отредактирую это в ответ
Пекка
1
Я знаю, что сжатие изображений с помощью gzip - не лучший вариант. Но я подумал, что, возможно, это более эффективно на базе 64. Особенно, когда у вас есть более одного изображения в источнике.
meo
2
@meo nope, это не будет более эффективным на base64 ни при каких обстоятельствах, потому что лежащие в основе шаблоны по-прежнему будут представлять собой сжатые данные изображения, которые просто выражаются в нотации base64.
Pekka
1
@meo а, понятно. Это вообще не работает в IE и имеет ту же проблему с кэшируемостью: вы сохраняете запрос, но каждый запрос страницы увеличивается в размере. Обычно, вероятно, намного лучше сжать все в один CSS и один файл JS
Пекка
5
Он НЕ раздувает HTML-страницу, когда вы встраиваете изображения в файл CSS, как указывает вопрос.
Дэниел Бердсли
38

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

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

Этот CSS будет полностью кэширован и значительно сократит количество обращений к серверу, что, как правильно полагает @MemeDeveloper, является одним из самых больших падений производительности.

Конечно, это взлом. без сомнений. так же, как спрайты - это хак. В идеальном мире это не понадобится, до тех пор это возможная практика, если вам нужно исправить следующее:

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

мой взгляд.

JAR.JAR.beans
источник
4
За это нужно проголосовать, чтобы привлечь больше внимания. другие ответы немного устарели - они говорят об IE6, в то время как IE8 в наши дни вроде устарел ... (и спасибо за это)
Hertzel Guinness
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 02
@StefanNch Это не то, о чем говорится. В отрывке «содержащий документ» относится к файлу css.
Christophe
9

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

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

Единственное преимущество, которое я получил от использования data-uri, заключалось в том, что мои фоновые изображения отображались сразу после загрузки таблицы стилей, в отличие от постепенной загрузки, которую мы видим в противном случае.

Приятно, что у нас есть эта техника, но я не буду ее слишком часто использовать в будущем. Я рекомендую попробовать, просто чтобы вы знали сами

stephenmurdoch
источник
3

Я более склонен использовать CSS-спрайты для объединения изображений и экономии на запросах. Я никогда не пробовал технику base64, но она явно не работает в IE6 и IE7. Также это означает, что если какие-либо изображения изменятся, вам придется повторно загрузить все потерянные, если, конечно, у вас нет нескольких файлов CSS.

Стив Кларидж
источник
у меня уже есть спрайты, мне было интересно, смогу ли я оптимизировать его еще больше с помощью этого метода.
meo
2

Я понятия не имею об общих передовых методах, но я, например, не хотел бы видеть такие вещи, если бы я мог им помочь. :)

Веб-браузеры и серверы имеют множество встроенных средств кэширования, поэтому я подумал, что лучше всего было бы просто заставить ваш сервер указывать клиенту кэшировать файлы изображений. Если бы у вас не было много действительно маленьких изображений на странице, я бы не подумал, что накладные расходы на несколько запросов - это такая большая проблема. Браузеры обычно будут использовать одно и то же соединение для запроса большого количества файлов, поэтому новые сетевые подключения не устанавливаются, поэтому, если объем трафика через заголовки HTTP не является значительным по сравнению с размером файлов изображений, я бы не стал слишком беспокоиться о нескольких запросах ,

Есть ли причины, по которым вы считаете, что в настоящий момент на сервер поступает слишком много запросов?

Крис
источник
4
Потому что количество запросов - один из самых больших хитов производительности, если вы заботитесь о производительности в первую очередь, чтобы попытаться решить ее. см. взятие yahoo developer.yahoo.com/performance/rules.html «Уменьшение количества компонентов, в свою очередь, уменьшает количество HTTP-запросов, необходимых для отображения страницы. Это ключ к более быстрым страницам».
MemeDeveloper
0

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

  • Крошечный, потому что кодировка Base64 увеличивает размер
  • Часто используется, потому что это оправдывает более длительное время начальной загрузки.

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

Дополнительная информация собрана здесь: http://davidbcalhoun.com/2011/when-to-base64-encode-images-and-when-not-to/

Себастьян
источник