EmpireJS 2012
Mobile Apps: Finding the balance between
       performance and flexibility


         Tom Germeau - @tomg
            chartbeat.com
Hi. I’m Tom.
I DESIGN & ENGINEER AT CHARTBEAT
Joost
              2007 - 2009

 STANDALONE JS/SVG BASED VIDEO PLAYER
SAME CHALLENGE AS TODAY: KEEP UI SNAPPY
Chartbeat
REALTIME ANALYTICS. JS EVERYWHERE. DEMO!
The goal
A BETTER MOBILE DASHBOARD
to do
Coming up ...
     Our constraints
  Choosing a framework
     Making it work
  Layers & performance
     Other Web tech
5 weeks
   FROM MOCKUPS TO APPSTORE.
BUT HAVE OTHER PLATFORMS IN MIND.
JS+Python Shop
AND WE WANT TO KEEP THINGS SIMPLE
HTML5/JS is so 2011
 AT LEAST THAT’S WHAT ZUCKERBERG SAID




      * Our Biggest Mistake Was Betting Too Much On HTML5
WHAT HE ACTUALLY MEANT ...
The tool didn’t fit the job anymore
    A CHANGE IN REQUIREMENTS MADE
     AN HTML ONLY APP INSUFFICIENT
Full native App
 UNKNOWN & TOO ADVANCED
     DIDN’T FIT THE JOB
Cordova
ONE BLANK WEBVIEW.
 DIDN’T FIT THE JOB.
Cocoa Touch
 EASILY HANDLE ADVANCED
 GESTURES AND NAVIGATION
HTML & JS
FORMATTING AND STYLING
SCRIPTING INTERACTIONS
HTML & JS
DUH. REUSE LARGE AMOUNTS OF CODE/ASSETS
           ON OTHER PLATFORMS
Thin native wrapper
 THE SWEET SPOT: SCRIPTABLE VIEWDECK
       WITH MULTIPLE WEBVIEWS
Implementation
  WE PICKED A PLATFORM
     LET’S BUILD ON IT
Native Stack

      ViewDeck (open source)

*
    NavigationController (cocoa)


*        UIWebView (cocoa)
Closure Compiler
      SANITY CHECK CODE &
 PROVIDES SIMPLE MODULE SYSTEM
App startup

                       UIWebView

                       /mobile/dashboard.html
                       /js/v123-app.js
                       new chartbeat.Dashboard()

                                       dashboard ready
UIWebView              UIWebView                   UIWebView

/mobile/menu.html      /mobile/page.html           /mobile/traffic.html
/js/v123-app.js        /js/v123-app.js             /js/v123-app.js
new chartbeat.Menu()   new chartbeat.Page()        new chartbeat.Traffic()
Scripting the wrapper
   CONFIGURING AND NAVIGATING
        WEBVIEWS FROM JS
Scripting the wrapper
 chartbeat.mobile.exec('navigate', {
   'target': 'left',
   'url': '../menu/#state=loggedin’
 });
 // communicate using hashchangeevents
Managing rendering
   REALTIME DATA MAKES OUR
   DOM CHANGE CONSTANTLY
One big Layer
HA-BROWSERS WILL DIVIDE YOUR PAGE
     IN ARBITRARY SQUARE TILES
Layers
div {
  transform: translateZ(0);
  /* move div to own compositing layer
   * to hint heavily updated areas
   */
}
Layers
 UPDATE ASPECTS OF YOUR COMPOSITION
WITHOUT RUNNING LAYOUT AND RENDERERS
Layers
WATCH OUT FOR UNWANTED MODE SWITCHES

          ANIMATED OPACITY,
      ADDING/REMOVING STYLES, ...
Filters
div {
  filter: hue-rotate(120deg);
  /* move div to own compositing layer */
  /* not a lot of support yet */
}
Zen of Performance
MINIMUM LAYER COUNT VS MINIMUM REDRAWS
Zen of Performance
 MORE MEMORY, SMOOTHER EXPERIENCE,
  EASIER TO CODE UNTIL YOU RUN OUT
Native Scroll
-webkit-overflow-scrolling: touch;
/* iOS5+ */
/* <iOS4 fall back to Scrollability */
SVG/CSS vs Canvas
       OR HOW WE BUILT
   A BATTERY FRIENDLY GAUGE
SVG/CSS vs Canvas


 ONE DRAW. TONS OF REDRAWS. DEMO!
SVG/CSS vs Canvas
 background:         radial-gradient(...);
 mask:               url(gauge.svg);
 transform-origin:   center center;
 transform:          rotate(-124deg);
 transition:         all 1.5s ease

 /* does not trigger redraw on animation */
App lifecycle
APPS DON’T REALLY (ALWAYS) QUIT
Cheap SSL Login
  JUST CREDENTIALS OVER CORS
Avoid getting ‘jetsammed’
HANDLE IOS MEMORY PRESSURE NOTIFICATIONS
Avoid getting ‘jetsammed’
  BE ABLE TO CON/DESTRUCT YOUR VIEW
    FROM YOUR MODEL AT ALL TIMES
DevTools & Simulator
  // iOS5 - Chromium 12
  [WebView _enableRemoteInspector]

  // iOS6 - Safari 6
  // works out of the box!!
Thank you
Chartbeat.com/jobs

     @tomg
Credits
https://developers.google.com/closure/compiler/

http://nerds.airbnb.com/box-shadows-are-expensive-to-paint

http://www.chromium.org/developers/design-documents/gpu-
accelerated-compositing-in-chrome

http://www.html5rocks.com/en/tutorials/filters/understanding-css/

http://joehewitt.com/2011/10/05/fast-animation-with-ios-webkit

http://atnan.com/blog/2011/11/17/enabling-remote-debugging-via-
private-apis-in-mobile-safari/

http://joehewitt.com/2011/10/05/fast-animation-with-ios-webkit

Tom Germeau: Mobile Apps: Finding the balance between performance and flexibility