2013-08-22 1 views
0

Я знаю, что я делаю что-то немое, правда, но, пожалуйста, несите меня ...Улучшение производительности CSS url() с помощью DataURI Image

Ok. У нас есть приложение, созданное в Кордове iOS, которое в основном запускает удаленный сайт (не строго SPA, но только с несколькими полнофункциональными перезагрузками), то есть веб-сайт не некоторые html-файлы, которые распространяются вместе с приложение, но настоящий сайт, который работает на сервере. На сайте показано множество элементов с background: url(img/foo.png); или background-image: url(img/bar.png);. Теперь мы хотим уменьшить запрос изображения от клиента и, если возможно, также ускорить рендеринг страниц.

Итак, что мы сделали до сих пор, мы предварительно упаковали ~ 200 изображений (c.a. 7 MiB) в приложение iOS, извлеките его в /Documents с помощью первого запуска и загрузите их через плагин Cordova File.

на стороне сервера будет обеспечивать два CSS файлов, один без url() вызова в нем (without-bg.css), а другой только с элементами, которые имеют url() вызов в ней (only-bg.css). without-bg.css будет загружен так же, как нормальный, в то время как only-bg.css будут извлечены с помощью AJAX и обработаны следующим образом:

var styleSheetConverted = styleSheetRaw.replace(
    /(url\()(.*?)(\))/gi, 
    function(m, p1, p2, p3){ 
     if(p2.match(/https?:\/\//i)) return p1+p2+p3; 
     var naked = p2.replace(/"/g, ''); 
     if(imgDataURIs.hasOwnProperty(naked)){ 
      return p1+imgDataURIs[naked]+p3; 
     } 
     return p1+p2+p3; 
    } 
); 
$('head').append(
    '<style>' + styleSheetConverted + '</style>' 
); 

В принципе, я замена всех url(path/to/img.png) вызовов в url(data:image/png;base64,iVBORw0K <...> ErkJggg==, то есть в формате base64 идентификаторы URI данных. Проблема в том, что эта новая строка огромная, не менее 10 MiB, если не больше. Приложение занимает не менее пяти-десяти секунд, чтобы фактически показать что-либо с фоном. И несколько перезарядов делают его еще хуже.

Итак, как я могу улучшить этот динамический процесс генерации CSS, чтобы ускорить загрузку изображений ...?

Изображения уже сделаны в полоски ... (да, после этого у нас еще есть ~ 200 изображений).

+0

datauris создает большие утечки памяти, если вы перезагружаете их много раз .... но иногда вам нужно это делать. поэтому вы можете кэшировать их в websql или в качестве полного json-файла и/или использовать cache.manifest. – cocco

+0

Почему вы делаете это с URL-адресами данных? Почему бы просто не упаковать файлы изображений с вашим приложением и не ссылаться на них с помощью обычных локальных URL-адресов? – Pointy

+0

@ Понятно, потому что они не сработают ...? Исправьте меня, если я ошибаюсь, но как я могу ссылаться на них в файле CSS, который исходит от * remote *, а не локального? – Metaphox

ответ

1

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

http://127.0.0.1/myimage.png 

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

+0

Большое спасибо за WebResourceLoadDelegate, попробуем прямо сейчас. Приложение использует собственные функции, такие как сканер штрих-кодов и чтение пользовательских настроек с iPad. Это действительно должно быть полноценное приложение, но функциональность требует полного доступа в Интернет. – Metaphox

+0

FYI 'WebResourceLoadDelegate' недоступен в iOS. Пошел со встроенным HTTP-сервером. – Metaphox

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