agenda - jazoon...• on ios, the default webview is a uiwebview; • ember-cordova will default to...

50
Agenda 1) Preamble; 2) Cordova / Ember ecosystem; 3) ember-cordova; 4) Build an app together; 5) Performance & Optimization;

Upload: others

Post on 11-Jan-2020

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Agenda - Jazoon...• 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

Agenda

• 1) Preamble;

• 2) Cordova / Ember ecosystem;

• 3) ember-cordova;

• 4) Build an app together;

• 5) Performance & Optimization;

Page 2: Agenda - Jazoon...• 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

whoami

Page 3: Agenda - Jazoon...• 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

Isle of Code

• Toronto based;

• Focused on Ember, Cordova & Electron;

Page 4: Agenda - Jazoon...• 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

Why Cordova & Ember

• Because Ember;

• Cost;

• Hiring;

• Developer sanity;

• Single source;

• Speed of development;

Page 5: Agenda - Jazoon...• 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

Ember

• Framework for ambitious applications;

• We like it because it forces a very organized approach

to large applications;

• Glimmer2 can out benchmark React. Without having a

shit slinging contest, Ember is not ‘slower’;

• Items like Routing, Controllers, Components are all

first class. CLI is standardized and add ons are easy;

• We’ll tour an Ember app in the demo;

Page 8: Agenda - Jazoon...• 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

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 9: Agenda - Jazoon...• 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

Cordova v PhoneGap

• PhoneGap was initially started in ~2008;

• In 2011, Adobe punched Nitobi;

• The open-source version was then called

Cordova;

• PhoneGap describes a productized version of

Cordova;

Page 10: Agenda - Jazoon...• 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
Page 11: Agenda - Jazoon...• 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

What does Cordova do?

• Creates an app, which is a full screen WebView;

• Adds a relatively stable api to a window.cordova

object;

• Each platform is added manually (e.g. cordova-

ios, cordova-android);

Page 12: Agenda - Jazoon...• 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

Platforms

• Handling its own build process;

• Creating a native application that is a WebView;

• Including cordova.js for the platform;

• Defining each window.cordova function as

required;

Page 13: Agenda - Jazoon...• 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

Plugins

• Similar to platforms;

• Generally defined a window.foo API in common

JS, and bindings to each platform manallly;

• To find plugins:

https://cordova.apache.org/plugins/

Page 14: Agenda - Jazoon...• 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

cordova-cli cordova-lib app

platform ios

platform android

plugin camera

plugin network

Page 15: Agenda - Jazoon...• 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
Page 16: Agenda - Jazoon...• 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

cordova-build

• Runs internal tasks like prepare & validations;

• Looks for the API path:

• platforms/$platformName/cordova/Api.js

• Triggers a platform specific build, and copies

your assets from www to

platforms/$platformName/platform_www;

Page 17: Agenda - Jazoon...• 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

In the old days

Page 19: Agenda - Jazoon...• 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

ember-cordova

• Library for packaging Ember/Cordova

applications together;

• Also includes support for:

• live reload;

• icon/splash generation;

• growing ecosystem of plugins;

Page 20: Agenda - Jazoon...• 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

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 need to publish best practices);

Page 21: Agenda - Jazoon...• 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

ember-cordova

cordova-lib app

platform ios

platform android

plugin camera

plugin network

ember-

cordova ember-cdv-plugin

Page 22: Agenda - Jazoon...• 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

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 23: Agenda - Jazoon...• 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

Crosswalk

• https://crosswalk-project.org;

• For Android;

• Increases app size by ~20mb;

• ~5-10x speed improvement on older devices.

Especially 4.x;

• Consistent browser environment for stuff like css;

Page 24: Agenda - Jazoon...• 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

Build Together

Page 25: Agenda - Jazoon...• 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

Cordova serves from file urls

ember-cordova will warn you if this is not ‘hash’;

config/environment.js

Page 26: Agenda - Jazoon...• 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

• App already has:

• A basic top menu;

• A big index of ‘users’;

• A button which re-shuffles to new users;

Build app together

Page 27: Agenda - Jazoon...• 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

Hammer Example

Page 28: Agenda - Jazoon...• 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

Ghost Clicks

Page 29: Agenda - Jazoon...• 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
Page 30: Agenda - Jazoon...• 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

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 31: Agenda - Jazoon...• 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

Manage Reflows

Page 32: Agenda - Jazoon...• 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

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 33: Agenda - Jazoon...• 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

visibility:hidden

Page 34: Agenda - Jazoon...• 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

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 35: Agenda - Jazoon...• 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

Other Commands

• ember cdv:prepare;

• ember cdv proxy;

Page 36: Agenda - Jazoon...• 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

Hooks

• beforeBuild

• afterBuild

• beforePrepare

• afterPrepare

• Use hooks for any customization, warnings, etc;

• Hooks are just exported functions;

Page 37: Agenda - Jazoon...• 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

Links will not appear as they have been clicked,

just like a native app.

styles/app.css

Page 38: Agenda - Jazoon...• 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

• Mobile Safari raises touch vs click events on

anything but an a link;

Do this or action bindings will not work;

styles/app.css

Page 39: Agenda - Jazoon...• 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

Understand Viewport

Page 40: Agenda - Jazoon...• 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

Fix on Android

• <preference name="android-

windowSoftInputMode" value="adjustPan" />

• <preference name="android-configChanges"

value="orientation|keyboardHidden" />

Page 41: Agenda - Jazoon...• 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

Keyboard

Page 42: Agenda - Jazoon...• 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

Performance & Further

Optimization

Page 43: Agenda - Jazoon...• 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

Further Optimization Tips

• Payload size matters (Glimmer2);

• Flat DOM matters;

Page 45: Agenda - Jazoon...• 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

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

Page 46: Agenda - Jazoon...• 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

Using too much memory

has negative implications

Page 48: Agenda - Jazoon...• 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

Memory Leaks

• Garbage Collection: 2 types:

• Young Generation & Old Generation

Page 49: Agenda - Jazoon...• 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