44
Large Scale JavaScript applications

Александр Белецкий "Архитектура Javascript приложений"

Embed Size (px)

Citation preview

Page 1: Александр Белецкий "Архитектура Javascript приложений"

Large Scale JavaScriptapplications

Page 2: Александр Белецкий "Архитектура Javascript приложений"

@alexbeletskyhttp://beletsky.nethttp://github.com/alexanderbeletsky

Page 3: Александр Белецкий "Архитектура Javascript приложений"

Big Credits to:

Addy OsmaniAddy Osmani is a rebel JavaScript blogger, speaker and a UI Developer for AOL (yes, we're still around!). He is also a member of the jQuery [Bug Triage/Docs/Front-end] teams where he assists with bugs, documentation and developer evangelism. His recent open-source projects include TodoMVC, which helps developers compare JavaScript MVC frameworks. For more on Addy’s work, check out his official website AddyOsmani.com for tutorials and magazines such as .net for his thoughts and commentaries on the state of the web.

Page 4: Александр Белецкий "Архитектура Javascript приложений"

JavaScript appsevolution

Page 5: Александр Белецкий "Архитектура Javascript приложений"

Early JavaScript application

● Mainly for web design

● Copy/Paste pattern commonly used

● Very poor browser support

● Lack of “community” knowledge base

● Low performace

Page 6: Александр Белецкий "Архитектура Javascript приложений"

Modern JavaScript application

● AJAX era started

● Adoption and respect by masses

● Huge improvement on standard and vendors

● Performance boosted

● New web assembly language

● Expertice & Best practices

Page 7: Александр Белецкий "Архитектура Javascript приложений"

Modern web app: GMail

Page 8: Александр Белецкий "Архитектура Javascript приложений"

Modern web app: Yandex Maps

Page 9: Александр Белецкий "Архитектура Javascript приложений"

Modern web app: Debitoor

Page 10: Александр Белецкий "Архитектура Javascript приложений"

“Modern web appstend to be more (or equaly) complexon front endrather on back end”

Page 11: Александр Белецкий "Архитектура Javascript приложений"

In fact,

JavaScript language is important...

Front-end developmentcould be complex...

Page 12: Александр Белецкий "Архитектура Javascript приложений"

What is Large scale app?

“In my view, large-scale JavaScript apps are non-trivial applications requiring significant developer effort to maintain, where most heavy lifting of data manipulation and display falls to the browser.”

- Addy Osmani

Page 13: Александр Белецкий "Архитектура Javascript приложений"

Complexity is handled by applying architectural approach

Page 14: Александр Белецкий "Архитектура Javascript приложений"

Patterns & Frameworks

Page 15: Александр Белецкий "Архитектура Javascript приложений"

Namespace

Module Facade Mediator Observer

Page 16: Александр Белецкий "Архитектура Javascript приложений"

Namespace pattern

“Namespacing is a technique employed to avoid collisions with other objects or variables in the global namespace”

Goal: avoid names collision and provide facilities to organize blocks of functionality into easily managable groups

Page 17: Александр Белецкий "Архитектура Javascript приложений"

Namespace pattern implementation

Page 18: Александр Белецкий "Архитектура Javascript приложений"

Namespace

Module Facade Mediator Observer

Page 19: Александр Белецкий "Архитектура Javascript приложений"

Module pattern

“The module pattern is a popular design that pattern that encapsulates 'privacy', state and organization using closures”

Goal: It provides a way of wrapping a mix of public and private methods and variables, protecting pieces from leaking into the global scope and accidentally colliding with another developer's interface

Page 20: Александр Белецкий "Архитектура Javascript приложений"

Module pattern implementation

Page 21: Александр Белецкий "Архитектура Javascript приложений"

Namespace

Module Facade Mediator Observer

Page 22: Александр Белецкий "Архитектура Javascript приложений"

Facade pattern

“ The facade pattern provides a convenient higher-level interface to a larger body of code, hiding its true underlying complexity. Think of it as simplifying the API being presented to other developers”

Goal: to hide implementation-specific details about a body of functionality contained in individual modules. The implementation of a module can change without the clients really even knowing about it.

Page 23: Александр Белецкий "Архитектура Javascript приложений"

Facade pattern implementation

Page 24: Александр Белецкий "Архитектура Javascript приложений"

Facade pattern implementation

Provides the open API for the rest of the application

Page 25: Александр Белецкий "Архитектура Javascript приложений"

Namespace

Module Facade Mediator Observer

Page 26: Александр Белецкий "Архитектура Javascript приложений"

Mediator pattern

“ The mediator is a behavioral design pattern that allows us to expose a unified interface through which the different parts of a system may communicate”

Goal: promotes loose coupling by ensuring that instead of components referring to each other explicitly, their interaction is handled through this central point. This can help us decouple systems and improve the potential for component reusability.

Page 27: Александр Белецкий "Архитектура Javascript приложений"

Mediator pattern implementation

Page 28: Александр Белецкий "Архитектура Javascript приложений"

Facade pattern implementation

Subscribe for particular event / Publish this event

Page 29: Александр Белецкий "Архитектура Javascript приложений"

Namespace

Module Facade Mediator Observer

Page 30: Александр Белецкий "Архитектура Javascript приложений"

Observer pattern

“ The Observer is a design pattern which allows an object (known as a subscriber) to watch another object (the publisher), where we provide a means for the subscriber and publisher form a listen and broadcast relationship”

Goal: the promotion of loose coupling. Rather than single objects calling on the methods of other objects directly, they instead subscribe to a specific task or activity of another object and are notified when it occurs.

Page 31: Александр Белецкий "Архитектура Javascript приложений"

Observer pattern implementation

https://gist.github.com/661855

Page 32: Александр Белецкий "Архитектура Javascript приложений"

Observer pattern implementation

Page 33: Александр Белецкий "Архитектура Javascript приложений"

RequireJS and AMD

Page 34: Александр Белецкий "Архитектура Javascript приложений"

RequireJS: file and module loader

Page 35: Александр Белецкий "Архитектура Javascript приложений"

RequreJS: Usage example

Page 36: Александр Белецкий "Архитектура Javascript приложений"

RequireJS: Main script

Page 37: Александр Белецкий "Архитектура Javascript приложений"

RequireJS uses Asynchronous Module Definitionto load modules

Page 38: Александр Белецкий "Архитектура Javascript приложений"

AMD: module example

Page 39: Александр Белецкий "Архитектура Javascript приложений"

Putting thing together

Page 40: Александр Белецкий "Архитектура Javascript приложений"

Proposed Architecture

Module Facade Mediator

RequireJS AMD

● Loosely coupled

● Broken into independent modules

● Flexible (framework agnostic)

Page 41: Александр Белецкий "Архитектура Javascript приложений"

Demo application

Page 42: Александр Белецкий "Архитектура Javascript приложений"

backbone-aura

Page 43: Александр Белецкий "Архитектура Javascript приложений"

Further reading:● Learning JavaScript Design Patterns

http://addyosmani.com/resources/essentialjsdesignpatterns/book/

● Patterns For Large-Scale JavaScript Application Architecturehttp://addyosmani.com/largescalejavascript

● Writing Modular JavaScript With AMD, CommonJS & ES Harmonyhttp://addyosmani.com/writing-modular-js/

● Scalable JavaScript Application Architecturehttp://www.youtube.com/watch?v=vXjVFPosQHw&feature=youtu.be

Page 44: Александр Белецкий "Архитектура Javascript приложений"

Thank you.

http://beletsky.net@alexbeletsky