Diverse aspecte de interes privind ingineria dezvoltării aplicațiilor JavaScript, inclusiv utilizarea instrumentelor software specifice. Detalii la http://profs.info.uaic.ro/~busaco/teach/courses/cliw/web-film.html
5. Dr.SabinBuragawww.purl.org/net/busaco
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
http://www.slideshare.net/busaco/cu-codul-n-nori
instrumente: editare
7. Dr.SabinBuragawww.purl.org/net/busaco
Firebug (Lite)
http://getfirebug.com/
a se considera și instrumentele de depanare
incluse în navigatoarele Web moderne
https://developer.mozilla.org/docs/Web/API/console
https://developers.google.com/web/tools/chrome-devtools/
https://dev.windows.com/en-us/microsoft-edge/platform/documentation/
instrumente: depanare
20. Dr.SabinBuragawww.purl.org/net/busaco
Managementul de pachete JavaScript pentru
dezvoltarea 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
22. Dr.SabinBuragawww.purl.org/net/busaco
Suport pentru creșterea performanței
asm.js (Mozilla – din 2012)
subset JavaScript ce poate fi utilizat ca limbaj de nivel
scă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
23. Dr.SabinBuragawww.purl.org/net/busaco
Alte limbaje pentru dezvoltarea de aplicații Web
la 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
24. Dr.SabinBuragawww.purl.org/net/busaco
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://kripken.github.io/emscripten-site/
instrumente
30. Dr.SabinBuragawww.purl.org/net/busaco
Biblioteci generale privind prezentarea
conț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
31. Dr.SabinBuragawww.purl.org/net/busaco
Multe alte biblioteci JavaScript specializate
procesarea formularelor Web
facilitarea transferurilor asincrone de date
tehnici criptografice
realizarea de efecte vizuale
generarea de conținut grafic 2D/3D
vizualizarea datelor
dezvoltare de jocuri (e.g., game engines)
…
34. Dr.SabinBuragawww.purl.org/net/busaco
Obținerea fotografiilor publice stocate pe situl
Flickr pe baza serviciului Web oferit
utilizăm URL-ul
http://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: jquery
36. Dr.SabinBuragawww.purl.org/net/busaco
// preluăm asincron imagini disponibile pe Flickr
jQuery.getJSON
("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?",
{ // datele de intrare transmise serviciului Web
tags: "Iasi, romania, informatica", tagmode: "all", 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: jquery
38. Dr.SabinBuragawww.purl.org/net/busaco
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: jquery
39. Dr.SabinBuragawww.purl.org/net/busaco
Managementul unui zar – „clasa” Zar
proprietate: valoareZar
metode: obtineZar () și aruncaZar ()
studiu de caz: jquery
obține un număr preluat de la random.org
sau local cu Math.round (Math.random () * 5) + 1
40. Dr.SabinBuragawww.purl.org/net/busaco
studiu de caz: jquery
function Zar (valoareZar) { // 'clasa' privitoare la managementul unui zar
this.valoareZar = valoareZar; // valoarea curentă a zarului
this.obtineZar = function () { // furnizează valoarea curentă a zarului
return this.valoareZar; };
this.aruncaZar = function () { // simulează acțiunea de 'aruncare' a zarului
var rezultat;
$.ajax ({ 'url': 'http://www.random.org/integers/?num=1&min=1&max=6
&base=10&col=1&format=plain&rnd=new',
'async': false, // transfer sincron (de ce?)
'success': function (date) { rezultat = date; }
}).fail (function () {
console.log ('Cererea nu a putut fi satisfăcută de random.org');
// calculăm valoarea zarului în mod clasic
rezultat = Math.round (Math.random () * 5) + 1;
});
return this.valoareZar = parseInt (rezultat, 10);
};
}
41. Dr.SabinBuragawww.purl.org/net/busaco
Implementarea jocului – „clasa” Joc
proprietăți: scorCurent, zar1, zar2
metode: aruncaZaruri (), afiseazaScor (), genereazaSurprize ()
studiu de caz: jquery
probabilitate 20% ca Tux să fure banii
probabilitate 15% ca Pingu să ofere 33 de tucși
42. Dr.SabinBuragawww.purl.org/net/busaco
studiu de caz: jquery
function Joc (scorInitial) { // clasa referitoare la implementarea jocului
this.scorCurent = scorInitial; // scorul curent
this.zar1 = new Zar (0); // instanțele celor 2 zaruri
this.zar2 = new Zar (0);
this.aruncaZaruri = function () { // acțiunea de 'aruncat' zarurile
if (this.zar1.aruncaZar () + this.zar2.aruncaZar () > 7) {
this.scorCurent += 10; // incrementarea scorului dacă survine norocul
}
this.afiseazaScor (); // după aruncare, afișăm scorul
};
// generează diverse surprize (ne)plăcute
this.genereazaSurprize = function () {
// vezi codul-sursă disponibil online…
};
// afișează/ascunde regulile jocului
this.redaReguli = function (stare) {
// vezi codul-sursă disponibil online…
};
43. Dr.SabinBuragawww.purl.org/net/busaco
studiu de caz: jquery
this.afiseazaScor = function () { // afișează starea jocului (scor, zaruri)
if (this.scorCurent <= 10) { // 'incurajam' jucatorul sa mai joace...
$("#scor").html ("Ai obținut doar 10 tucși :(");
} else {
// modificăm modul de afișare dacă scorul e 'mare'
$("#scor").addClass (this.scorCurent < 60 ? "avansat" : "expert");
// afisarea propriu-zisa a scorului curent
$("#scor").html ("Ai câștigat până acum " + this.scorCurent + " de tucși");
}
// afișarea valorii fiecărui zar în parte
$("#zar1").show ().html (this.zar1.obtineZar ());
$("#zar2").show ().html (this.zar2.obtineZar ());
// la finalul unei runde, generăm surprize...
this.genereazaSurprize ();
};
} // instanțierea unui joc (scorul inițial e zero)
var joc = new Joc (0);
50. Dr.SabinBuragawww.purl.org/net/busaco
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)
51. Dr.SabinBuragawww.purl.org/net/busaco
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 ()); // $el oferă acces la un obiect jQuery
return this;
},
clic: function () { alert ('Ai dat click…'); },
nume: function () { // returnează numele studentului (via model)
return this.model.toString ();
}
}); după Jeff Carouth (2012)
52. Dr.SabinBuragawww.purl.org/net/busaco
Backbone.Model – conține informații sincronizate
privind 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 și 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)
53. Dr.SabinBuragawww.purl.org/net/busaco
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 Ajax
success: _.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)
54. Dr.SabinBuragawww.purl.org/net/busaco
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/
55. Dr.SabinBuragawww.purl.org/net/busaco
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
56. Dr.SabinBuragawww.purl.org/net/busaco
Șabloane de proiectare specifice
aspect de interes:
modularizarea codului (loose coupling)
specificarea modulelor JS se poate realiza
via limbajul AMD (Asynchronous Module Definition)
https://github.com/amdjs/amdjs-api
57. Dr.SabinBuragawww.purl.org/net/busaco
Șabloane de proiectare specifice
aspect de interes:
modularizarea codului (loose coupling)
specificarea modulelor JS se poate realiza
via limbajul AMD (Asynchronous Module Definition)
încărcare de cod folosind biblioteci specifice:
curl.js, PINF, RequireJS,…
58. Dr.SabinBuragawww.purl.org/net/busaco
Șabloane de proiectare specifice
aspect de interes:
modularizarea codului (loose coupling)
alternativ, se poate recurge la CommonJS
un format de declarare a modulelor și pachetelor
reutilizabile la nivel de server
http://wiki.commonjs.org/wiki/CommonJS
60. Dr.SabinBuragawww.purl.org/net/busaco
JavaScript în contextul Web-ului mobil
framework-uri și biblioteci JavaScript
exemple:
jQuery Mobile – http://jquerymobile.com/
Mobile Angular UI – http://mobileangularui.com/
tabris.js – https://tabrisjs.com/
63. Dr.SabinBuragawww.purl.org/net/busaco
Alte facilități și extinderi
definirea de macro-uri: Sweet.js
securitate: ADsafe, FBJS, Gatekeeper etc.
execuție asincronă a codului: Streamline.js, StratifiedJS,…
extensii: ContextJS, JavaScript++, JS2, Objective-J
limbaje inspirate de JS: Coco, Jack, Move, Zedscript etc.