2012-01-28 2 views
3

Я знаю, что вы можете включать css и изображения среди других типов файлов, которые были сохранены в форме base64 в файле javascript. Тем не менее, они прилично огромны ... и gzipped, они сокращают LOT, даже с ~ 33% накладными расходами от base64-кодирования.Включая base64 gzipped stylesheets/images в javascript?

Не gzipped, изображения - данные: image/gif; base64, data: image/jpeg, data: image/png, и css - данные: text/css; base64. Какой тип mime можно/следует использовать, чтобы включить css или URI данных изображений, которые были gzipped? (Или если gzip + base64 не может работать, есть ли какое-либо другое сжатие, которое я могу сделать, чтобы уменьшить размер строки, сохраняя при этом данные, хранящиеся в javascript?)

..edit .. Я думаю, что вопрос недопонимается. Я не спрашиваю , если Я должен включить gzipped base64 строки в javascript. Да, я знаю, что в большинстве случаев лучше всего gzip javascript и другие файлы на сервере. Но это не применимо для usercript; usercript не имеет сервера и состоит только из одного файла. Firefox разрешает директиву @require, но Opera и Chrome этого не делают, и проблемы с локальной безопасностью файлов вступают в игру с загрузкой любых локальных файлов. Таким образом, все, что требуется скрипту, должно быть либо: 1) в Интернете (медленное), либо 2) встроенным в usercript (большой).

Теперь этот вопрос предполагает, что большой предпочтительнее замедлить, но этот большой не означает, что мы полностью игнорируем, насколько велики; если это может быть меньше, это улучшение.

Итак, предполагая, что строка base64 встроена в javascript, вопрос заключается в том, как сделать ее чем-то значимым.

Либо:

1) atob() может преобразовать сырой кодировке base64 GZIP к сырому Gzip в пределах JavaScript. (atob не нужно знать медиатип). Тогда возникает вопрос, как распаковать этот необработанный файл css или файл изображения, чтобы полученный результат мог быть подан в документ.

или 2) при условии надлежащего медиатипа, браузеры, по крайней мере теоретически (на RFID-данные), должны иметь возможность загружать любой файл непосредственно из datauri. «" достаточно для загрузки таблицы стилей без CSS. Вопрос здесь заключается в том, какой тип атрибута типа ссылки и комбинация медиатерапии данных будут работать (и в каких браузерах он будет работать)? Предпочтительно, для usercript это будет комбинация, которая работает в Opera, FF и Chrome.

+0

кодировка base64 имеет накладные расходы 33%. –

+0

Исправлено.:) Меня не волнует размер накладных расходов; для usercript размер не так важен для меня, как хранение всего одного дистрибутивного файла. Но было бы неплохо сохранить blobs base64 как можно меньше, поэтому это Q. – BrianFreud

+0

Не хотите ли вы просто включить base64 в свой JS и gzip JS? – sdleihssirhc

ответ

2

В HTTP сжатие чаще всего применяется только для передачи, чтобы уменьшить полезную нагрузку, которая должна быть передана. Это делается с помощью Content-Encoding header field.

Но data URL scheme очень ограничено, и вы можете указать только тип носителя:

dataurl := "data:" [ mediatype ] [ ";base64" ] "," data 

Хотя вы можете использовать multipart message, большинство агентов пользователей не поддерживают их в data URL. Было бы также сомнительно, будут ли дополнительные данные для описания такого многостраничного сообщения не более, чем безопасные данные, сжимая фактическую полезную нагрузку.

Таким образом, сжатие данных в формате data возможно в теории, но непрактично. Лучше просто сжать весь документ, в который встроен URL-адрес data.

+0

Это не затрагивает вопрос, и не является правильным. Полностью законно, в соответствии с RFC данных, кодировать что угодно. Кроме того, gzip не требует типа multipart mime; Например, приложение/gzip является полностью законным. Кроме того, в этом случае base64 допускает только разрешенную кодировку - base64 даже не является кодировкой по умолчанию (US-ASCII is). – BrianFreud

+1

Конечно, вы можете обернуть любые данные в URL 'data', указав соответствующий тип медиафайла. И вы также можете сделать это с помощью * application/gzip * data. Но тогда данные обрабатываются как * application/gzip * data, а не как CSS, JavaScript или что-то еще. И кодировка Base64 также используется только для обертывания, чтобы иметь кодировку, защищенную URL-адресом, данные должны быть закодированы в соответствии с кодировкой URL. – Gumbo

+0

Уверен, но опять же, это не касается вопроса о том, как включить gsipped css-файл. Я не видел полной реализации, но я слышал об этом, так или иначе, через XMLHttpRequest с переопределенным типом mime, отправив строку gzipped через фиктивный XMLHttpRequest, не так, чтобы данные шли куда угодно, но чтобы браузер затем распаковывает его в responseText. Псевдофункция, которую я видел, была: – BrianFreud

Смежные вопросы