PhoneGap Day EU 2017: Hybrid Ember Apps

63
PG Day EU Building Phonegap apps with ember-cordova @alexblom

Transcript of PhoneGap Day EU 2017: Hybrid Ember Apps

Page 1: PhoneGap Day EU 2017: Hybrid Ember Apps

PG Day EU

Building Phonegap apps with

ember-cordova

@alexblom

Page 2: PhoneGap Day EU 2017: Hybrid Ember Apps

whoami

Page 3: PhoneGap Day EU 2017: Hybrid Ember Apps

Isle of Code

• Maintainer of ember-cordova;

• Historically wrote backend;

• Toronto based;

• Focused on Ember, Cordova & Electron;

Page 4: PhoneGap Day EU 2017: Hybrid Ember Apps

Why Cordova & Ember

• Because Ember;

• Cost;

• Hiring;

• Developer sanity;

• Single source;

• Speed of development;

Page 5: PhoneGap Day EU 2017: Hybrid Ember Apps

Good Code === Good Hybrid

• Much of making effective mobile is simply writing

good code;

• Desktops let us be lazier;

• JS ecosystem is littered with bad/leaky code;

Page 6: PhoneGap Day EU 2017: Hybrid Ember Apps

Ember.js

• Framework for ambitious applications;

• We like it because it forces a very organized approach

to large applications;

• Items like Routing, Controllers, Components are all first

class citizens. Addons can rely on standard behaviour;

Page 7: PhoneGap Day EU 2017: Hybrid Ember Apps

LTS Cycle

• LTS Release every 12 weeks (e.g. 2.4/2.8/2.12);

• If you don’t need edge features, it allows you to

control and time an upgrade cycle;

• Because everybody is upgrading at once, the

community is focused;

• LTS releases do receive post security updates;

Page 8: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 9: PhoneGap Day EU 2017: Hybrid Ember Apps

Default ember-project

Page 10: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 11: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 12: PhoneGap Day EU 2017: Hybrid Ember Apps

Routing

Page 13: PhoneGap Day EU 2017: Hybrid Ember Apps

Pods

Page 14: PhoneGap Day EU 2017: Hybrid Ember Apps

Components

Page 15: PhoneGap Day EU 2017: Hybrid Ember Apps

ember-data

Page 16: PhoneGap Day EU 2017: Hybrid Ember Apps

ember-data

• Models can be queried with the store service:

• Tools such as mirage allow you to mock dev

responses with the same models;

Page 17: PhoneGap Day EU 2017: Hybrid Ember Apps

Actions

Page 18: PhoneGap Day EU 2017: Hybrid Ember Apps

ember-cordova

Page 19: PhoneGap Day EU 2017: Hybrid Ember Apps

ember-cordova

• Library for packaging Ember/Cordova applications

together;

• Also includes:

• a build CLI;

• live reload;

• icon/splash generation;

• growing ecosystem of plugins;

Page 20: PhoneGap Day EU 2017: Hybrid Ember Apps

ember-cordova

• Is not a UI Library;

• Is not a component library;

• Currently has no opinions on which css

frameworks you should use;

• Does not protect you from bad performance (but

we do publish best practices);

Page 21: PhoneGap Day EU 2017: Hybrid Ember Apps

Improved WebViews

• On iOS, the default WebView is a UIWebView;

• ember-cordova will default to the newer and

more performant WKWebView;

• To disable this default, use the following flag:

• `ember cdv:platform add ios —default-

webview;

Page 22: PhoneGap Day EU 2017: Hybrid Ember Apps

ember-cordova v

react-native

• ember-cordova allows you to recycle web

components for mobile;

• On a first run, you will need to work more for

performance;

• For more complex apps, having standardized

model/routing/component behaviour we find really

useful;

• For smaller apps, pick your favourite;

Page 23: PhoneGap Day EU 2017: Hybrid Ember Apps

Structuring Our App

• When fully recycling an app, we tend to re-

implement layouts but not components;

• Heavy components are an exception;

Page 24: PhoneGap Day EU 2017: Hybrid Ember Apps

Structuring our App

Page 25: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 26: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 27: PhoneGap Day EU 2017: Hybrid Ember Apps

config/environment.js

Page 28: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 29: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 30: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 31: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 32: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 33: PhoneGap Day EU 2017: Hybrid Ember Apps

ember-cordova/splash

Page 34: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 35: PhoneGap Day EU 2017: Hybrid Ember Apps

ember-cordova/events

Page 36: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 37: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 38: PhoneGap Day EU 2017: Hybrid Ember Apps

http://blog.isleofcode.com/the-real-reason-to-avoid-jquery/

Page 39: PhoneGap Day EU 2017: Hybrid Ember Apps

A note on deviceready

• You probably need to use it for any custom

initializers;

• Has special handling. Even if you register the

handler after deviceready fires, it will still be

triggered.

Page 40: PhoneGap Day EU 2017: Hybrid Ember Apps

Feeling Native

Page 41: PhoneGap Day EU 2017: Hybrid Ember Apps

Ghost Clicks

Page 42: PhoneGap Day EU 2017: Hybrid Ember Apps

Links will not appear as they have been clicked,

just like a native app.

styles/app.css

Page 43: PhoneGap Day EU 2017: Hybrid Ember Apps

Manage Reflows

Page 44: PhoneGap Day EU 2017: Hybrid Ember Apps

What causes Reflow?

• Resizing the browser window;

• using JavaScript methods involving computed

styles;

• adding or removing elements from the DOM; and

• changing an element's classes.

• https://developers.google.com/speed/articles/reflo

w

Page 45: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 46: PhoneGap Day EU 2017: Hybrid Ember Apps

Use CSS Transforms

Page 47: PhoneGap Day EU 2017: Hybrid Ember Apps

visibility:hidden

Page 48: PhoneGap Day EU 2017: Hybrid Ember Apps

Animations

Page 49: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 50: PhoneGap Day EU 2017: Hybrid Ember Apps

Animations - Velocity

Page 51: PhoneGap Day EU 2017: Hybrid Ember Apps

Animation Frames

• ~15ms target;

• Taking longer will clog your thread;

• This 15ms target includes the work your browser

needs to do. Best to target ~10;

• Allows the browser to batch animation work;

Page 52: PhoneGap Day EU 2017: Hybrid Ember Apps

Infinite Scrolling

• Occlusion based scroll;

• Smoke & Mirrors:

https://github.com/runspired/smoke-and-mirrors

Page 53: PhoneGap Day EU 2017: Hybrid Ember Apps

http://runspired.github.io/smoke-and-mirrors/#/examples/dbmon

Page 54: PhoneGap Day EU 2017: Hybrid Ember Apps

Using too much memory has

negative implications

http://www-cs.canisius.edu/~hertzm/gcmalloc-oopsla-2005.pdf

Page 55: PhoneGap Day EU 2017: Hybrid Ember Apps

Memory Leaks

• Garbage Collection: 2 types:

• Young Generation & Old Generation

Page 56: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 57: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 58: PhoneGap Day EU 2017: Hybrid Ember Apps
Page 59: PhoneGap Day EU 2017: Hybrid Ember Apps

Name closures for

better profiling

Page 60: PhoneGap Day EU 2017: Hybrid Ember Apps

https://developer.chrome.com/devtools/docs/javascript-memory-profiling

Page 61: PhoneGap Day EU 2017: Hybrid Ember Apps

App size matters

• For Android, 500-750kb target;

• For iOS less of a problem. Served ~2mb without

problems;

https://joreteg.com/blog/viability-of-js-frameworks-on-mobile

http://blog.runspired.com/2016/03/25/the-chrome-distortion-chrome-alters-our-expectations-in-highly-negative-ways/

Page 62: PhoneGap Day EU 2017: Hybrid Ember Apps

• window.performance

• window.performance.mark(‘foo’)

Page 63: PhoneGap Day EU 2017: Hybrid Ember Apps

PG Day EU

Building Phonegap apps with

ember-cordova

@alexblom