39
Scalable JavaScript Applications Dmytro Tarasenko April 2012

Scalable java script applications

Embed Size (px)

DESCRIPTION

Presentation about big JavaScript application design and architecture.

Citation preview

Page 1: Scalable java script applications

Scalable JavaScriptApplications

Dmytro Tarasenko

April 2012

Page 2: Scalable java script applications

Agenda

• JavaScript trend• OOP in JavaScript• MVC• Application entities• MVC Example• Layers• Best practices

Page 3: Scalable java script applications

JS Trend: Languages evolution

OOPC++, Java, C#, Python

StructuredC, Pascal, Algol, Ada

Assemblers

Machine code

Page 4: Scalable java script applications

JS Trend: JavaScript evolution

Big frameworksDojo, ExtJs, YUI

Small librariesBackbone, Midori, MochiKit

Self created libraries

DOM, BOM oriented

Page 5: Scalable java script applications

JS Trend: Big applications

Why JS environment has been changing?

Because of big WEB applications

Page 6: Scalable java script applications

OOP: Abstraction

Single page application

Classes, modules, layers

HTML, CSS, DOM and BOM abstraction

Page 7: Scalable java script applications

OOP: Classes

JavaScript Expert

Come

nameextensionconstructordestructorconfigurationmixinsrequirespublics/privates statics

Page 8: Scalable java script applications

OOP: Class definition

JavaScript Expert

Come

Ext.define('MyClass', {    extend  : 'MyBaseClass', requires: 'MyClass2', method : Ext.emptyFn, statics : { prop: 123, func: Ext.emptyFn }});

Page 9: Scalable java script applications

OOP: Class usage

JavaScript Expert

Come

var mc = Ext.create('MyClass');

mc.methodFromMyBaseClass();mc.method();

MyClass.func();      // static functionMyClass.prop; // 123

Page 10: Scalable java script applications

MVC

Page 11: Scalable java script applications

MVC: Model

• Data container;• CRUD operations;• Only data related logic;• Uses alone and in stores;• Controlled by a controller

Page 12: Scalable java script applications

MVC: View

• Data representation• Validations• View logic• Stand alone widgets• Controlled by controller

Page 13: Scalable java script applications

MVC: Controller

Page 14: Scalable java script applications

Application entities

App

Reader

Writer

Locale

MVC

Static Data

Store

Utils

Mixins

Config

Plugins

Page 15: Scalable java script applications

Application entities: Reader

App

Reader

Writer

Locale

MVC

Static Data

Store

Utils

Mixins

Config

Plugins• Converts server data to JSON• Preprocesses data• Decodes data• Used in models and stores

Page 16: Scalable java script applications

Application entities: Writer

App

Reader

Writer

Locale

MVC

Static Data

Store

Utils

Mixins

Config

Plugins

• Converts data from JSON to server format• Postprocesses data• Encodes data• Used in models and stores

Page 17: Scalable java script applications

Application entities: Locale

App

Reader

Writer

Locale

MVC

Static Data

Store

Utils

Mixins

Config

Plugins

• English to Russian translation• Loads and stores language database• __(‘String’) method• Used everywhere

Page 18: Scalable java script applications

Application entities: MVC

App

Reader

Writer

Locale

MVC

Static Data

Store

Utils

Mixins

Config

Plugins

• Model View Controller pattern

Page 19: Scalable java script applications

Application entities: Static Data

App

Reader

Writer

Locale

MVC

Static Data

Store

Utils

Mixins

Config

Plugins

• Splits data and logic• Used in stores, templates, ...

Page 20: Scalable java script applications

Application entities: Store

App

Reader

Writer

Locale

MVC

Static Data

Store

Utils

Mixins

Config

Plugins

• Stores array of models• Filterable• Sortable• CRUD operations• Usage: Grids, Lists, Trees, …

Page 21: Scalable java script applications

Application entities: Utils

App

Reader

Writer

Locale

MVC

Static Data

Store

Utils

Mixins

Config

Plugins

• Shared functions• Shared properties• Shared classes• Constants• Used everywhere

Page 22: Scalable java script applications

Application entities: Mixins

App

Reader

Writer

Locale

MVC

Static Data

Store

Utils

Mixins

Config

Plugins • Multiple inheritance emulation• Similar to class• Used in other classes

Page 23: Scalable java script applications

Application entities: Configuration

App

Reader

Writer

Locale

MVC

Static Data

Store

Utils

Mixins

Config

Plugins • Affects the entire application• Contains shared options• Used in classes

Page 24: Scalable java script applications

Application entities: Plugins

App

Reader

Writer

Locale

MVC

Static Data

Store

Utils

Mixins

Config

Plugins • Works like a mixin, but has a visual part• Adds small visual effect to view• Used in every view

Page 25: Scalable java script applications

Application entities: File structure

Page 26: Scalable java script applications

MVC Example

Page 27: Scalable java script applications

MVC Example

Page 28: Scalable java script applications

MVC Example: Views

FeedListArticleListArticlePreview

Page 29: Scalable java script applications

MVC Example: Controllers

FeedArticle

Page 30: Scalable java script applications

MVC Example: Models

FeedArticle

Page 31: Scalable java script applications

MVC Example: Stores

FeedArticle

Page 32: Scalable java script applications

MVC Example: FeedList view

Ext.define('FV.view.FeedList', { extend: 'Ext.panel.Panel', alias : 'widget.feedlist',

initComponent: function() { this.items = [{ xtype: 'dataview', store: this.store }]; this.callParent(arguments); }});

Page 33: Scalable java script applications

MVC Example: Feed controllerExt.define('FV.controller.Feed', { extend: 'Ext.app.Controller', stores: ['FV.store.Article'], models: ['FV.model.Feed'],

init: function() { this.control({ 'feedlist dataview': { selectionchange: this.loadFeed } }); }, loadFeed: function(selModel, selected) { var store = this.getArticlesStore(); var feed = selected[0]; store.load({params: {feed: feed.get('url')}}); }});

Page 34: Scalable java script applications

MVC Example: Feed model

Ext.define('FV.model.Feed', {extend: 'Ext.data.Model',fields: [

{name: 'url', type: 'string'},

{name: 'name', type: 'string'}

]});

Page 35: Scalable java script applications

MVC Example: Feed store

Ext.define('FV.store.Feed', {extend: 'Ext.data.Store',model : 'FV.model.Feed',data : [ {name: 'Sencha Blog', url: '…'}, {name: 'Sencha Forums', url: '…'}, {name: 'Ajaxian', url: '…'}]

});

Page 36: Scalable java script applications

LayersConcrete app

(App NS)

Reusable layer(XXX NS)

Base library(Ext NS)

Browser(window NS)

Page 37: Scalable java script applications

Scalable consists of…

• OOP (architecture and design patterns)• Program entities (store, reader, writer,…)• Class loose coupling

Page 38: Scalable java script applications

Best practices

• Documented code conventions (JsDuck)• MVC• Class loose coupling• Code Repository (SVN, Git)• Code review• Every day refactoring• Architect• Project knowledge sharing (dashboard)• Unit tests

Page 39: Scalable java script applications

Questions

?