modular applications with montage components

51
montagejs.org Benoît Marchant [email protected] with Montage Components Modular Applications

Upload: benoit-marchant

Post on 01-Nov-2014

11.808 views

Category:

Technology


0 download

DESCRIPTION

There is a growing demand to build increasingly complex mobile applications with HTML5, in part due to its cross-platform nature. However delivering these applications is still very challenging. The Montage framework was designed from the ground up to build complex HTML5 applications. This talk will explain how Montage’s reusable and encapsulated Components provides a natural and effective way to write modular, robust, applications by allowing team members to work on different part at the same time.

TRANSCRIPT

Page 2: Modular applications with montage components
Page 3: Modular applications with montage components

modules

template

mobile

componentHTML5

encapsulated

MVC

data-binding

promises CommonJS

declarative

BSD

serialization

package

separation of concernsreusable

ECMAScript 5

composition

TEAMworkflow

simplify

write once batterygpucpuapplications

property change

listener

CSS

framework

widgetsflow repetition condition

substitution

text

button

loader

listprogress

slider

inputaudioslot

videocheckbox

radiotoggle

textfield

event

cross-platform

deferred drawing

Page 4: Modular applications with montage components

Mobile Applications

Page 5: Modular applications with montage components
Page 6: Modular applications with montage components
Page 7: Modular applications with montage components

HTML5 vs Native

Page 8: Modular applications with montage components

HTML5 vs Native

Janky User Experience

Page 9: Modular applications with montage components

HTML5 vs Native

Janky User Experience

Longer Development Time

Page 10: Modular applications with montage components

HTML5 vs Native

Janky User Experience

Longer Development Time

Higher Development Cost

Page 11: Modular applications with montage components

HTML5 vs Native

Janky User Experience

Longer Development Time

Higher Development Cost

Harder to Iterate

Page 12: Modular applications with montage components

Modular Applications

Page 13: Modular applications with montage components

Simple Application

Page 14: Modular applications with montage components

Large Application

Page 15: Modular applications with montage components

Large Application

Page 16: Modular applications with montage components

Montage Application

Refactor

Page 17: Modular applications with montage components

Refactor

Montage Application

Page 18: Modular applications with montage components

Popcorn Demo

montagejs.org/apps/popcorn/

Page 19: Modular applications with montage components

Component

Assigned one DOM Element

MVC Structure

From Widget to App Specific

Deferred Drawing

Template

Page 20: Modular applications with montage components

Deferred Drawing

Maximize Performance

Orchestrate DOM Changes

Third Party Components

Degrade Gracefully

willDraw() / draw() / didDraw()

Page 21: Modular applications with montage components

Template

Full HTML5 document

Resource Encapsulation

Object Serialization

Great JS / CSS Team Work

Automatic Dependencies Load

.reelHTML JS CSS

Page 22: Modular applications with montage components
Page 23: Modular applications with montage components

Identify Components

Page 24: Modular applications with montage components

Main ComponentLoads data from Web Service

Relies on sub-components for presentation

Page 25: Modular applications with montage components

Movie Content

Navigation

Page 26: Modular applications with montage components

Movie Content

Navigation

Components establish their own API to accept data through properties

or methods

MainMovie Categories

Event to change CategoryId

Selected CategoryId

Page 27: Modular applications with montage components

MainMovie Categories

Event to change CategoryId

Selected CategoryId

Page 28: Modular applications with montage components

MainMovie Categories

Event to change CategoryId

Selected CategoryId

Page 29: Modular applications with montage components

Movie Content

Page 30: Modular applications with montage components

Movie Content

Flow Component

Movie Detail Component

Page 31: Modular applications with montage components

Movie Detail Component

Flow Component

Movie ContentmoviesController

selectedMovie

Page 32: Modular applications with montage components

<html>...<body> <div data-montage-id="facade-flow" class="facade-flow"> <div data-montage-id="flow" class="flow flow-fade-out"> <div data-montage-id="image" class="Image"></div> </div> <div class="film"></div> <div data-montage-id="details"></div> </div></body></html>

Main.reel/Main.html

Page 33: Modular applications with montage components

<div data-montage-id="facade-flow" class="facade-flow"> <div data-montage-id="flow" class="flow flow-fade-out"> <div data-montage-id="image" class="Image"></div> </div> <div class="film"></div> <div data-montage-id="details"></div> </div>

Markup

Object Serialization<script type="text/montage-serialization">{ "owner": { "properties": { "element": {"#": "facade-flow"} } },

... "flow": { "prototype": "montage/ui/flow.reel", "properties": { "element": {"#": "flow"}, "isSelectionEnabled": false, "cameraFov": 36.99, "cameraTargetPoint": [0, 0, 0], "stride": 1 }, "bindings": { "contentController": {"<-": "@owner.buttonController"} } },

"details": { "prototype": "ui/details.reel", "properties": { "element": {"#": "details"} }, "bindings": { "data": {"<-": "@owner.selectedMovie" } } }}</script>

Page 34: Modular applications with montage components

<div data-montage-id="facade-flow" class="facade-flow"> <div data-montage-id="flow" class="flow flow-fade-out"> <div data-montage-id="image" class="Image"></div> </div> <div class="film"></div> <div data-montage-id="details"></div> </div>

<script type="text/montage-serialization">{ "owner": { "properties": { "element": {"#": "facade-flow"} } },

... "flow": { "prototype": "montage/ui/flow.reel", "properties": { "element": {"#": "flow"}, "isSelectionEnabled": false, "cameraFov": 36.99, "cameraTargetPoint": [0, 0, 0], "stride": 1 }, "bindings": { "contentController": {"<-": "@owner.buttonController"} } },

"details": { "prototype": "ui/details.reel", "properties": { "element": {"#": "details"} }, "bindings": { "data": {"<-": "@owner.selectedMovie" } } }}</script>

Page 35: Modular applications with montage components

"flow": { "prototype": "montage/ui/flow.reel", "properties": { "element": {"#": "flow"}, "cameraFov": 36.99, "cameraTargetPoint": [0, 0, 0], "stride": 1 }, "bindings": { "contentController": {"<-": "@owner.moviesController"} } },

<div data-montage-id="facade-flow" class="facade-flow"> <div data-montage-id="flow" class="flow flow-fade-out"> <div data-montage-id="image" class="Image"></div> </div> <div class="film"></div> <div data-montage-id="details"></div> </div>

Module Id

Page 36: Modular applications with montage components

"flow": { "prototype": "montage/ui/flow.reel", "properties": { "element": {"#": "flow"}, "cameraFov": 36.99, "cameraTargetPoint": [0, 0, 0], "stride": 1 }, "bindings": { "contentController": {"<-": "@owner.moviesController"} } },

<div data-montage-id="facade-flow" class="facade-flow"> <div data-montage-id="flow" class="flow flow-fade-out"> <div data-montage-id="image" class="Image"></div> </div> <div class="film"></div> <div data-montage-id="details"></div> </div>

Setting Property Values

Page 37: Modular applications with montage components

"flow": { "prototype": "montage/ui/flow.reel", "properties": { "element": {"#": "flow"}, "cameraFov": 36.99, "cameraTargetPoint": [0, 0, 0], "stride": 1 }, "bindings": { "contentController": {"<-": "@owner.moviesController"} } },

<div data-montage-id="facade-flow" class="facade-flow"> <div data-montage-id="flow" class="flow flow-fade-out"> <div data-montage-id="image" class="Image"></div> </div> <div class="film"></div> <div data-montage-id="details"></div> </div>

data binding

Page 38: Modular applications with montage components

<div data-montage-id="facade-flow" class="facade-flow"> <div data-montage-id="flow" class="flow flow-fade-out"> <div data-montage-id="image" class="Image"></div> </div> <div class="film"></div> <div data-montage-id="details"></div> </div>

"details": { "prototype": "ui/details.reel", "properties": { "element": {"#": "details"} }, "bindings": { "data": {"<-": "@owner.selectedMovie" } } },

Page 39: Modular applications with montage components

Movie Detail

Page 40: Modular applications with montage components

Movie Detail

Title

SynopsisTrailer Button

Rent Button

Release Date Runtime Audience Critics

Page 41: Modular applications with montage components

Movie Detail Components

DynamicText

DynamicText

DynamicText DynamicText Dynamic Text Dynamic Text

Button

Button

Page 42: Modular applications with montage components

Movie Detail

Title

Description

Date Runtime Audience

Critics

Trailer Button

Rent Button

data.title

data.date

actionEvent

actionEvent

data.criticScore

data.synopsis

data.runtimedata.audienceScore

Page 43: Modular applications with montage components

Trailer Button

action event

Page 44: Modular applications with montage components

"trailerButton": { "prototype": "montage/ui/button.reel", "properties": { "element": {"#": "trailer-button"} }, "listeners": [ { "type": "action", "listener": {"@": "owner"} } ] },

<button data-montage-id="trailer-button">Trailer</button>

Listeners

Page 45: Modular applications with montage components

"trailerButton": { "prototype": "montage/ui/button.reel", "properties": { "element": {"#": "trailer-button"} }, "listeners": [ { "type": "action", "listener": {"@": "owner"} } ] },

<button data-montage-id="trailer-button">Trailer</button>

Object Reference

Page 46: Modular applications with montage components

"trailerButton": { "prototype": "montage/ui/button.reel", "properties": { "element": {"#": "trailer-button"} }, "listeners": [ { "type": "action", "listener": {"@": "owner"} } ] },

handleTrailerButtonAction: { value: function(event) {

...}

}handleAction

handleEvent

Owner EventHandling

MethodPrecedence

Page 47: Modular applications with montage components
Page 48: Modular applications with montage components

Mop it!

Page 49: Modular applications with montage components

Modular Applications

Encapsulated Components

HTML5 Templates

Scale Larger Team/Projects

Shorter Development Time

Easier to Refactor

Page 50: Modular applications with montage components

Q&A

Page 51: Modular applications with montage components

A modern HTML5 framework

montagejs.orgBenoît [email protected]

Fork me on GitHub