@samthor sam thorogood · about sam developer relations on "web" varied projects:...

52
PWA-ifying Santa Tracker Sam Thorogood @samthor

Upload: others

Post on 16-Oct-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

PWA-ifying Santa Tracker

Sam Thorogood

@samthor

Page 2: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

About Sam

● Developer Relations on "Web"

● Varied projects: polyfills, apps, demos, videos, talks,internal + public advocacy

Page 3: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy
Page 4: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy
Page 5: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy
Page 6: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Demo

Page 7: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Why?

Page 8: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Open-Source

Page 9: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Education focus

Page 10: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Talks

Page 11: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Ghosts of Holidays Past

Page 12: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy
Page 13: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Half screen photo slide if text is necessary

2014

● Polymer 0.5

● With two polyfills-○ Shadow DOM○ Object.observe

● Horizontal design wasn't intuitive

Page 14: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Half screen photo slide if text is necessary

2015

● Total responsive village redesign

● Removed polyfills in favour of "production-ready Polymer 1.2"

● … lots of bugs, especially around element upgrading and O.o

Page 15: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

2016

● Polymer fixed most weird bugs○ Binding to upgraded elements○ Used app-layout elements

● New landing pages and routing code, improved shareability

● Better use of shared elements for scoreboards, sharing, ...

Page 16: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

2017

● Back to Shadow DOM polyfill with Polymer 2.0+○ Supported on Chrome/Safari

● Some surprises?

Page 17: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy
Page 18: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Fast Reliable Engagingusers have low attention..

squirrel

Page 19: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Fast Reliable Engagingoffline + app-like caching

Page 20: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Fast Reliable Engagingapp-like: fullscreen,

notifications, modern APIs

Page 21: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Santa as a Progressive Web App

Page 22: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Add To Home Screen

● You can already "ATHS"—this refers to the prompt○ Supported on Android

● Naïvely coerce it○ … just add a Web App Manifest

and a basic Service Worker

Page 23: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Add To Home Screen

10% of Santa Tracker's eligible sessions started here

Page 24: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

<link rel="manifest" href="manifest.json" />

<script>

if ('serviceWorker' in navigator) {

window.sw = navigator.serviceWorker.register(

'/sw.js?lang=' + document.documentElement.lang);

}

</script>

Install Service Worker where available

Manifest describing home screen UX

Page 25: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

<link rel="manifest" href="manifest.json" />

<script>

if ('serviceWorker' in navigator) {

window.sw = navigator.serviceWorker.register(

'/sw.js?lang=' + document.documentElement.lang);

}

</script>

<!-- non-standard meta tags -->

<meta name="apple-mobile-web-app-capable" content="yes">

<meta name="apple-mobile-web-app-status-bar-style" content="#00c6ed">

<meta name="msapplication-TileColor" content="#30B443">

<meta name="msapplication-tap-highlight" content="no">

<!-- icons -->

<link rel="apple-touch-icon" sizes="76x76" href="/images/icon-76.png">

<link rel="apple-touch-icon" sizes="120x120" href="/images/icon-120.png">

<link rel="apple-touch-icon" sizes="152x152" href="/images/icon-152.png">

<link rel="apple-touch-icon" sizes="167x167" href="/images/icon-167.png">

<link rel="apple-touch-icon" sizes="180x180" href="/images/icon-180.png">

<link id="favicon" rel="shortcut icon" href="/images/favicon-16.png" sizes="16x16">

<link id="favicon" rel="shortcut icon" href="/images/favicon-32.png" sizes="32x32">

<link id="favicon" rel="shortcut icon" href="/images/favicon-64.png" sizes="64x64">

<link id="favicon" rel="shortcut icon" href="/images/favicon-96.png" sizes="96x96">

But… still need this cruft

Page 26: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

var manifest = document.createElement('link');

manifest.rel = 'manifest';

manifest.crossOrigin = 'use-credentials';

manifest.href = 'manifest.json'; // avoid href rewriting from gulpfile

document.head.appendChild(manifest);

if ('serviceWorker' in navigator) {

window.sw = navigator.serviceWorker.register(

'/sw.js?lang=' + document.documentElement.lang);

// Reload the page when a new SW takes over. This should only happen in staging.

navigator.serviceWorker.addEventListener('controllerchange', function() {

location.reload();

});

}

We actually link manifest in JS

Page 27: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Offline

● We cache assets and work offline via aService Worker

● This is a script that:a) has a lifetime, including installb) proxies network requests

Page 28: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Challenges

● Santa is ~226mb ⚠�○ We can't/won't install all of it

● Languages: +Some different formats (mp3/ogg, gif/mp4)

● Continuous releases throughout December

Page 29: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Static vs prod

maps.gstatic.com/santatracker

● Unique URLs per-version—cached forever!

● Not just for offline loading

santatracker.google.com

Low cache expiry, to detect new release

Static

Prod

Page 30: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Load what you use

● Cache core of Santa on 'install'○ aka the "App Shell"

● Cache eligible scenes when user interacts with them○ The village itself is a scene

● Show offline via frozen houses○ ...but UX is hard

Page 31: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

<lazy-pages selected-item="village">

<dorf-scene id="village" route="village" icon="1f384" permanent

path$="scenes/dorf/dorf-scene_[[language]].html"

slot="santa-scene" allow-page-scrolling></dorf-scene>

<boatload-scene route="boatload" icon="26f5"

path$="scenes/boatload/boatload-scene_[[language]].html"

loading-bg-color="#8fd7f7"

loading-src="scenes/boatload/img/loading.svg"

logo="scenes/boatload/img/logo.svg"

slot="santa-scene"></boatload-scene>

"village" route is loaded

Page 32: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

<lazy-pages selected-item="village">

<dorf-scene id="village" route="village" icon="1f384" permanent

path$="scenes/dorf/dorf-scene_[[language]].html"

slot="santa-scene" allow-page-scrolling></dorf-scene>

<boatload-scene route="boatload" icon="26f5"

path$="scenes/boatload/boatload-scene_[[language]].html"

loading-bg-color="#8fd7f7"

loading-src="scenes/boatload/img/loading.svg"

logo="scenes/boatload/img/logo.svg"

slot="santa-scene"></boatload-scene>

"boatload-scene" is HTMLUnknownElement until ready

Page 33: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

<lazy-pages selected-item="boatload">

<dorf-scene id="village" route="village" icon="1f384" permanent

path$="scenes/dorf/dorf-scene_[[language]].html"

slot="santa-scene" allow-page-scrolling></dorf-scene>

<boatload-scene route="boatload" icon="26f5"

path$="scenes/boatload/boatload-scene_[[language]].html"

loading-bg-color="#8fd7f7"

loading-src="scenes/boatload/img/loading.svg"

logo="scenes/boatload/img/logo.svg"

slot="santa-scene"></boatload-scene>

Causes boatload scene to be loaded

Page 34: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Request flow

v1/boatload-sc

ene_en.html

Page 35: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Response flow

v1/boatload-scene_en.html

['village', 'boatload', ...]

Page 36: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Install flow

Page 37: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Install flow

Page 38: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Install flow

Page 39: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Other APIs

Page 40: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Web Share

● New, unifying API for interacting with native share interface

● It replaces the sea of share buttons normally presented to users

● Available in Chrome 61+

Page 41: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Google Analytics

● About ¾ of Santa browsers support Web Components + Shadow DOM natively

● We log all JS errors with an onerror handler○ … although we messed up this year as JS errors from an

iframe have their stack trace stripped

Page 42: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Santa as a Polymer App

Page 43: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

<dom-module id="santa-app">

<template>

<santa-strings id="strings"></santa-strings>

<iron-a11y-keys keys="esc enter" on-keys-pressed="_onKeysPressed"></...>

<preload-overlay id="preloader"></preload-overlay>

<santa-state during-tracker="{{duringTracker}}" ...></santa-state>

<santa-tracker-router route="{{route}}"></santa-tracker-router>

<santa-chrome id="chrome" pause="{{userPause}}" ...>

<lazy-pages selected-item="{{selectedScene}}" ...>

<dorf-scene route="village" icon="1f384" permanent

path$="scenes/dorf/dorf-scene_[[language]].html"

class="santa-scene" allow-page-scrolling></dorf-scene>

<!-- More scenes (30+) below -->

Lazy loads Polymer elements at runtime

Shows friendly loader

Page 44: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Preloader

● Hides:○ HTML import of scene itself○ Loading images, audio etc

● Matching image used on initial site load, to gain user attention

Page 45: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

<dom-module id="santa-app">

<template>

<santa-strings id="strings"></santa-strings>

<iron-a11y-keys keys="esc enter" on-keys-pressed="_onKeysPressed"></...>

<preload-overlay id="preloader"></preload-overlay>

<santa-state during-tracker="{{duringTracker}}" ...></santa-state>

<santa-tracker-router route="{{route}}"></santa-tracker-router>

<santa-chrome id="chrome" pause="{{userPause}}" ...>

<lazy-pages selected-item="{{selectedScene}}" ...>

<dorf-scene route="village" icon="1f384" permanent

path$="scenes/dorf/dorf-scene_[[language]].html"

class="santa-scene" allow-page-scrolling></dorf-scene>

<!-- More scenes (30+) below -->

Takes /boatload.html and converts to route

Page 46: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

route="codeboogie"

Page 47: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

<dom-module id="santa-app">

<template>

<santa-strings id="strings"></santa-strings>

<iron-a11y-keys keys="esc enter" on-keys-pressed="_onKeysPressed"></...>

<preload-overlay id="preloader"></preload-overlay>

<santa-state during-tracker="{{duringTracker}}" ...></santa-state>

<santa-tracker-router route="{{route}}"></santa-tracker-router>

<santa-chrome id="chrome" pause="{{userPause}}" ...>

<lazy-pages selected-item="{{selectedScene}}" ...>

<dorf-scene route="village" icon="1f384" permanent

path$="scenes/dorf/dorf-scene_[[language]].html"

class="santa-scene" allow-page-scrolling></dorf-scene>

<!-- More scenes (30+) below -->

Generated, shared strings for i18n

Singleton for Santa's position, date within Dec

Page 48: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Weather

● The <santa-weather> element wraps a canvas using rAF to draw snow and clouds

Page 49: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Chrome/Badge ● The <santa-chrome> element

provides the top bar, nav, sidebar etc, wrapping app-layout elements

● We also have <santa-badge>, which exists on its own: it is owned by the app, and is slotted in the top center

Page 50: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Finally...

Page 51: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

More Resources

● 2014: How 20% engineers built Santa Trackerhttps://youtu.be/dPb-QLuX_Xs

● Keep an eye on Chrome Developers on YouTube

● "pwacompat"

Page 52: @samthor Sam Thorogood · About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy

Sam Thorogood

@samthor

Ho Ho Ho