?

Log in

No account? Create an account
November 2016   01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
cartoon

Оффлайновые веб-приложения

Posted on 2010.08.11 at 14:43
Tags: ,
Как известно, сейчас существуют две технологии, помогающие строить оффлайновые веб-приложения. Старая, немодная Google Gears, и новая HTML5, на которую типо всем надо переходить.

В основе оффлайнового веба в Gears лежат две вещи. Первое - это база данных SQLite (http://code.google.com/intl/ru/apis/gears/api_database.html), доступная из браузерного JavaScript синхронными вызовами. База умеет полнотекстовый поиск, в том числе и в русском языке. Я пробовал - в UTF-8 работает. Те же самое есть в HTML5 - Web SQL. (http://dev.w3.org/html5/webdatabase/) Там есть как синхронный, так и асинхронный API.

И второе - так называемый LocalServer (http://code.google.com/intl/ru/apis/gears/api_localserver.html), который позволяет управлять локальным кэшом файлов двумя разными способами:
- Посредством манифест-файлов, в которых явно перечислены кэшируемые ресурсы (ManagedResourceStore). В HTML5 прямым аналогом является Application Cache.

Существенное отличие gears - можно заводить _несколько_ манифестов на одно приложение. В HTML5 манифест указывается в теге html, и как заводить несколько манифестов - не понятно. А это иногда может быть весьма полезно.

- Явно управляя кэшом. ResourceStore. Здесь все просто - никаких манифестов. Надо выполнить кэширование ресурса - говорим: capture, и все. Это необходимо, скажем, когда мы хотим откэшировать картинки, или почтовые аттачменеты в e-mail клиенте.

Вопрос. Как изобразить ResourceStore на HTML5? Можно воспользоваться FALLBACK-секцией манифеста. Ряд браузеров - скажем, FireFox, дает возможность добавлять ресурсы к applicationcache явно, вызовом add.

Но! Все ресурсы, не входящие явно в манифест (добавленные явно, или закэшированные динамически по совпадению маски FALLBACK), при обновлении манифеста, будут, что? _Убиты_.

А это никуда не годится. Созданием двух манифестов на приложение, один из которых - под HTML и статические реcурсы, а второй (никогда не обновляющийся)) - под динамически загружаемый контент - можно было бы обойти данную проблему.

Вопрос. Как это сделать? Кто-нить пробовал?

Comments:


blueher at 2010-08-11 10:51 (UTC) (Link)

Подпишусь на коменты, самому интересно

Первое что приходит в голову - это то что в appcache должен лежать только "загрузчик" который затем стащит файлы асинхронно (через XmlHTTPRequest) и запихнёт их в базу. Поскольку загрузчик (теоретически) часто меняться не должен, то вроде бы это проблему должно решить.
blueher at 2010-08-11 14:19 (UTC) (Link)

Re: Подпишусь на коменты, самому интересно

Кстати, гугловцы советуют для мобильных приложений иметь минимум ресурсов в appcache, ибо он действительно инвалидируется весь сразу и повторная загрузка жрёт ресурсы как бегемот веники. Правда, куда их пихать кроме как в appcache и самое главное как это делать - я в их совете не нашёл.
Gaperton
gaperton at 2010-08-11 20:58 (UTC) (Link)

Re: Подпишусь на коменты, самому интересно

Как в этом случае инвалидировать ресурсы сайта? Вот, допустим, я обновил логику в javascript, и хочу, чтобы все клиенты зацепили обновление. Но - я не хочу, чтобы они инвалидировали кешированные ресурсы вроде картинок. Ибо - их десятки тысяч у меня.

Алгоритм проверки такой, что если манифест не изменился, то проверять перечисленные в нем ресурсы браузер не будет. И как мне его не менять? Или что-то не так?
blueher at 2010-08-12 06:22 (UTC) (Link)

Re: Подпишусь на коменты, самому интересно

Э... Я наверное слишком кратко насписАл.
Хотел сказать что appcache должна использоваться по-минимуму, только для (условно назовём его так) boot-script-а
Этот boot-script далее тянет с сервера HTML, JS, CSS и картинки через XmlHttpRequest и стянув сохраняет их в базу (Web SQL Database) как набор BLOB-ов. Проверкой не обновился ли на сервере какой-то ресурс занимается тоже этот скрипт. Схемы тут можно реализовать сколь угодно сложные - т.е. начиная от того чтобы пытаться запросить каждый ресурс заново и проверять HTTP response code на 304 и заканчивая тем что отсылать серверу список хешей тех ресурсов которые есть на клиенте, принимать от сервера список дифф-ов и апдейтить ресурсы самостоятельно. В итоге в appcache - только boot-script. Это не очень большой скрипт и меняться он будет не слишком часто, к тому же его инвалидация не будет тянуть за собой инвалидацию ресурсов в Web SQL Database. В целом как-то так. Всё это чисто умозрительно, на практике такую схему реализовать не пытался (по крайней мере пока ;) )
Gaperton
gaperton at 2010-08-12 20:53 (UTC) (Link)

Re: Подпишусь на коменты, самому интересно

Осталась деталь - как сохраненную в виде блоба картинку подпихнуть браузеру.

Вообще - я читал, что это делается через жопу Canvas. Так?

blueher at 2010-08-13 07:06 (UTC) (Link)

Re: Подпишусь на коменты, самому интересно

Ну с этим-то проблем нет, data uri поддерживают все кроме IE<9
Ещё один вариант - SVG, но у него с кроссбраузерностью вроде как похуже.
Gaperton
gaperton at 2010-08-13 11:55 (UTC) (Link)

Re: Подпишусь на коменты, самому интересно

Ага. Data uri. Теперь понятно. С этого начинать надо.

То есть, закачиваем картинки, преобразуем в data uri, сохраняем в базу, и далее используем их как обычно, вместо url-ов. И в общем - все зашибись.

В принципе - вполне себе вариант.
blueher at 2010-08-13 12:56 (UTC) (Link)

Re: Подпишусь на коменты, самому интересно

Картинки надо сразу в виде Data URI качать, дабы потом через canvas не гонять. Наверное :)
Gaperton
gaperton at 2010-08-13 16:13 (UTC) (Link)

Re: Подпишусь на коменты, самому интересно

О! А вот это хорошая идея. С этим маленьким штришком - вся схема даже не лишена красоты и элегантности.

Спасибо, думаю, я получил исчерпывающий ответ на свой вопрос.

Теперь я знаю, как правильно это готовить в HTML5. :)
blueher at 2010-08-13 16:35 (UTC) (Link)

Re: Подпишусь на коменты, самому интересно

Будет чертовски интересно посмотреть на то что в итоге получится ;)
Gaperton
gaperton at 2010-08-13 16:45 (UTC) (Link)

Re: Подпишусь на коменты, самому интересно

Мне тоже :). Но посмотреть не так просто будет. Я пишу софтину для автономного терминала (вроде терминалов оплаты), а не веб-сайт или сервис. Просто технологии выбрал необычные.
blueher at 2010-11-11 14:22 (UTC) (Link)

Re: Подпишусь на коменты, самому интересно

Одна веская причина для разбиения приложения на "загрузчик" (который в appcache) и "мясо" - апи для использования appcache написано в кофе-шопе после гей-парада самыми активными его участниками. Проблема в том что после определённого обьёма закешированных данных (несколько метров на домен, цифра скорее всего слегка варьируется между различными браузерами) мы получаем фейерический капец - новые данные превышают квоту и приложение тупо не может быть положено в appcache. При этом понять в чём проблема невозможно - нет даже кода ошибки, ивент "error" и всё. Да, и единственное что можно посоветовать в таком случае пользователю - через настройки браузера почистить кэш (это заодно убьёт все приложения которые уже лежали в аппкэше). С базой можно хоть как-то извращаться - попытаться выкинуть что-то старое, к примеру. Хотя там тоже лимит довольно маленький и ЕМНИП почти нигде не настраивается. Вот такие вот они - технологии завтрашнего дня.
Макс Лапшин
levgem at 2010-08-11 11:03 (UTC) (Link)
а Google Gears в итоге работал? У меня он прожил полчаса, после чего был стерт.
Gaperton
gaperton at 2010-08-11 20:47 (UTC) (Link)
Google Gears в целом работает. Пример того, как он работает - gmail в режиме offline.
Gaperton
gaperton at 2010-08-11 20:53 (UTC) (Link)
Кроме того, у меня уже написано дохрена кода на gears, и он отлично работает. Цельное оффлайновое приложение. Сейчас вот синхронизацию с сервером к нему подрубаю.
(Deleted comment)
Gaperton
gaperton at 2010-08-11 20:51 (UTC) (Link)
Тут вопрос предельно конкретный, и мне надо получить на него ответ. А приложений таких (оффлайн + аякс) - почти никто и не пишет. Надежда на то, что те, что займутся - найдут тему поиском, и откомментят. Надежда слабая, но какая-никакая надежда.

Поиск в сети дал ноль информации. Поразительно, что перспективный стандарт HTML5 в плане элементарных возможностей хуже, чем древний gears. Не хочется в это верить как-то.
blueher at 2010-08-12 06:24 (UTC) (Link)
> Поразительно, что перспективный стандарт HTML5 в плане элементарных возможностей хуже, чем древний gears. Не хочется в это верить как-то.
Так ведь это - типичный дизайн комитетом :)
Гугл геарс - это конкретное решение конкретной проблемы. HTML5 - это стандарт. Я бы не удивлялся почему стандарт хуже ;)
Oleksandr Nikitin
wizzard0 at 2010-08-12 12:20 (UTC) (Link)
>> перспективный стандарт HTML5 в плане элементарных возможностей хуже, чем древний gears.

Он весь крайне маргинален - взяли кучу красивых фишек с других платформ, сложили вместе без какой-либо системы, и надеются, что взлетит. а потом сиди и разгребай inconsistencies... >_<

А таким софтом занимается мало кто.
Большой процент RIA пишут на Flash/SL, у которых свой собственный offline storage.

Мне, кстати, гораздо больше импонирует связка CouchDB на клиенте+browser JS, чем Gears, т.к. более portable и потенциально более scalable. Вообще тема остается открытой.

blueher at 2010-08-12 12:27 (UTC) (Link)
ИМХО тему offline web apps здОрово могут подтолкнуть мобильные платформы - iOS и Android. И та и другая имеют браузеры с неплохой поддержкой HTML5, а возможность делать приложения сразу под две перспективные платформы + не связываться с AppStore - это очень заманчиво.
alexsoff
alexsoff at 2010-08-26 10:54 (UTC) (Link)
> А приложений таких (оффлайн + аякс) - почти никто и не пишет.
Не совсем так. Мы, например, пишем "оффлайн + аякс", но несколько в другом варианте - под firefox portable. Соотвественно, часть проблем отсутствует. Ну и еще несколько знакомых идут по пути аналогичном нашему (используя XULRunner).
Ты, похоже, пытаешься создать приложение "переключаемое в оффлайн режим", так?
Gaperton
gaperton at 2010-08-30 08:39 (UTC) (Link)
> Не совсем так.

Совсем, совсем. 2%, и даже 5% - это "почти никто".

> Ты, похоже, пытаешься создать приложение "переключаемое в оффлайн режим", так?

Нет.
Previous Entry  Next Entry