Offline Web

Сеть непостоянна

Зачем?

  • SaaS для оффлайн бизнесов
    • рестораны
    • заправки
    • салоны красоты
  • Productivity Apps
    • Google Docs
    • Evernote
  • Games

Как всё начилось

backbone-offline

class Dreams extends Backbone.Collection
  url: '/api/dreams'

  initialize: ->
    @storage = new Offline.Storage('dreams', this)

  # your code ...

Выводы после работы над backbone-offline

Выводы после работы над backbone-offline

  • Application cache не работает http://alistapart.com/article/application-cache-is-a-douchebag
  • Синхронизация - это сложная задача
  • Монолитные библиотеки сложно поддерживать
  • CoffeeScript - не лучший язык, для open-source библиотеки
  • Open-source библиотека требует времени

storage

// set
storage({ key: 'val', key2: 'val2'}, function(err) {});

// get
storage('key', function(err, val) {});
storage(['key', 'key2'], function(err, all) {}); // all.length == 2

// count
storage(function(err, count) {}); // count == 2

// delete
storage('key', null, function(err) {});
storage(['key', 'key2'], null, function(err) {});

Выводы после работы над storage

  • Эта библиотека работает, если нужен простой key/value без индексов и итераторов
  • localForage@1.2.0 уже не так плох
  • Для более сложных задач, нужно углубляться в IndexedDB

treo

var treo = require('treo'); // or window.treo
var schema = treo.schema()
  .version(1)
    .addStore('books', { key: 'isbn' })
    .addIndex('byTitle', 'title', { unique: true })
    .addIndex('byAuthor', 'author')
  .version(2)
    .getStore('books')
    .addIndex('byYear', 'year');

var db = treo('library', schema);

db.store('books').batch([
  { isbn: 123456, title: 'Quarry Memories', author: 'Fred', year: 2012 },
  { isbn: 234567, title: 'Water Buffaloes', author: 'Fred', year: 2012 },
  { isbn: 345678, title: 'Bedrock Nights', author: 'Barney', year: 2013 },
], function(err) {});

// get a single book by title using an index
books.index('byTitle').get('Bedrock Nights', function(err, book) {});

// get all books filtered by author
books.index('byAuthor').get('Fred', function(err, all) {}); // all.length == 2

treo

  • Всё ещё версия 0.3, но 0.4 уже на подходе
  • Внедрена в некоторых крупных компаниях
  • 4000-5000 загрузок в npm в месяц
  • Для версии 0.5 я наметил большой рефакторинг и разбитие на модули: https://github.com/treojs

Offline Web

  • Sync (SLEEP, Operational Transformations)
  • Storage (localForage, treo)
  • Application Cache (service worker)

Моё решение

Service Worker

  • работа над ошибками Application Cache
  • позволяет проксировать все запросы браузера
  • в перспективе будет поддерживать background sync и push notifications
  • только самое начало, и технология будет доступна в 2015
  • https://jakearchibald.github.io/isserviceworkerready/

Sync

  • мало у кого получается решить эту проблему хорошо (Evernote, Apple)
  • PouchDB (CouchDB)
  • SLEEP
  • EDAM
  • Swarm (@gritzko)
  • OT (google docs or wave)

Выводы

  • Вопрос открытый
    • нет оффлайн веб-приложений
    • мало модулей в npm
    • синхронизация большинства приложений - кошмарна
  • Offline First
    • пока это больше маркетинг

Будущее

Работы хватит на всех!

  • iOS & Android разработчики (sync, protocol)
  • Разработчики баз данных (treo, livedb)
  • Учёные и математики (OT, CRDT)
  • Javascript разработчики
    • создавать экспериментальные приложения

    • экспериментировать с service worker

    • вычитывать спецификации

Благодарю за внимание!

Offline Web

By Aleksey Kulikov

Offline Web

Perm.js Meetup

  • 1,789