app framework — you’ve been wanting this

76
YUI App Framework You’ve Been Wanting This Eric Ferraiuolo @ericf

Upload: eric-ferraiuolo

Post on 20-Jan-2015

4.495 views

Category:

Technology


0 download

DESCRIPTION

A discussion about YUI's App Framework and how this suite of components provides the right type of foundation and structure for you to build your web applications with. We'll discuss the components of the App Framework that were released in 3.4.0, plus the new exciting stuff we've been working on for 3.5.0! Photos Near Me ( http://photosnear.me ) is an application that shows off the power of the App Framework and is using the newest components; the source is available on GitHub at: https://github.com/ericf/photosnear.me.

TRANSCRIPT

Page 1: App framework — You’ve Been Wanting This

YUI App FrameworkYou’ve Been Wanting This

Eric Ferraiuolo@ericf

Page 2: App framework — You’ve Been Wanting This

MVC

Page 3: App framework — You’ve Been Wanting This

♥ Backbone

Page 4: App framework — You’ve Been Wanting This

Model

Page 5: App framework — You’ve Been Wanting This

Y.Model

• Manages data/state

• Observable attributes

• Coalesced change event

• Contains business logic

• Has data-syncing layer

Page 6: App framework — You’ve Been Wanting This

Y.ModelList

foo

foo

foo

foo

foo

foo

foo

set()

1

2

3

4

5

6

7

Page 7: App framework — You’ve Been Wanting This

Y.ModelList

foo

foo

foo

foo

foo

foo

foo

}foo:changeset()

1

2

3

4

5

6

7

Page 8: App framework — You’ve Been Wanting This

View

Page 9: App framework — You’ve Been Wanting This

Y.View

• Containment

• Render-able (you provide rendering logic)

• BYO-Template

• Declarative event subscriptions

• Lightweight

Page 10: App framework — You’ve Been Wanting This

Router

Page 11: App framework — You’ve Been Wanting This

Y.Controller Y.Router

• Basic navigation management

• Uses HTML5 pushState & popstate

• Degrades to hash-based history

• Bookmark-able URLs

• Browser back/forward buttons work!

• Wire-up application states to routes

Page 12: App framework — You’ve Been Wanting This

Y.Router Examplevar router = new Y.Router();

router.route('/library/:lib/', function (req) { var lib = req.params.lib; if (lib === 'yui') { Y.log('YUI Library is awesome!'); }});

router.save('/library/yui/');// => 'YUI Library is awesome!'

Page 13: App framework — You’ve Been Wanting This

Y.Router Examplevar router = new Y.Router();

router.route('/library/:lib/', function (req) { var lib = req.params.lib; if (lib === 'yui') { Y.log('YUI Library is awesome!'); }});

router.save('/library/yui/');// => 'YUI Library is awesome!'

Page 14: App framework — You’ve Been Wanting This

Y.Router Examplevar router = new Y.Router();

router.route('/library/:lib/', function (req) { var lib = req.params.lib; if (lib === 'yui') { Y.log('YUI Library is awesome!'); }});

router.save('/library/yui/');// => 'YUI Library is awesome!'

Page 15: App framework — You’ve Been Wanting This

Y.Router Examplevar router = new Y.Router();

router.route('/library/:lib/', function (req) { var lib = req.params.lib; if (lib === 'yui') { Y.log('YUI Library is awesome!'); }});

router.save('/library/yui/');// => 'YUI Library is awesome!'

Page 16: App framework — You’ve Been Wanting This

Y.Router Examplevar router = new Y.Router();

router.route('/library/:lib/', function (req) { var lib = req.params.lib; if (lib === 'yui') { Y.log('YUI Library is awesome!'); }});

router.save('/library/yui/');// => 'YUI Library is awesome!'

Page 17: App framework — You’ve Been Wanting This

Y.Router Examplevar router = new Y.Router();

router.route('/library/:lib/', function (req) { var lib = req.params.lib; if (lib === 'yui') { Y.log('YUI Library is awesome!'); }});

router.save('/library/yui/');// => 'YUI Library is awesome!'

Page 18: App framework — You’ve Been Wanting This

Y.Router Mechanics

Y.Router

Y.History

history:change

popstate

hashchange

pushState()

save/replace()

Page 19: App framework — You’ve Been Wanting This

Built on Solid Core

•Y.Base

•Y.Attribute

•Y.EventTarget

•Y.io

•Y.JSON

•Y.Array

•Y.ArrayList

•Y.Node

•Y.History

Page 20: App framework — You’ve Been Wanting This

4.6KB

Page 21: App framework — You’ve Been Wanting This

BIGCommunity Adoption

Page 22: App framework — You’ve Been Wanting This

What’s ComingApp Framework — 3.5.0

Page 23: App framework — You’ve Been Wanting This

Y.App

Page 24: App framework — You’ve Been Wanting This

Foundation and Structure

Page 25: App framework — You’ve Been Wanting This

Sample Users Appvar usersApp = new Y.App({ views: { users: { type : Y.UsersView, preserve: true },

user: { type : Y.UserView, parent: 'users' } }});

Page 26: App framework — You’ve Been Wanting This

Sample Users Appvar usersApp = new Y.App({ views: { users: { type : Y.UsersView, preserve: true },

user: { type : Y.UserView, parent: 'users' } }});

Page 27: App framework — You’ve Been Wanting This

Sample Users Appvar usersApp = new Y.App({ views: { users: { type : Y.UsersView, preserve: true },

user: { type : Y.UserView, parent: 'users' } }});

Page 28: App framework — You’ve Been Wanting This

Sample Users Appvar usersApp = new Y.App({ views: { users: { type : Y.UsersView, preserve: true },

user: { type : Y.UserView, parent: 'users' } }});

Page 29: App framework — You’ve Been Wanting This

Sample Users Appvar usersApp = new Y.App({ views: { users: { type : Y.UsersView, preserve: true },

user: { type : Y.UserView, parent: 'users' } }});

Page 30: App framework — You’ve Been Wanting This

Sample Users Appvar users = new Y.UsersList();

usersApp.route('/user/', function () { this.showView('users', {modelList: users});});

usersApp.route('/user/:id/', function (req) { var user = users.getById(req.params.id); this.showView('user', {model: user}, function (view) { // Called after transition. });});

Page 31: App framework — You’ve Been Wanting This

Sample Users Appvar users = new Y.UsersList();

usersApp.route('/user/', function () { this.showView('users', {modelList: users});});

usersApp.route('/user/:id/', function (req) { var user = users.getById(req.params.id); this.showView('user', {model: user}, function (view) { // Called after transition. });});

Page 32: App framework — You’ve Been Wanting This

Sample Users Appvar users = new Y.UsersList();

usersApp.route('/user/', function () { this.showView('users', {modelList: users});});

usersApp.route('/user/:id/', function (req) { var user = users.getById(req.params.id); this.showView('user', {model: user}, function (view) { // Called after transition. });});

Page 33: App framework — You’ve Been Wanting This

Sample Users Appvar users = new Y.UsersList();

usersApp.route('/user/', function () { this.showView('users', {modelList: users});});

usersApp.route('/user/:id/', function (req) { var user = users.getById(req.params.id); this.showView('user', {model: user}, function (view) { // Called after transition. });});

Page 34: App framework — You’ve Been Wanting This

Sample Users Appvar users = new Y.UsersList();

usersApp.route('/user/', function () { this.showView('users', {modelList: users});});

usersApp.route('/user/:id/', function (req) { var user = users.getById(req.params.id); this.showView('user', {model: user}, function (view) { // Called after transition. });});

Page 35: App framework — You’ve Been Wanting This

Sample Users Appvar users = new Y.UsersList();

usersApp.route('/user/', function () { this.showView('users', {modelList: users});});

usersApp.route('/user/:id/', function (req) { var user = users.getById(req.params.id); this.showView('user', {model: user}, function (view) { // Called after transition. });});

Page 36: App framework — You’ve Been Wanting This

Sample Users Appvar users = new Y.UsersList();

usersApp.route('/user/', function () { this.showView('users', {modelList: users});});

usersApp.route('/user/:id/', function (req) { var user = users.getById(req.params.id); this.showView('user', {model: user}, function (view) { // Called after transition. });});

Page 37: App framework — You’ve Been Wanting This

Enhanced Navigation

Page 38: App framework — You’ve Been Wanting This

Enhanced Navigation

Page 39: App framework — You’ve Been Wanting This
Page 40: App framework — You’ve Been Wanting This

pushState + Ajax = pjax

Page 41: App framework — You’ve Been Wanting This

pushState + Ajax = pjax• Handles link clicks

• Update full URL

• Dynamically load & render content

• Ajax !=== XHR

• Browser’s Back/Forward buttons work!

• Seamless

Page 42: App framework — You’ve Been Wanting This

Y.Router

Y.History

Y.PjaxBase

Y.Pjax

Y.Pjax

Page 43: App framework — You’ve Been Wanting This

Server

Y.Pjax

Y.Pjax Mechanics

navigate()

XHR

link click DOM

setContent()

Page 44: App framework — You’ve Been Wanting This

Recap Y.App• Is a View

• Is a Router

• Uses PjaxBase

• Has an activeView

• Manages View lifecycles & transitions

• Instantiate or sub-class

Page 45: App framework — You’ve Been Wanting This

Templating

Page 46: App framework — You’ve Been Wanting This

{{#with handlebars}}

Page 47: App framework — You’ve Been Wanting This

Handlebars Templates<script id="entry-template" type="text/x-handlebars-template"> <div class="entry"> <h1><{{title}}</h1> {{#if author}} <p class="author">{{author}}</p> {{/if}} <div class="body">{{body}}</div> </div> </script>

Page 48: App framework — You’ve Been Wanting This

Handlebars Templates<script id="entry-template" type="text/x-handlebars-template"> <div class="entry"> <h1><{{title}}</h1> {{#if author}} <p class="author">{{author}}</p> {{/if}} <div class="body">{{body}}</div> </div> </script>

Page 49: App framework — You’ve Been Wanting This

Handlebars Templates<script id="entry-template" type="text/x-handlebars-template"> <div class="entry"> <h1><{{title}}</h1> {{#if author}} <p class="author">{{author}}</p> {{/if}} <div class="body">{{body}}</div> </div> </script>

Page 50: App framework — You’ve Been Wanting This

Handlebars Templates<script id="entry-template" type="text/x-handlebars-template"> <div class="entry"> <h1><{{title}}</h1> {{#if author}} <p class="author">{{author}}</p> {{/if}} <div class="body">{{body}}</div> </div> </script>

Page 51: App framework — You’ve Been Wanting This

Handlebars Templates<script id="entry-template" type="text/x-handlebars-template"> <div class="entry"> <h1><{{title}}</h1> {{#if author}} <p class="author">{{author}}</p> {{/if}} <div class="body">{{body}}</div> </div> </script>

Page 52: App framework — You’ve Been Wanting This

Handlebars Templates<script id="entry-template" type="text/x-handlebars-template"> <div class="entry"> <h1><{{title}}</h1> {{#if author}} <p class="author">{{author}}</p> {{/if}} <div class="body">{{body}}</div> </div> </script>

Page 53: App framework — You’ve Been Wanting This

Handlebars Templates<script id="entry-template" type="text/x-handlebars-template"> <div class="entry"> <h1><{{title}}</h1> {{#if author}} <p class="author">{{author}}</p> {{/if}} <div class="body">{{body}}</div> </div> </script>

Page 54: App framework — You’ve Been Wanting This

Y.HandlebarsYUI().use('handlebars', 'node-base', function (Y) { var template = Y.one('#entry-template').getContent(), render = Y.Handlebars.compile(template), entry = { title : 'The Adventures of Tom Selleck', body : 'Tom crossed the river in his Ferrari…', author: 'Ryan Grove' }; Y.one('#entry').setContent(render(entry)); });

Page 55: App framework — You’ve Been Wanting This

Y.HandlebarsYUI().use('handlebars', 'node-base', function (Y) { var template = Y.one('#entry-template').getContent(), render = Y.Handlebars.compile(template), entry = { title : 'The Adventures of Tom Selleck', body : 'Tom crossed the river in his Ferrari…', author: 'Ryan Grove' }; Y.one('#entry').setContent(render(entry)); });

Page 56: App framework — You’ve Been Wanting This

Y.HandlebarsYUI().use('handlebars', 'node-base', function (Y) { var template = Y.one('#entry-template').getContent(), render = Y.Handlebars.compile(template), entry = { title : 'The Adventures of Tom Selleck', body : 'Tom crossed the river in his Ferrari…', author: 'Ryan Grove' }; Y.one('#entry').setContent(render(entry)); });

Page 57: App framework — You’ve Been Wanting This

Y.HandlebarsYUI().use('handlebars', 'node-base', function (Y) { var template = Y.one('#entry-template').getContent(), render = Y.Handlebars.compile(template), entry = { title : 'The Adventures of Tom Selleck', body : 'Tom crossed the river in his Ferrari…', author: 'Ryan Grove' }; Y.one('#entry').setContent(render(entry)); });

Page 58: App framework — You’ve Been Wanting This

Y.HandlebarsYUI().use('handlebars', 'node-base', function (Y) { var template = Y.one('#entry-template').getContent(), render = Y.Handlebars.compile(template), entry = { title : 'The Adventures of Tom Selleck', body : 'Tom crossed the river in his Ferrari…', author: 'Ryan Grove' }; Y.one('#entry').setContent(render(entry)); });

Page 59: App framework — You’ve Been Wanting This

Y.HandlebarsYUI().use('handlebars', 'node-base', function (Y) { var template = Y.one('#entry-template').getContent(), render = Y.Handlebars.compile(template), entry = { title : 'The Adventures of Tom Selleck', body : 'Tom crossed the river in his Ferrari…', author: 'Ryan Grove' }; Y.one('#entry').setContent(render(entry)); });

Page 60: App framework — You’ve Been Wanting This

Server-Side

Page 61: App framework — You’ve Been Wanting This
Page 62: App framework — You’ve Been Wanting This

Guides

Page 63: App framework — You’ve Been Wanting This

Photos Near Mehttp://photosnear.me

Page 64: App framework — You’ve Been Wanting This

Photos Near Me• Built with App Framework

• Uses Y.App and Y.Handlebars

• ~ 650 Lines of JavaScript

• Responsive Design

• http://photosnear.me

• https://github.com/ericf/photosnear.me

Page 65: App framework — You’ve Been Wanting This
Page 66: App framework — You’ve Been Wanting This

PhotosNearMe (Y.App)

Page 67: App framework — You’ve Been Wanting This

Place (Y.Model)

Photos (Y.ModelList)

PhotosNearMe (Y.App)

Page 68: App framework — You’ve Been Wanting This

GridView (Y.View)

PhotosNearMe (Y.App)

Page 69: App framework — You’ve Been Wanting This
Page 70: App framework — You’ve Been Wanting This

PhotosNearMe (Y.App)

Page 71: App framework — You’ve Been Wanting This

Photo (Y.Model)

PhotosNearMe (Y.App)Place (Y.Model)

Page 72: App framework — You’ve Been Wanting This

LightboxView (Y.View)

PhotosNearMe (Y.App)

Page 73: App framework — You’ve Been Wanting This

Future…App Framework — 3.6.0+

Page 74: App framework — You’ve Been Wanting This

Dealing with Data• Improved data access

• Model sync layers

• Data binding

Page 75: App framework — You’ve Been Wanting This

Breadth & Depth• View extensions & plugins

• View-based widgets

• More mobile

• More server

Page 76: App framework — You’ve Been Wanting This

Questions?Ask away!

Eric Ferraiuolo@ericf