105
Dr. Sabin Buragawww.purl.org/net/busaco Dezvoltarea aplicațiilor Web la nivel de client {☸} inginerie software în contextul JavaScript

CLIW 2014—2015 (9/12): Ingineria dezvoltării aplicaţiilor JavaScript

Embed Size (px)

Citation preview

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Dezvoltarea aplicațiilor Webla nivel de client

{☸}inginerie software în contextul JavaScript

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

“There are two ways to write error-free programs; only the third one works.”

Alan J. Perlis

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Ce instrumente software și biblioteci JavaScriptpot fi folosite în contextul programării Web

la nivel de client?

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Editare de cod și dezvoltare de aplicații WebDepanare

TestareDocumentare a codului

CompresieOptimizare

instrumente

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Editoare + medii integrate (IDE) pentru desktop: Aptana Studio, JS Development Tools (plug-in Eclipse),

Sublime Text, Visual Studio, WebStorm

Disponibile pe Web – în cloud: Cloud9 IDE, Codepen, Codio, JS Bin, JS Fiddle, Plunker,…

unele oferă și partajarea codului-sursă cu alți dezvoltatori

instrumente: editare

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Utilizarea consolei JSobiectul console oferit de browser

metode utile: log (), error(), warn(), info(),time(), timeEnd(), trace(), group(), groupEnd()

https://developer.mozilla.org/docs/DOM/console

instrumente: depanare

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Firebug (Lite)http://getfirebug.com/

a se considera și instrumentele de depanareincluse în navigatoarele Web moderne

instrumente: depanare

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Verificarea corectitudinii codului JavaScript

construcția "use strict"; indică interpretoruluică se va utiliza varianta strictă a limbajului

disponibilă începând cu ECMAScript versiunea 5

instrumente: testare

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Verificarea corectitudinii codului JavaScript

erorile de programare (e.g., crearea accidentalăa variabilelor globale, nume identice de proprietăți etc.)

vor conduce la emiterea de excepții

"use strict";

variabilaAiurea = "Ah! "; // emite ReferenceError

var obiect = { prop: 1, prop: 2 }; // eroare de sintaxă

instrumente: testare

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Verificarea corectitudinii codului JavaScript

sunt interzise diverse facilități: numere exprimate în baza 8,

folosirea construcțiilor with, arguments.callee

etc.

instrumente: testare

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Modul de procesare strict:

modifică semantica programelor

nu este impus de vreun browser Web

instrumente: testare

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Verificare statică

instrumente de referință: JSLint – http://www.jslint.com/

JSHint – http://www.jshint.com/

instrumente: testare

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

instrumente: testare

opțiuniJSHint

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Suport pentru unit testing

exemplificări:Jasmine

JSTest.NETQUnit

Sinon.jsTyrtle

instrumente: testare

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Testare cross-browser a aplicațiilor Web

instrumente disponibile gratuitAdobe BrowserLab, Browsera, BrowserShots,

Microsoft SuperPreview, Spoon Browser Sandbox,…

aplicații comerciale – exemplificări:BrowserStack, Cloud Testing, CrossBrowserTesting

instrumente: testare

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Standarde de redactare a codului JavaScript

exemple:Crock’s Code Conventions for JavaScript

Google JavaScript Style GuideIdiomatic.js

ghiduri specifice – e.g., jQuery Core Style Guide

instrumente: documentarea codului

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

documentarea codului: JSDoc Toolkit – http://usejsdoc.org/

define ('my/shirt', function () {/*** A module representing a shirt.* @exports my/shirt* @version 1.0*/var shirt = {

/** A property of the module. */color: "black",

/** @constructor */Turtleneck: function(size) {

/** A property of the class. */this.size = size;

}};return shirt;

});

marcaje (adnotări) speciale în cadrul comentariilor:

@abstract

@access

@extends

@callback

@event

@emits

@function

@property

@module

@global

@author

@copyright

@summary

@since

@see

@todo

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Instrumente privind compresia/minimizarea

Online Javascript Compression ToolYUI Compressor

Scriptalizer

detalii în articolul A. Powell, Understanding Compression and Minification (mai 2012):

www.aaron-powell.com/javascript/understanding-compression-and-minification

instrumente: compresie de cod

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Transformarea codului JS într-unul optimizat

exemplu de referință:Closure Compiler

https://developers.google.com/closure/

instrumente: optimizare javascript

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Managementul de pachete JavaScript pentrudezvoltarea de aplicații Web la nivel de client

căutare, instalare, compilare, verificare a dependențelor

un exemplu notoriu:Bower – http://bower.io/

instrumente: pachete

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Suport pentru fluxuri de activități (workflow-uri), eventual realizate automat

exemple: Grunt, Yeoman

Phantom.js, Selenium

instrumente: fluxuri de activități

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Suport pentru creșterea performanței

asm.js (Mozilla – din 2012) subset JavaScript ce poate fi utilizat ca limbaj de nivelscăzut, eficient – în spiritul limbajului de asamblare

scop: dezvoltarea de aplicații (e.g., jocuri) sofisticate rulate în cadrul browser-ului Web

http://asmjs.org/

instrumente

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Alte limbaje pentru dezvoltarea de aplicații Webla nivel de client:

CoffeeScript (Jeremy Ashkenas, 2009)http://coffeescript.org/

TypeScript (Microsoft, 2012)http://www.typescriptlang.org/

limbaje de programare care se compilează în JavaScript

instrumente

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Portarea altor aplicații în JavaScript

Emscripten – compilator LLVM generând cod JS(e.g., programe C/C++, Lua, Python, Ruby etc.

ce se pot compila în JavaScript)

http://emscripten.org/

instrumente

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Portarea altor aplicații în JavaScript

JSIL – compilator care transformă aplicațiile .NET în programe JavaScript rulând independent de browser

http://jsil.org/

instrumente

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Portarea altor aplicații în JavaScript

Scala.js – compilează programele Scala în cod JavaScript

http://www.scala-js.org/

https://lihaoyi.github.io/hands-on-scala-js/

instrumente

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Facilitarea dezvoltării de aplicații Webla nivel de client similare celor desktop

exemplificări notabile:Cappuccino – http://www.cappuccino-project.org/

SproutCore – http://www.sproutcore.com/

instrumente

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Limbaje aliniate altor paradigme

exemplu:programare funcțională – ClosureScript

https://github.com/clojure/clojurescript

instrumente

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Graceful degradation & progressive enhancement

conceperea „stratificată” a aplicațiilor JavaScript

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Graceful degradation & progressive enhancement

inițial: interacțiune minimală, fără JavaScript

adăugarea progresivă a facilităților, în funcție de context

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Graceful degradation & progressive enhancement

înaintea folosirii oricărei tehnici dorite,de testat suportul oferit de navigator:

JavaScript, cookie-uri, clase/metode DOM, Ajax etc.

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

N-am putea recurge labiblioteci JavaScript specifice?

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Biblioteci generale privind prezentareaconținutului și manipularea arborelui DOM

Dojo: dojotoolkit.org

jQuery: jquery.com

Prototype: prototypejs.org

Rico: http://sourceforge.net/projects/openrico/

Script.aculo.us: script.aculo.us

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Biblioteci pentru vizualizarea datelor

ChromaD3

DanceData

EnvisionProcessing.js

Raphaël

http://selection.datavisualization.ch/

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Multe alte biblioteci JavaScript specializate

procesarea formularelor Webfacilitarea transferurilor asincrone de date

tehnici criptograficegrafice (plotting)

realizarea de efecte vizualegenerarea de conținut grafic 2D/3D

dezvoltare de jocuri (e.g., game engines)…

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

colecții de (micro-)biblioteci JS: www.javascripting.com

jster.netmicrojs.com

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQueryaspecte esențiale (o prezentare succintă)

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

scop principal:oferirea unui framework JavaScript

pentru manipularea facilă a documentului HTMLpe baza selectorilor CSS – nivelul 3

http://jquery.com/

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

concis, dar extensibil, ușor de folosit

nu intră în conflict cu alte biblioteci JavaScript

disponibil open source

existența unui număr mare de extensii (plug-ins)http://plugins.jquery.com/

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

documentații și tutoriale:http://learn.jquery.com/

http://try.jquery.com/

http://jqfundamentals.com/

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

filosofie inițială:focalizarea asupra interacțiunii dintre codul JavaScript

și construcțiile HTML

aproape fiecare operație urmează șablonul:„găsește ceva” + „execută ceva cu ceea ce-ai găsit”

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

accesul la nodurile documentului HTML se realizeazăvia funcția jQuery() – notație prescurtată: $()

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

accesul la nodurile documentului HTML se realizeazăvia funcția jQuery() – notație prescurtată: $()

// liniile de tabel de pe poziții pare vor fi redate

// via proprietățile de stil CSS din clasa ‘fundal-gri’

$("table tr:nth-child(even)").addClass("fundal-gri");

obiect jQuery selector CSSmetodă

(funcționalitate)

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

selectarea nodurilor dorite recurge la convențiileprivitoare la selectorii CSS – nivelul 2 și nivelul 3

http://docs.jquery.com/Selectors

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

selectarea nodurilor dorite recurge la convențiileprivitoare la selectorii CSS – nivelul 2 și nivelul 3

$(div.info) – toate elementele <div class="info">

$(div#adresa) – elementul <div id="adresa">

$(div h1) – în contextul: <div> care include <h1>

$(div#cap > p) – context: <div id="cap"> cu descend. <p>

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

selectori „magici”:

poziție – :first :last

antet – :header

vizibilitate – :hidden :visible

animație – :animated

formulare – :input :text :password :radio :submit

conținut – :contains (…)

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

unele rezultate ale $(…) pot întoarce colecții de noduri,prelucrate prin:

$('div.info').size ()

mărimea colecției obținute

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

unele rezultate ale $(…) pot întoarce colecții de noduri,prelucrate prin:

$('div.info').each (function (div) { … })

iterare via o funcție – aici: anonimă

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

unele rezultate ale $(…) pot întoarce colecții de noduri,prelucrate prin:

$('div.info').html ('<em>Web hackathon</em> la FII')

inserare de construcții HTML

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

unele rezultate ale $(…) pot întoarce colecții de noduri,prelucrate prin:

$('img.foto').attr ('src', '/anonim.png')

alterarea unui atribut

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

unele rezultate ale $(…) pot întoarce colecții de noduri,prelucrate prin:

$('a.menu').addClass ('vizitat')

adăugarea unei clase CSS

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

unele rezultate ale $(…) pot întoarce colecții de noduri,prelucrate prin:

$('p:odd').css ('color', 'blue')

modificarea unor proprietăți CSS

poziție impară

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

o serie de metode întorc rezultateprivind primul nod selectat:

var latime = $('table').width (); // lățimea tabelului

var src = $('img#profil').attr ('src'); // URL-ul unei imagini

var ultimP = $('p:last').html (); // conținutul ultimului <p>

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

traversarea arborelui DOM al paginii Web:

next ()

prev ()

parent ()

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

asocierea de funcții de tratare a evenimentelor

// evenimentul click asupra unui element <a>

$('a').click ( function(ev) {

$(this).css({ backgroundColor: 'yellow' });

ev.preventDefault (); // previne comportamentul implicit

});

$('a:first').click ();

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

evenimentul de disponibilitate a DOM-uluipoate fi tratat via ready()

// atunci când documentul e pregătit de prelucrare…

$(document).ready( function() {

// … stabilim afișarea diferențiată a liniilor de tabel

$("table tr:nth-child(even)").addClass("fundal-gri");

});

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

„înlănțuirea” metodelor – chaining:

majoritatea metodelor întorc un alt obiect jQuery(uzual, reprezentând aceeași colecție)

metodele pot fi „înlănțuite”

$('div.info').hide().addClass('eliminat');

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

„înlănțuirea” metodelor – chaining:

atunci când o metodă întoarce o altă colecție, se poatefolosi end () pentru a avea acces la colecția precedentă

$('#intro').css ('color', 'gray').

find ('a').addClass ('important').end ().

find ('em').css ('color', 'red').end ()

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

suportul pentru transferuri asincrone – Ajax:

încărcare asincronă a unui document

$('div#stiri').load ('stiri.html');

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

suportul pentru transferuri asincrone – Ajax:

încărcare prin GET

$.get (url, parametri, funcție-callback);

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

suportul pentru transferuri asincrone – Ajax:

încărcare via POST

$.post (url, parametri, funcție-callback);

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

suportul pentru transferuri asincrone – Ajax:

preluare răspuns în format JSON

$.getJSON (url, parametri, funcție-callback);

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

suportul pentru transferuri asincrone – Ajax:

metoda cea mai generală (low level)

$.ajax (url, parametri);

o serie de parametri de interes: async, cache, complete, crossDomain, data, error, statusCode, success,…

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

suportul pentru transferuri asincrone – Ajax:

metoda cea mai generală (low level)

$.ajax (url, parametri);

detalii la http://api.jquery.com/jQuery.ajax/

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery.ajax ({ // execută o cerere POST pentru invocarea serviciului Web

type: "POST",

contentType: "application/json; charset=utf-8",

url: "http://undeva.info/ServiciuWeb/Resursa",

data: "{…}", // datele de intrare trimise serviciului

dataType: "json", // așteptăm răspunsul în format JSON

success: function (data) { // funcție apelată la transfer cu succes

$('.rezultat').html (data); // preluăm datele, convertindu-le în HTML

}

});

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery.ajax ({ // execută o cerere POST pentru invocarea serviciului Web

type: "POST",

contentType: "application/json; charset=utf-8",

url: "http://undeva.info/ServiciuWeb/Resursa",

data: "{…}", // datele de intrare trimise serviciului

dataType: "json", // așteptăm răspunsul în format JSON

success: function (data) { // funcție apelată la transfer cu succes

$('.rezultat').html (data); // preluăm datele, convertindu-le în HTML

}

});

astfel, pot fi implementate mash-up-uri la nivel de client

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

suportul pentru transferuri asincrone – Ajax:

evenimente Ajax

locale – tratate de obiectul Ajax instanțiat

beforeSend, success, error, complete

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

suportul pentru transferuri asincrone – Ajax:

evenimente Ajax

globale – transmise tuturor elementelor din DOM

ajaxStart, ajaxSend, ajaxSuccess, ajaxError, ajaxStop,…

amănunte la http://docs.jquery.com/Ajax_Events

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Obținerea fotografiilor publice stocate pe situlFlickr pe baza serviciului Web oferit

cod-sursă disponibil la http://jsfiddle.net/busaco/4d2tmc6b/

studiu de caz

vezi și exemplele din arhiva asociată acestei prezentări

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Obținerea fotografiilor publice stocate pe situlFlickr pe baza serviciului Web oferit

utilizăm URL-ulhttp://api.flickr.com/services/feeds/photos_public.gne

pentru a obține informații despre imagini(formate disponibile: Atom, CSV, JSON, XML,…)

vezi http://www.flickr.com/services/feeds/docs/photos_public/

studiu de caz

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

interactiune web: ajax – studiu de caz

Forma generală a răspunsului JSON transmis de Flickr:{

"title" : "Recent Uploads", "link" : "http://www.flickr.com/photos/", "modified" : "2014-12-06T13:33:07Z", "generator" : "http://www.flickr.com/", "items" : [ {

"title" : "...","link" : "http://www.flickr.com/photos/.../4204222/","media" : { "m": "https://farm.staticflickr.com/...jpg" },"date_taken": "2012-05-20T17:23:43-08:00","description": "...","published" : "2012-05-26T13:49:08Z","author" : "...","author_id" : "...","tags" : "iasi romania informatica FII ..."

} ]}

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

// preluăm asincron imagini disponibile pe FlickrjQuery.getJSON

("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?", { // datele de intrare transmise serviciului Web tags: "iasi, romania, informatica", format: "json"

}, // funcția anonimă ce va procesa datele JSON trimise asincron de Flickr function (data) { // iterăm fiecare informație obținută de la serviciul Web $.each (data.items, function (numar, foto) {

// creăm un element <img> având ca valoare a atributului "src" // adresa Web inclusă în datele JSON obținute; // acest <img> va fi adăugat la elementul cu id="imagini" din pagină$ ("<img/>").attr ("src", foto.media.m).attr ("title", foto.title)

.appendTo ("#imagini"); });

});

studiu de caz

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

studiu de caz

un posibil rezultat – editarea & rularea codului via JSFiddle

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

efectuarea de animații simple:

$('h1').hide ('slow');

$('h1').slideDown ('fast');

$('h1').fadeOut (2000);

alternativă mai performantă: Velocity.js – velocityjs.org/

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

jQuery

efectuarea de animații simple:acțiunile pot fi specificate și de programator

$("#reclama").animate ({

width: "+=100px",

opacity: 0.4,

fontSize: "3em",

borderWidth: "10px"

}, 1500);

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Crearea unui joc simplu cu 2 zaruri

„arunci” zarurile și câștigi 10 tucși numai dacă suma punctelor obținute este mai mare de 7

(uneori, pot apărea surprize…)

cod-sursă disponibil la http://jsfiddle.net/busaco/r8L2kp30/

studiu de caz

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Managementul unui zar – „clasa” Zar

proprietate: valoareZar

metode: obtineZar () și aruncaZar ()

studiu de caz

obține un număr preluat de la random.org

sau local cu Math.round (Math.random () * 5) + 1

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Implementarea jocului – „clasa” Joc

proprietăți: scorCurent, zar1, zar2

metode: aruncaZaruri (), afiseazaScor (), genereazaSurprize ()

studiu de caz

probabilitate 20% ca Tux să fure baniiprobabilitate 15% ca Pingu să ofere 33 de tucși

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

studiu de caz

depanare cu Firebugsau cu instrumentele

oferite de browser

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Nu putem recurge la diverse șabloane de proiectare pentru JavaScript?

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Șabloane de proiectare tradiționale

creaționaleBuilder, Prototype, Singleton

structuraleAdapter, Bridge, Decorator, Façade, Flyweight, Proxy

comportamentaleCommand, Iterator, Mediator, Observer, State, Visitor

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Șabloane de proiectare MV*

MVC (Model-View-Controller)MVP (Model-View-Presenter)

MVVM (Model View ViewModel)

A. Osmani, Learning JavaScript Design Patterns (2014)http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Șabloane de proiectare MV*

utilizare pragmatică via biblioteci/framework-uriAngular – https://angularjs.org/

Backbone – http://backbonejs.org/

Ember – http://emberjs.com/

Mithril – http://lhorie.github.io/mithril/

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

A. Osmani, Developing Backbone.js Applications, O’Reilly, 2013:http://addyosmani.github.io/backbone-fundamentals/

flux de activități într-o aplicație MVC la nivel de client

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

arhitectura unei aplicații Web ce recurge la Backbone.js

Backbone.Events

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Backbone.Router – „leagă” URL-uri la rute (cod)

var RouterStud = Backbone.Router.extend({

routes: {

"": "index", // pagina principală – http://sit.info

"students": "studenti", // e.g., http://sit.info/students

"students/:id": "student" // e.g., http://sit.info/students/:69

},

index: function() { /* afișează pagina de start */ },

studenti: function() { /* listează toți studenții */ },

student: function(id) { /* afișează informații despre un student */ }

});

după Jeff Carouth (2012)

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Backbone.View – preia datele și generează codul HTML(eventual, recurgând la template-uri) pe baza DOM-ului;

suplimentar, reacționează la evenimente

var StudView = Backbone.View.extend ( {

tagName: "li", // conținutul generat va fi inclus în <li>

className: "stud", // numele clasei CSS utilizate

events: { 'click': 'clic' }, // evenimente ce vor fi tratate (aici: click)

render: function () { // generează conținutul

this.$el.html (this.nume ());

return this;

},

clic: function () { alert ('Ai dat click…'); },

nume: function () { // returnează numele studentului (via model)

return this.model.toString ();

}

}); după Jeff Carouth (2012)

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Backbone.Model – conține informații sincronizateprivind datele existente la nivel de server (backend)

var Student = Backbone.Model.extend ( { // date despre un student

urlRoot: '/students',

toString: function() {

return this.get ('nume') + " " + this.get ('an') + " " + this.get ('nota');

}

});

var StudView = Backbone.View.extend ( { // legătura dintre model & view

initialize: function () {

// evenimentul de modificare a datelor conduce la re-afișarea lor

this.model.on ('change', this.render, this);

}

});după Jeff Carouth (2012)

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Backbone.Collection – reprezintă o colecție de modele

var Studenti = Backbone.Collection.extend ({ url: '/students', model: Student } );

var StudentiView = Backbone.View.extend ( {initialize: function () {

this.collection = new Studenti ();this.collection.fetch ( { // preia date de la server via Ajaxsuccess: _.bind (function (raspuns, status, xhr) { this.render(); }, this)

});},render: function () {

this.collection.each (this.genereazaStudent, this);},genereazaStudent: function (model) {

var studView = new StudView ( { model: model });this.$el.append (studView.el);

}}); după Jeff Carouth (2012)

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Backbone permite folosirea oricărui sistem JavaScript de templating – machete de vizualizare

exemplificări:Dust.js – http://linkedin.github.io/dustjs/

EJS – http://www.embeddedjs.com/

Handlebars – http://handlebarsjs.com/

Mustache.js – http://github.com/janl/mustache.js

Nunjucks – http://mozilla.github.io/nunjucks/

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Anumite biblioteci/framework-uri pot fi specializate,vizând doar un anumit aspect al MVC/MVVM

de exemplu, pentru view:Knockout – http://knockoutjs.com/

React – http://facebook.github.io/react/

Vue – http://vuejs.org/

a model-only library:Breeze.js – http://www.getbreezenow.com/breezejs

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Șabloane de proiectare specifice

aspect de interes: modularizarea codului (loose coupling)

specificarea modulelor JS se poate realizavia limbajul AMD (Asynchronous Module Definition)

https://github.com/amdjs/amdjs-api

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Șabloane de proiectare specifice

aspect de interes: modularizarea codului (loose coupling)

specificarea modulelor JS se poate realizavia limbajul AMD (Asynchronous Module Definition)

încărcare de cod folosind biblioteci specifice: curl.js, PINF, RequireJS,…

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Șabloane de proiectare specifice

aspect de interes: modularizarea codului (loose coupling)

alternativ, se poate recurge la CommonJSun format de declarare a modulelor și pachetelor

reutilizabile la nivel de server

http://wiki.commonjs.org/wiki/CommonJS

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Șabloane de proiectare specifice

aspect de interes: modularizarea codului (loose coupling)

o soluție de încărcare universală de module:SystemJS – https://github.com/systemjs/systemjs

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

JavaScript în contextul Web-ului mobil

framework-uri și biblioteci JavaScript

exemplu notabil: jQuery Mobile – http://jquerymobile.com/

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

JavaScript în contextul Web-ului mobil

instrumente independente de platformă

Apache Cordova (PhoneGap) – http://cordova.apache.org/

Ionic – http://ionicframework.com/

Kendo UI Core – https://github.com/telerik/kendo-ui-core

Sencha Touch – http://www.sencha.com/products/touch/

Titanium – http://www.appcelerator.com/titanium/

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

JavaScript în contextul Web-ului mobil

recurgerea la API-uri JavaScript oferite de platformăAmazon Fire OS

Microsoft Windows 8Mozilla Firefox OS

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Alte facilități și extinderi

definirea de macro-uri: Sweet.jssecuritate: ADsafe, FBJS, Gatekeeper, JSX etc.

execuție asincronă a codului: Streamline.js, StratifiedJS,… extensii: ContextJS, JavaScript++, JS2, Objective-J

limbaje inspirate de JS: Coco, Jack, Move, Zedscript etc.

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

instrumente

www.codefellows.org/blog/a-list-of-foundational-javascript-tools

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

Care este viitorul limbajului JavaScript?

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

EcmaScript 6 (ES6)

specificație în stadiu de ciornă (Rev 31 – 15 ian. 2015)

wiki.ecmascript.org/doku.php?id=harmony:specification_drafts

https://people.mozilla.org/~jorendorff/es6-draft.html

o prezentare succintă: Angus Croll, ES6 Uncensored (noiembrie 2013)

https://speakerdeck.com/anguscroll/es6-uncensored

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

EcmaScript 6 (ES6)

definirea de clase – perspectiva paradigmei obiectualeparametri cu valori implicite și parametri multipli

iteratori și generatorinoi tipuri de date – e.g., map, set, proxy

modularizarea codului: module + importuri…

de studiat și Essential JavaScript Linkshttps://gist.github.com/ericelliott/d576f72441fc1b27dace

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

suportul actual pentru ES6 oferit de navigatoarele Webhttp://addyosmani.com/blog/tracking-es6-support/

instrumente ES6: https://github.com/addyosmani/es6-tools

Dr.

Sab

in B

ura

ga

www.purl.org/net/busa

co

episodul viitor: suita de tehnologii HTML5 (prima parte)