Mobile web apps

Are we there yet?

Miguel Camba

@miguelcamba

@cibernox

miguelcamba.com

  • 2 years in development
  • Began in beta, now in 1.9
  • Live matches, realtime auctions
  • 5M users
  • Web, iOS and Android clients
  • A lot of lessons learned...

Being the most important one...

Think.

Mobile.

First.

4M players

500K players

2 years

2 weeks!!

6x

1x

F**K THE WEB. LET'S DO iOS/Android

RIGHT NOW

Hold on

I have some numbers

Internet subcribers

2.2 B

2013

2020

4 B 

Mobile

Desktop

2.4 B

2.8 B 

And most of them are new users...

...or the same people using new devices

  • 1/4 B connected cards by 2020
  • 1 B of connected Smart TVs
  • Gazillions* of devices we don't even know.

The web is the only technology we know that will be present on each one of those mobile devices

Why are we treating the mobile experience like a nice to have?

UX is the new king

Design

Coding

Desing and coding are converging

×

What does a user expect from your app?

  • Respond fast
  • Load fast
  • Work offline*

*At least don't break misserably

Load fast

  • Ember FastBoot™
     
  • Remove jQuery dependency
     
  • Tree Shaking
  • HTTP2 Server push
     
  • Browser caching

Cool stuff comming to speed up your boot time

Respond fast

User input

App update

What means fast?

User input

Use your fingers, Luke

Instead of this

export default Ember.Component.extend({
  click: function(e) {
    /*  */
  }
}

Text

export default Ember.Component.extend({
  touchStart: function(e) {
    /* preventDefault */
  },

  touchMove: function(e) {
    /* preventDefault */
  },

  touchEnd: function(e) {
    /* preventDefault */
  },

  click: function(e) {
    /* fallback for desktop */
  }
}

Use this

Click

  • Atomic
     
  • Not native
     
  • Small delay

Touch*

  • Fine-grained control
     
  • Native
     
  • Instantaneous
     
  • Extra: Multitouch

App update

< 100ms

100-300

300-1s

> 1s

Instantaneous

Uncertainty

How fast is fast?

Gesture recognition

Route transition

Data fetching

View update

Classic workflow

Use animations to create mental workflows

Animated transition

If you can't make things faster, make things

look

faster

100ms

Animation start

Animation end

50-100ms

User interaction

Perceived completeness

Animation

Watch Chrome Dev Summit talk by Paul Lewis

Gesture recognition tracking

Data fetching

Transition

View updating

Animate along with the gesture

Instant feedback

Happy users

Gesture tracking + Intelligent prefetch = Awesome

Preload content

Animations help to improve perceived speed only if they are smooth

But animation control with JS is hard

web-animations-api

New standard for animations

  • Declarative like CSS animations
  • Full control like JS animations
  • Run outside the main thread
  • Synchronization, grouping and sequencing
  • MotionPath and SVG animations features

// Basic usage
element.animate([{ left: 0, opacity: 0 }, { left: 100, opacity: 1 }], 2000);


// Fully customizable
element.animate(
    [{ color: 'black' }, { color: 'yellow' }],
    { duration: 1000, delay: 250, easing: 'ease-in-out', iterations: 3 }
);

// Full control
var player = element.animate([{ left: 0 }, { left: 100 }], 2000);

// Pause
player.pause();

// Play
player.play();

// 2x speed
player.playbackRate = 2;

// Reverse
player.reverse();

// Seek
player.currentTime = 1000;

The Polymer project has a polyfill you can use today.

https://github.com/web-animations/web-animations-next

Bigger Demo

Work offline

What if I tell you that you can make your app pretty offline in ~20 loc

Service Workers

var CACHE_NAME =  'mobile-patterns-v1';

self.addEventListener('fetch', function(event) {
  var fetchRequest = event.request.clone();
  var cacheRequest = event.request.clone();

  event.respondWith(
    fetch(fetchRequest).then(function(response) {
      caches.open(self.CACHE_NAME).then(function(cache) {
        var cacheSaveRequest = event.request.clone();
        cache.put(cacheSaveRequest, response.clone());
      });
      return response;
    }).catch(function(err) {
      return caches.match(cacheRequest);
    })
  );
});

offline-support.js

if ('serviceWorker' in window.navigator) {
  window.navigator.serviceWorker.register('/offline-support.js');
}

Register the worker

Small demo

Normal workflow, fallback to cache if no network

Lots of other patterns

  • Pre-fetch content in advance
     
  • Use cache, fallback to network (offline first)
     
  • Save for offline (read-it-later like)
     
  • Immediate response, revalidate in background
     
  • Listen for push notification (even when your app is closed)

Check the Cookbook

Bigger Demo

Don't wait, use it right now

Thanks

Mobile web apps

By Miguel Camba

Mobile web apps

  • 1,555