SLIDE 1 The FT eb pp: Coding responsively
Dr Robert Shilston (rob@labs.ft.com) Director, FT Labs (@ftlabs)
SLIDE 2 Historical comparison
1880 1900 1920 1940 1960 1980 2000 2020
SLIDE 3
SLIDE 4 orks offline Portable Long battery life Can be read in bright sunlight Cheap Ubiquity Bookmarking Sharing
Nesprint
Fast start up Clipping/saving Can be read in the dark Updates in real time Electronic delivery Search Personalisation Deep linking
SLIDE 5 orks offline Portable Long battery life Can be read in bright sunlight Cheap Ubiquity Bookmarking Sharing
‘Traditional’ eb
Fast start up Clipping/saving Can be read in the dark Updates in real time Electronic delivery Search Personalisation Deep linking
SLIDE 6 orks offline Portable Long battery life Can be read in bright sunlight Cheap Ubiquity Bookmarking Sharing
pps
Fast start up Clipping/saving Can be read in the dark Updates in real time Electronic delivery Search Personalisation Deep linking
SLIDE 7
HTML5 is HTML5 is not a ‘mobile thing’ not a ‘mobile thing’. . It’s It’s not an alternative not an alternative to native to native apps. apps. It’s a It’s a ay of making ay of making better better ebsites ebsites. .
SLIDE 8 elcome back to the elcome back to the eb eb
The FT eb app provides a touch optimised user experience ithout native code.
SLIDE 9 Sometimes it’s
hat hat e’ve done e’ve done
But e’ve learned a lot, so to be honest sometimes it’s
hat hat e e ould do if
e did it again. again.
SLIDE 10 genda
– Layout and interactions – Connection state – OS
– Branching and feature flags – Testing and deployment
SLIDE 11 hat is an app? hat is an app?
But first, let’s consider:
SLIDE 12 hat is an ‘app’?
- Built for a single platform
- In an app store
- ritten in native code
- Built for mobile
- Designed for touch interactions
NO THNKS
SLIDE 13
hat an ‘app’ is to us:
app (n). app (n). a distributed computer softare application designed for optimal use on specific screen sizes and ith particular interface technologies,
SLIDE 14 hy code responsively? hy code responsively?
So let’s start:
SLIDE 15 +
Desktop Click Point
Ho an app might run
Laptop Type Move Tablet Touch Phone Speak In car screen Listen eroplane TV Billboard Kiosk Games console Think? ???
SLIDE 16 Layout and interactions
– Not the same as resolution
- Instant touch feedback
- Click and mouse hover effects
- Keyboard shortcuts
- Reading experience
– Easier to read narro columns – Paragraph leading and guttering
SLIDE 17
Floed columns
SLIDE 18
Floed columns
SLIDE 19
Scroller
SLIDE 20 Fastclick
- Speed up touch interactions
- Eliminates 300ms lag
<script src='fastclick.js'></script> window.addEventListener('load', function() { new FastClick(document.body); }, false);
SLIDE 21
Connection state Connection state
Or hy online and offline events should not be trusted to anser the question ‘are e online?’
SLIDE 22
navigator.onLine
re you online if?
– You’ve got ifi signal? – You’ve got 3G signal? – If DNS resolves?
If Titter loads?
– ill my site? – ill Facebook?
SLIDE 23
Q: If the value of navigator.onLine is true, hat does that mean? : The device might be online.
SLIDE 24 For hen there’s no connection
– Essential for offline functionality – Just use it to bootstrap your app.
– Great for code and templates
– Shared ith the server – Included in every request
– Great for content
SLIDE 25 Splash ¡screen ¡ Basic ¡CSS ¡/ ¡Fonts ¡ Bootstrap ¡& ¡error ¡handling ¡ Main ¡app ¡code ¡ Main ¡CSS ¡& ¡HTML ¡templates ¡ Authen=ca=on ¡ Text ¡and ¡image ¡content ¡ HTML5 ¡AppCache ¡for ¡ ini=al ¡page ¡load ¡ ¡
- Beware. ¡ ¡AppCache ¡needs ¡
careful ¡handling. ¡ LocalStorage ¡for ¡code ¡ ¡ and ¡templates ¡ Cookies ¡for ¡data ¡shared ¡ with ¡the ¡server ¡ WebSQL ¡/ ¡IndexedDB ¡for ¡ news ¡content ¡
SLIDE 26 Squeezing your bits
- Devices tend to limit HTML5 storage
- Storing images offline:
Base64 encoded data-URIs + UTF-16 storage encoding = Inefficient
SLIDE 27
SLIDE 28 n image storage solution
- 1. Donload images as gzipped base64
- 2. Squeeze 2⅔ base64 characters into one
UTF-16 character
- 3. Push that into the database
- 4. Reverse hen rendering the page
- Go to http://labs.ft.com/ to read more.
SLIDE 29 Tips for coping ith the netork
- Batching your requests
- Prioritise requests
– User requested content first – nalytics last
– Sho feedback fast – Be pessimistic
SLIDE 30 One HTTP request!
- ggressive batching - collect requests
asynchronously:
- Callbacks per action and per group
api.add('getStory', {'path': '/1'}, callback1); api.add('getStory', {'path': '/2'}, callback2); api.send(callback3); api.add('analytics', params, callback4); api.send(callback5);
SLIDE 31
Going native Going native
SLIDE 32 cclimatised users
– Back and Search buttons – Sharing: Intent.ACTION_SEND – idgets – Background content donloading
– Sharing and Search charms – Home screen tile – Nav bar
SLIDE 33
Search on ndroid
SLIDE 34
Search on indos 8
SLIDE 35
Search on iPad
SLIDE 36
Search on iPhone
SLIDE 37 Native rappers
- Invoke same core online eb site
- rapper to eb communication
– via HTML5 postMessage – JavaScript function calls
SLIDE 38 Managing the release process Managing the release process
But ith multiple devices, surely is hard?
SLIDE 39 The Old Days: Branches
Test ¡ Dev ¡ Trunk ¡ Feature ¡“Apple” ¡ Feature ¡“Banana” ¡ Release ¡ to ¡live ¡ Merge ¡ Merge ¡
SLIDE 40 The alternative: Feature flags
- Develop in one place
- Sitch bits of code on and off
- Centralise those sitches
- Don’t associate multiple things to the same flag
function get(flagname) { switch flagname: case 'WidgetEnabled': return isAndroid ... if (Flags.get('WidgetEnabled’)) { ... }
SLIDE 41
Feature flags: Override for testing
Screenshot of flag tool
SLIDE 42 Feature flags: Override for testing
function get(flagname) { flagoverrides = JSON.parse(localstorage.getItem('flags')); if (flagname in flagoverrides) { return flagoverrides[flagname]; } switch flagname: case 'AppleEnabled': return isAndroid ...
SLIDE 43 Feature flags 2.0
- Server-side decisions control client side
behaviour
– Enable /B feature release – Deploy features to different platforms – Push flags to client
- Share flags client and server side
– Get feedback on /B testing
SLIDE 44 Client-side code updates
– Runs hat’s in localStorage – sks the server if there’s a ne version
- llo beta users to get version first
– Donloads it for use next time
- Minimises ppCache aggravation
- Gives us complete control
SLIDE 45
Final points Final points
SLIDE 46
HTML5 sites can be HTML5 sites can be great great But building a good HTML5 But building a good HTML5 site is site is very hard very hard. .
SLIDE 47 “The biggest mistake e made as a company as betting too much on HTML5 as opposed to native,”
“It just asn’t ready”
SLIDE 48 Summary
- Less separation, more adaptation
– Feer, more adaptive ebsites
- Less native, more eb
- HTML5 is NOT just a mobile solution, but a
ay of making better ebsites.
- Responsiveness is not about multiple static
designs, it's a multi-variable equation
SLIDE 49 Summary
- appCache + localStorage + intelligent
bootstrapping + good use of storage = reliable offline app
- You don’t have to sacrifice features
- ith good optimisations you can get a great
app experience
SLIDE 50 e're trying to help
- Your dev team can use our code
– github.com/ftlabs
- e blog about techniques at labs.ft.com
- Talks at conferences like this one
SLIDE 51 “Don’t build “Don’t build native apps native apps, , build
build eb apps eb apps”
SLIDE 52 Thanks
rob@labs.ft.com @FTLabs Do you ant to build this stuff? Join in. jobs@labs.ft.com
Image ¡credits:: ¡ ¡ hOp://cdn3.worldcarfans.co/2008/2/medium/9080214.017.Mini1L.jpg, ¡ ¡hOp://www.netbasic.com/blog/2008/10/mini-‑car-‑parking-‑fail, ¡hOp://runningstopsigns.files.wordpress.com/ 2011/04/smart-‑car.jpg ¡ ¡