Surviving the offline status

Surviving the offline status

Rafael Fernandes

@AdamModus
AdamModus

Antoni Huguet Vives

@GatMesquer
MrFrontend

&

Agenda

  • Progressive Web Apps
  • Web App Manifest
  • Service Workers
  • IndexedDB
  • Detecting connectivity
  • ​Web components

Progressive Web Apps

What are they ?

Why should I care?

The worse we can leave the user with is: NOTHING

Offline first

  • Get as much resources as possible cached from the browser.
  • Actively cache new assets.
  • We might do requests over the network but we are not going to wait for it.
  • Cached information is better than nothing or wait for a slow network.
  • The user is happy online, happy offline, happy on slow networks.

  Philosophy behind:

Performance

Linkable

adammodus.github.io

App-like web applications

  • Installable

  • App name

  • Icon

  • Feels like an app

Web App Manifest

{
  "short_name": "Offline survivor",
  "name": "Surviving the offline status",
  "description": "A simply progressive web app.",
  "background-color": "#FAFAFA",
  "icons": [
    {
      "src": "imgs/icon/favicon-96x96.png",
      "sizes": "96x96",
      "type": "image/png"
    },
    {
      "src": "imgs/icon/favicon-144x144.png",
      "sizes": "144x144",
      "type": "image/png"
    },
    {
      "src": "imgs/icon/favicon-196x196.png",
      "sizes": "196x196",
      "type": "image/png"
    }
  ],
  "start_url": "/index.html",
  "display": "standalone"
}
<link rel="manifest" href="manifest.json">

Can I use ? Web App Manifest

developer.mozilla.org/en-US/docs/Web/Manifest

State of the art

Service Workers

What are service workers for ?

Service Workers

What are service workers for ?

Cache your assets !

Service Workers

Really ? Cool !

Show me a hello world :)

Service Workers

github.com/delapuente/service-workers-101

navigator.serviceWorker.register('sw.js', {scope: './'})

Service Workers

// What should I cache?
var urlsToCache = [
  '/',
  'index.html',
  'manifest.json',
  // js assets
  'js/main.js',
  'js/services/NetworkConnectivityService.js',
  'js/components/CardList.js',
  'js/components/SideNavBar.js',
  'js/components/ToDoCard.js',
  'js/indexedDB/IndexedDBLayer.js',
  'js/indexedDB/TodoListDB.js',
  'js/web-workers/db.js',
  'js/vendor/cards.js',
  'js/vendor/vanillatoasts.js',
  'js/util/setDefaultTODOs.js',
  // css assets
  'style/css/main.css',
  'style/vendor/vanillatoasts.css',
  // img assets
  'imgs/offline-rex.jpg',
  'imgs/icon/favicon-96x96.png',
  'imgs/icon/favicon-144x144.png',
  'imgs/icon/favicon-196x196.png',
  'imgs/plus.svg'
];

Service Workers

Lifecycle

Service Workers

What about... Cache invalidation !

State of the art

caniuse.com/#search=service%20workers 

Can I use ? Service Workers

IndexedDB

A (real) database on your browser!

What is that?

IndexedDB

  • Document database.
  • A good alternative for bad local storage abuses.
  • Offers you a chance to perform CRUD operations.
  • You can set a data schema and add indexes making queries faster.
  • Supports database version upgrades.

  Cool things about it:

And in our experiment, it's where we keep all the user information of our app!

State of the art

caniuse.com/#search=indexedDB 

Can I use ? IndexedDB

Detecting connectivity

caniuse.com/#feat=online-status 

Can I use ? navigator.onLine

window.ononline   window.onoffline

Detecting connectivity

Events are not enough, what about LieFi ?

function anyRequest() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {
    document.getElementById("demo").innerHTML = this.responseText;
  } else {
    // Treat the connectivity issue !
  }
  };
  xhttp.open("GET", "some-resource.json", true);
  xhttp.send();
}

State of the art

caniuse.com/#feat=online-status 

Can I use ? navigator.onLine

State of the art

Can I use ? Custom Elements + Shadow DOM

caniuse.com/#search=custom%20elements

caniuse.com/#search=shadow%20dom

Questions ?

Resources:
https://github.com/TalAter/awesome-service-workers

Our experiment:
https://github.com/AdamModus/offline-todo-list

We are going to share the slides ;)

Thank you :)

Surviving the offline status

By ajrkemp

Surviving the offline status

  • 1,462