avansat Dr. Sabin Buraga profs.info.uaic.ro/~busaco/ Tehnologii Web programare Web JavaScript la nivel de server Node.js (aspecte esențiale)

Documente similare
Laborator 3

Dr. Sabin Buraga profs.info.uaic.ro/~busaco Dezvoltarea aplicațiilor Web la nivel de client programare W

Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011

Paradigme de programare

Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011

Proiectarea Sistemelor Software Complexe

Paradigme de Programare

Lucrarea nr. 2 Aplicaţii de tip client Mihai IVANOVICI 6 martie 2006 Scopul acestei lucrări este de a vă familiariza cu modulul Python socket şi cu mo

Laborator 1 suport teoretic Mediul de dezvoltare Eclipse GLOSAR - Aplicaţie: program obţinut în urma aplicării operației BUILD asupra unui proiect (ve

proiectarea bazelor de date

Microsoft Word - Curs 7 - JavaScript.doc

Ingineria Sistemelor de Programare

Programarea şi utilizarea calculatoarelor

Top

Microsoft Word - CarteC.doc

PHP (II)

PROGRAMARE ORIENTATA PE OBIECTE

Microsoft Word _POO_Lab_1_Modificari_v01.htm

tehnologii web

Limbaje de Programare Curs 6 – Functii de intrare-iesire

Microsoft Word - CarteC.doc

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa

Introducere în limbajul JavaScript

Microsoft PowerPoint - Curs_TPI_22_v01.ppt

Modulul 1 M1-2.3 Protocoale şi servicii în reţea În acest capitol ne propunem să abordăm următoarele: Protocoalele şi aplicaţiile folosite în reţelele

Declararea variabilelor

PowerPoint Presentation

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

Interfețe și Protocoale de Comunicații Arduino-Port Paralel Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de

Microsoft Word - lab4.doc

Microsoft PowerPoint - ImplementareLimbaj [Read-Only] [Compatibility Mode]

Programarea şi utilizarea calculatoarelor

Procesarea Imaginilor - Laborator 1: Introducere în utilizarea bibliotecii OpenCV 1 1. Introducere în utilizarea bibliotecii OpenCV 1.1. Introducere S

Logică și structuri discrete Limbaje regulate și automate Marius Minea marius/curs/lsd/ 24 noiembrie 2014

Example Title with Registration Microsoft® and Trademark SQL ServerTM

SUBPROGRAME

CURS

Slide 1

Object Oriented Programming

Termeni de utilizare specifici produselor

9. Design patterns - Singleton, Factory, Observer Scopul acestui curs este familiarizarea cu folosirea unor pattern-uri des întâlnite în design-ul atâ

Ruby on Rails Pop Alexandru Pavel Razvan Calculatoare 4

Curs 10

..MINISTERUL EDUCAŢIEI NAȚIONALE ŞI CERCETARII STIINTIFICE UNIVERSITATEA DE VEST DIN TIMIȘOARA.I CENTRUL DE DEZVOLTARE ACADEMICĂ. FIȘA DISCIPLINEI 1.

Laborator 5 - Paradigme de Programare

Gestionarea I/E

Limbaje de Programare Curs 8 – Fisiere

Poo Laboratoare 1 Contents Laborator7 2 1 Colecţii de obiecte în Java Interfaţa Iterator Interfaţa C

Inserarea culorilor in tabele

Limbaje de programare Pointeri. Alocare dinamică (continuare) 26 noiembrie 2012

Microsoft Word - lab-fr_3

Paradigme de Programare

1 Core JavaScript Programming Descrierea cursului Bazele programării JavaScript și programarea bazată pe limbajul C. Implementarea lui JavaScript în H


E_d_Informatica_sp_MI_2015_bar_02_LRO

Slide 1

Diapositive 1

Programarea şi utilizarea calculatoarelor

Entrepreneurship and Technological Management

Utilizarea Internetului in Afaceri FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 3. Achizitionarea domeniilor web si a

Web Social FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 2. Dezvoltarea blogurilor prin intermediul WordPress.com PREZE

Managementul Resurselor Umane

Facultatea de Științe Politice, Administrative și ale Comunicării Str. Traian Moșoiu nr. 71 Cluj-Napoca, RO Tel.: Fax:

Procesarea documentelor XML in Linux

Lucrarea 10

PowerPoint Presentation

Microsoft Word - PCLP2_Curs_4_2019.doc

LUMINIŢA SCRIPCARIU

PPSD

Microsoft Word - 2 ES RO.doc

Ch

Adresarea memoriei Modurile de adresare constituie un instrument principal pentru reprezentarea în memorie a imaginii datelor, aşa cum este ace

Slide 1

ALGORITMICĂ. Seminar 3: Analiza eficienţei algoritmilor - estimarea timpului de execuţie şi notaţii asimptotice. Problema 1 (L) Să se determine număru

Microsoft Word - O problema cu bits.doc

Caraivan George-Alexandru Grupa 431A Interfața driver-kernel la Linux Introducere Deși pentru unii dintre noi acest lucru poate fi o supriză, cei mai

Slide 1

ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja f

ÎS CENTRUL DE TELECOMUNICAȚII SPECIALE CENTRUL DE CERTIFICARE A CHEILOR PUBLICE POLITICA de utilizare a certificatelor SSL Iunie 2013 Chişinău 2013

Metode API - integrare FGO v.2.5 Cuprins ISTORIC VERSIUNI... 2 INTRODUCERE... 2 APELARE... 4 NOMENCLATOARE... 4 FACTURA... 5 EMITERE... 5 PRINT... 6 S

Microsoft Word - Curs_07.doc

Logică și structuri discrete Logică propozițională Marius Minea marius/curs/lsd/ 3 noiembrie 2014

Slide 1

Logică și structuri discrete Relații. Funcții parțiale Marius Minea marius/curs/lsd/ 20 octombrie 2014

PowerPoint Presentation

L7

Packet Tracer - Configurarea ACL-urilor extinse - Scenariul 1 Topologie Tabela de Adresare R1 Echipament Interfață Adresă IP Masca de subreţea Default

Raportarea serviciilor de dializă la nivel CNAS

Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici O

COMISIA EUROPEANĂ DIRECȚIA GENERALĂ INFORMATICĂ Componenta de aplicare a politicii WiFi4EU Ghid de implementare v1.0 Cuprins 1. Introducere Br

E_d_Informatica_sp_SN_2014_bar_10_LRO

Biomedical Wi-Fi data transmissons

Laborator 7: PROIECTAREA BAZELOR DE DATE SUBPROGRAME in PL/SQL (partea I - proceduri) Un subprogram este un bloc PL/SQL cu nume (spre deosebire de blo

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

Slide 1

Utilizare Internet

Laborator Activities În sistemul Android activitățile reprezintă echivalentul ferestrelor din Windows, fiind clase care extind clasa Activity. Spre de

Laborator 8: PROIECTAREA BAZELOR DE DATE SUBPROGRAME in PL/SQL (partea II - functii) Un subprogram este un bloc PL/SQL cu nume (spre deosebire de bloc

Transcriere:

avansat Tehnologii Web programare Web JavaScript la nivel de server Node.js (aspecte esențiale)

Cine a văzut vreodată o bijuterie frumos cizelată de bijutier cu ajutorul ciocanului? Jan Amos Comenius

JavaScript un limbaj de programare pentru Web

Inventat de Brendan Eich (1995) denumit inițial Mocha, apoi LiveScript Oferit în premieră de browser-ul Netscape Navigator Adaptat de Microsoft: JScript (1996) Standardizat ca ECMAScript: ECMA-262 (1997) www.w3.org/community/webed/wiki/a_short_history_of_javascript

ECMAScript versiunea standardizată în vigoare: ECMAScript 2016 versiunea ES7 (iunie 2016) www.ecma-international.org/publications/standards/ecma-262.htm git.io/es6features referința de bază: https://developer.mozilla.org/javascript

Limbaj de tip script (interpretat) destinat să manipuleze, să automatizeze și să integreze funcționalitățile oferite de un anumit sistem

Limbaj de tip script (interpretat) nu necesită intrări/ieșiri în mod implicit

Adoptă diverse paradigme de programare imperativă à la C

Adoptă diverse paradigme de programare funcțională λ calcul funcții anonime, închideri (closures),

Adoptă diverse paradigme de programare pseudo-obiectuală via prototipuri (obiectele moștenesc alte obiecte, nu clase)

Adoptă diverse paradigme de programare dinamică variabilele își pot schimba tipul pe parcursul rulării programului

Cum putem executa programele JavaScript?

Mediu de execuție (host-environment) navigator Web permite rularea de aplicații Web la nivelul unei platforme (un sistem de operare)

Mediu de execuție (host-environment) navigator Web permite rularea de aplicații Web la nivelul unei platforme (un sistem de operare) inclusiv pe diverse dispozitive e.g., Android, ios, Fire OS (Kindle Fire), Universal Windows Platform,, console de jocuri, smart TV și altele

Mediu de execuție (host-environment) navigator Web injectarea de cod JavaScript în documentele HTML via elementul <script>

Mediu de execuție (host-environment) navigator Web injectarea de cod JavaScript în documentele HTML via elementul <script> cod extern referit printr-un URL vs. cod inclus direct în pagina Web

Mediu de execuție (host-environment) independent de navigatorul Web platforme de dezvoltare de aplicații distribuite: Node.js servere Web nginscript în cadrul Nginx servere de baze de date e.g., Apache CouchDB componente ale sistemului de operare aplicații de sine-stătătoare e.g., Adobe Creative Suite

caracteristici: sintaxa Cuvinte rezervate: break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof

caracteristici: sintaxa Alte cuvinte rezervate: abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public

caracteristici: tipuri de date Number reprezentare în dublă precizie stocare pe 64 biți standardul IEEE 754 developer.mozilla.org/web/javascript/reference/global_objects/number

caracteristici: tipuri de date String secvențe de caractere Unicode fiecare caracter ocupă 16 biți (UTF-16) developer.mozilla.org/web/javascript/reference/global_objects/string

caracteristici: tipuri de date Boolean expresii ce se pot evalua ca fiind true/false developer.mozilla.org/web/javascript/reference/global_objects/boolean

caracteristici: tipuri de date Object aproape totul e considerat ca fiind obiect, inclusiv funcțiile

caracteristici: tipuri de date Null semnifică nicio valoare

caracteristici: tipuri de date Undefined are semnificația nicio valoare asignată încă

caracteristici: tipuri de date Nu există valori întregi

caracteristici: tipuri de date Nu există valori întregi convertirea unui șir în număr: parseint () parseint ("123") 123 parseint ("11", 2) 3 indică baza de numerație

caracteristici: tipuri de date Valoarea NaN ( not a number ) parseint ("Salut") NaN isnan (NaN + 3) true valori speciale: Infinity Infinity

caracteristici: tipuri de date Șirurile sunt obiecte "Salut".length 5 un caracter reprezintă un șir de lungime 1

caracteristici: tipuri de date Valorile 0, "", NaN, null, undefined sunt interpretate ca fiind false!!234 true

caracteristici: variabile Variabilele se declară cu var var marime; var numeanimal = "Tux"; variabilele declarate fără valori asignate, se consideră undefined

caracteristici: variabile Dacă nu se folosește var, atunci variabila este considerată globală de evitat așa ceva!

caracteristici: variabile Valorile sunt legate tardiv la variabile (late binding)

caracteristici: operatori Similari celor din C: pentru numere: + * / % testare: == ===!=!==?: asignare: += = *= /= %= incrementare și decrementare: ++ logici:! && concatenare de șiruri: "Java" + "Script" "JavaScript"

caracteristici: operatori Conversia tipurilor se face din zbor (dinamic) "3" + 4 + 5 345 3 + 4 + "5" 75 adăugând un șir vid la o expresie, o convertim pe aceasta la string

caracteristici: operatori Egalitatea valorilor se testează cu == și!= 1 == true true a se folosi: 1 === true false inhibă conversia tipurilor de date

caracteristici: operatori Aflarea tipului unei expresii: operatorul typeof typeof "Tux" string operand undefined null de tip Boolean de tip Number de tip String Function orice alte valori rezultat 'undefined' 'object' 'boolean' 'number' 'string' 'function' 'object'

caracteristici: operatori Operatorii logici && și var nume = unnume "Implicit";

caracteristici: operatori Operatorul ternar de test? : var prezență = (studenți > 33)? "Prea mulți" : "Cam puțini ";

caracteristici: control Testare: if else, switch pentru switch, sunt permise expresii la fiecare case (testarea se realizează cu operatorul ===) switch (2 + 3) { /* sunt permise expresii */ case 4 + 1 : egalitate (); break; default : absurd (); // nu se apelează niciodată }

caracteristici: control Ciclare: while, do while, for do { var nume = preianume (); } while (nume!= ""); for (var contor = 0; contor < 33; contor++) { // de 33 de ori }

caracteristici: control Excepții: try catch finally try { // Linii "periculoase" ce pot cauza excepții } catch (eroare) { // Linii rulate la apariția unei/unor excepții } finally { // Linii care se vor executa la final }

caracteristici: control Excepții: try catch finally try { // Linii "periculoase" ce pot cauza excepții } catch (eroare) { // Linii rulate la apariția unei/unor excepții } finally { // Linii care se vor executa la final } emiterea unei excepții: throw throw new Error ("O eroare de-a noastră...");

caracteristici: obiecte Perechi nume valoare tabele de dispersie (hash) în C/C++ tablouri asociative în Perl, PHP sau Ruby HashMaps în Java everything except primitive values is an object

caracteristici: obiecte Perechi nume valoare numele este desemnat de un șir de caractere (i.e., expresie de tip String) valoarea poate fi de orice tip, inclusiv null sau undefined

caracteristici: obiecte Obiect colecție de proprietăți, având mai multe atribute

caracteristici: obiecte Obiect colecție de proprietăți, având mai multe atribute proprietățile pot conține alte obiecte, valori primitive sau metode

caracteristici: obiecte Obiecte predefinite: Global Function String Boolean Math Object Array RegExp Number Date de studiat developer.mozilla.org/javascript/reference/global_objects

caracteristici: obiecte Obiecte fundamentale vizând gestionarea erorilor Error EvalError RangeError ReferenceError SyntaxError TypeError URIError

caracteristici: obiecte Create prin intermediul operatorului new: var ob = new Object(); var ob = { }; // echivalent cu linia anterioară se preferă această sintaxă

caracteristici: obiecte Accesarea proprietăților operatorul. ob.nume = "Tux"; var nume = ob.nume;

caracteristici: obiecte Accesarea proprietăților operatorul. ob.nume = "Tux"; var nume = ob.nume; echivalent cu: ob["nume"] = "Tux"; var nume = ob["nume"];

caracteristici: obiecte Declarare + asignare: var pinguin = { nume: "Tux", proprietati: { culoare: "verde", marime: 17 } accesare: } pinguin.proprietati.marime 17 pinguin["proprietati"]["culoare"] verde

var facultycontactinfo = { // numele proprietăților sunt încadrate de ghilimele "official-phone" : '+40232201090', city : 'Iasi', // dacă numele e identificator valid, ghilimelele pot fi omise 'street' : 'Berthelot Street', 'number' : 16, // pot fi folosite orice tipuri de date primitive "class" : "new", // cuvintele rezervate se plasează între ghilimele coord : { // obiectele pot conține alte obiecte (nested objects) 'geo' : { 'x': 47.176591, 'y': 27.575930 } }, age : Math.floor ("25.1") // pot fi invocate metode de calcul a valorilor }; console.log (facultycontactinfo.coord["geo"].y); // obținem 27.57593 adaptare după Sergiu Dumitriu (absolvent FII)

caracteristici: obiecte Iterarea proprietăților considerate chei: var pinguin = { 'nume': 'Tux', 'marime': 17, 'oferta': true }; for (var proprietate in pinguin) { console.log (proprietate + ' = ' + pinguin[proprietate]); }

caracteristici: obiecte Eliminarea proprietăților se realizează cu delete var pinguin = { 'nume': 'Tux', 'marime': 17 }; pinguin.nume = undefined; // nu șterge proprietatea delete pinguin.marime; // eliminare efectivă for (var prop in pinguin) { console.log (prop + "=" + pinguin[prop]); } // va apărea doar "nume=undefined"

caracteristici: tablouri Tipuri speciale de obiecte proprietățile (cheile) sunt numere, nu șiruri de caractere developer.mozilla.org/web/javascript/reference/global_objects/array

caracteristici: tablouri Se poate utiliza sintaxa privitoare la obiecte: var animale = new Array (); animale[0] = "pinguin"; animale[1] = "omida"; animale[2] = "pterodactil"; animale.length 3 notație alternativă preferată: var animale = [ "pinguin", "omida", "pterodactil" ];

caracteristici: tablouri Elementele pot aparține unor tipuri de date eterogene var animale = [ 33, "vierme", false, "gaga" ];

caracteristici: tablouri Tablourile pot avea găuri (sparse arrays): var animale = [ "pinguin", "omida", "pterodactil" ]; animale[33] = "om"; animale.length 34 typeof animale[13] undefined

caracteristici: tablouri Tablourile pot avea găuri (sparse arrays): var animale = [ "pinguin", "omida", "pterodactil" ]; animale[33] = "om"; animale.length 34 typeof animale[13] undefined pentru a adăuga elemente putem recurge la: animale[animale.length] = altanimal;

caracteristici: tablouri exemplu var vector = [ ]; vector[0] = "zero"; vector[new Date ().gettime ()] = "now"; vector[3.14] = "pi"; for (var elem in vector) { console.log ("vector[" + elem + "] = " + vector[elem] + ", typeof( " + elem +") == " + typeof (elem)); } adaptare după John Kugelman (2009)

rezultatul obținut în urma rulării programului JavaScript via aplicația JS Bin http://jsbin.com/

caracteristici: tablouri Metode utile: a.tostring() a.concat(item,..) a.join(sep) a.pop() a.push(item,..) a.reverse() a.shift() a.unshift([item]..) a.sort(cmpfn) a.splice(start, delcount, [item]..) etc.

caracteristici: funcții Definite via function function transformapixeliinpuncte (px) { var puncte = px * 300; return puncte; } developer.mozilla.org/web/javascript/reference/global_objects/function

caracteristici: funcții Dacă nu este întors nimic în mod explicit, valoarea de retur se consideră undefined

caracteristici: funcții Parametrii de intrare pot lipsi, fiind considerați undefined Pot fi transmise mai multe argumente, cele în surplus fiind ignorate transformapixeliinpuncte (10, 7) 3000

caracteristici: funcții Funcțiile sunt tot obiecte astfel, pot fi specificate funcții anonime expresii lambda în acest sens, JavaScript este un limbaj funcțional

caracteristici: funcții var media = function () { // calculul mediei a N numere var suma = 0; for (var iter = 0, lung = arguments.length; iter < lung; iter++) { suma += arguments[iter]; } return suma / arguments.length; };

caracteristici: funcții var media = function () { // calculul mediei a N numere var suma = 0; for (var iter = 0, lung = arguments.length; iter < lung; iter++) { suma += arguments[iter]; } return suma / arguments.length; }; variabilele declarate în funcție nu vor fi accesibile din exterior, fiind închise funcție closure

console.log ( media (9, 10, 7, 8, 7) ) 8.2 pentru aprofundarea aspectelor vizând programarea funcțională în JavaScript a se studia https://github.com/stoeffel/awesome-fp-js

precizați ce efect vor avea liniile de cod următoare: console.log ( typeof (media) ); console.log ( media() );

variabila media este de tip function apelul media() întoarce valoarea NaN

function Animal (nume, marime) { this.nume = nume; // date-membre this.marime = marime; this.oferanume = function () { // metodă return this.nume; }; this.oferamarime = function () { // metodă return this.marime; }; } caracteristici: obiecte creational pattern pseudo-clase (utilizarea constructorilor)

caracteristici: obiecte Operatorul new creează un nou obiect vid și apelează funcția specificată cu this setat pe acest obiect aceste funcții se numesc constructori, trebuie apelate via new și, prin convenție, au numele scris cu literă mare

caracteristici: obiecte Față de alte limbaje de programare, obiectul curent referit cu this este setat ca fiind obiectul global de exemplu, în browser, reprezintă fereastra curentă în care este redat documentul: this window

caracteristici: de la funcții la clase // instanțierea unui obiect var tux = new Animal ("Tux", 17); console.log (tux.oferanume ()); var jox = tux; console.log (jox.oferanume ()); // alt obiect var pax = new Animal ("Pax", 15); pax.marime = 21; console.log (pax.oferamarime ()); trasarea pas-cu-pas a execuției programului, cu inspectarea valorilor variabilelor, via www.pythontutor.com/visualize.html#py=js

caracteristici: de la funcții la clase trasarea pas-cu-pas a execuției programului, cu inspectarea valorilor variabilelor, via www.pythontutor.com/visualize.html#py=js

caracteristici: obiecte Metodele pot fi declarate și în exteriorul constructorului function oferanumeanimal () { return this.nume; } function Animal (nume, marime) { this.nume = nume; this.marime = marime; this.oferanume = oferanumeanimal; // referă funcția de mai sus }

caracteristici: proprietăți Orice obiect deține trei tipuri de proprietăți: named data property o proprietate având asignată o valoare named accessor property de tip setter/getter pentru a stabili/accesa o valoare internal property folosită exclusiv de procesorul ECMAScript (JavaScript)

[[Value]] desemnează valoarea curentă a proprietății [[Writable]] indică dacă o proprietate poate să-și modifice valoarea [[Get]] și [[Set]] funcții opționale pentru a oferi/stabili valoarea unei proprietăți de tip accessor [[Enumerable]] specifică dacă numele proprietății va fi disponibil într-o buclă for-in [[Configurable]] indică dacă proprietatea poate fi ștearsă ori redefinită caracteristici: proprietăți Fiecare proprietate are asociate atributele:

[[Prototype]] [[Get]] [[Put]] [[CanPut]] [[HasProperty]] [[DefineOwnProperty]] [[GetProperty]] [[GetOwnProperty]] [[Delete]] [[Extensible]] [[Construct]] [[Call]] [[Code]] [[Scope]] definește ierarhiilor de obiecte pentru accesarea valorilor manipularea proprietăților indică obiectele ce pot fi extinse asociate obiectelor executabile (funcții) desemnează codul & contextul unei obiect de tip funcție proprietăți interne importante (folosite de procesorul ECMAScript, dar inaccesibile la nivel de program)

caracteristici: proprietăți // crearea unei proprietăți simple stocând date // (writable, enumerable, configurabile) obiect.numeproprietate = 33; // crearea via API-ul intern a unei proprietăți stocând date Object.defineProperty (obiect, "numeproprietate", { value: 33, writable: true, enumerable: true, configurable: true } )

proprietățile interne ale obiectelor definite http://www.objectplayground.com/

caracteristici: prototipuri Deoarece orice obiect deține în mod implicit proprietatea prototype, structura unei clase poate fi extinsă ulterior developer.mozilla.org/web/javascript/reference/global_objects/object/prototype

caracteristici: prototipuri Deoarece orice obiect deține în mod implicit proprietatea prototype, structura unei clase poate fi extinsă ulterior un prototip e o proprietate oferind o legătură ascunsă către obiectul de care aparține

caracteristici: prototipuri Dacă se încearcă accesarea unui element inexistent în cadrul unui obiect dat, se va verifica lanțul de prototipuri (prototype chain)

function Animal (nume, marime) { // definiție inițială this.nume = nume; this.marime = marime; } // pe baza protipurilor, definim noi metode // disponibile pentru toate obiectele din clasă Animal.prototype.oferaNume = function () { return this.nume; }; Animal.prototype.oferaMarime = function () { return this.marime; }; // instanțiem un obiect de tip Animal var tux = new Animal ("Tux", 17);

caracteristici: prototipuri Pentru a cunoaște tipul unui obiect (pe baza constructorului și a ierarhiei de prototipuri) se folosește operatorul instanceof

caracteristici: prototipuri var marimi = [17, 20, 7, 14]; marimi instanceof Array true marimi instanceof Object true marimi instanceof String false var tux = new Animal ("Tux", 17); tux instanceof Object true tux instanceof Array false

caracteristici: extinderea claselor Adăugarea unei metode se realizează via prototype Animal.prototype.oferaNumeMare = function () { return this.nume.touppercase (); }; tux.oferanumemare () "TUX"

caracteristici: extinderea claselor Pot fi extinse și obiectele predefinite: // adăugăm o metodă obiectului String String.prototype.inverseaza = function () { var inv = ''; for (var iter = this.length - 1; iter >= 0; iter--) { // inversăm șirul inv += this[iter]; } return inv; }; "Web".inverseaza () "bew"

caracteristici: extinderea claselor Cel mai general prototype este cel al lui Object una dintre metodele disponibile predefinite este tostring() care poate fi suprascrisă (over-ride)

Atenție la pericole! e.g., comportamentul diferit al construcției for (var proprietate in obiect) caracteristici: extinderea claselor var tux = new Animal ("Tux", 17); tux.tostring () [object Object] Animal.prototype.toString = function () { return '<animal>' + this.oferanume () + '</animal>'; }; tux.tostring () "<animal>tux</animal>"

caracteristici: extinderea claselor Șablon general: ClasaDeBaza = function () { /* */ }; SubClasa = function () { /* */ }; SubClasa.prototype = new ClasaDeBaza ();

caracteristici Deoarece o funcție reprezintă un obiect, poate fi: stocată ca valoare (asociată unei variabile) pasată ca argument al unei alte funcții întoarsă de o funcție fiind argument pentru return

caracteristici: încapsulare JavaScript oferă un singur spațiu de nume, la nivel global conflicte privind denumirea funcțiilor/variabilelor specificate de programe diferite, concepute de mai multi dezvoltatori

caracteristici: încapsulare Nu trebuie afectat spațiul de nume global, păstrându-se codul-sursă la nivel privat

caracteristici: încapsulare Codul poate fi complet încapsulat via funcții anonime care păstrează construcțiile la nivel privat

caracteristici: closures Declararea imbricată ca expresii de tip funcție a funcțiilor anonime are denumirea closures închideri https://developer.mozilla.org/en/javascript/guide/closures

caracteristici: closures Șablonul general: // specificarea unei expresii de tip funcție ( function () { // variabilele și funcțiile vor fi vizibile doar aici // variabilele globale pot fi accesate } ( ) );

var cod = (function () { var priv = 0; // variabilă privată function start (x) { //... poate accesa 'priv' // și funcția 'faceva' } function faaia (param) { //... invizibilă din afară } function faceva (x, y) { //... } return { // sunt publice doar // funcțiile 'start' și 'faceva' 'start': start, 'faceva': faceva } }) (); cod.start (arg); // apelăm 'start' via closures, simulăm metodele private modularizarea codului (module pattern)

var makecounter = function () { var contorprivat = 0; // un contor de valori (inițial, zero) function changeby (val) { // funcție privată contorprivat += val; // ce modifică valoarea contorului } return { // funcții publice (expuse) increment: function() { changeby (1); }, decrement: function() { changeby (-1); }, value: function() { return contorprivat; } }; };

console.log (contor1.value ()); /* 0 */ contor1.increment (); contor1.increment (); console.log (contor1.value ()); /* 2 */ contor1.decrement (); console.log (contor1.value ()); /* 1 */ console.log (contor2.value ()); /* 0 */

de reținut! Totul în JavaScript este obiect chiar și funcțiile

de reținut! Orice obiect este întotdeauna mutabil (poate fi alterat oricând) proprietățile și metodele sunt disponibile oriunde în program (public scope)

de reținut! Nu există vizibilitate la nivel de bloc de cod (block scope), ci doar la nivel global ori la nivel de funcție

de reținut! Funcțiile ascund orice e definit în interiorul lor

de reținut! Operatorul. este echivalent cu de-referențierea: ob.prop === ob["prop"]

de reținut! Operatorul new creează obiecte aparținând clasei specificate de funcția constructor

de reținut! Accesorul this este relativ la contextul execuției, nu al declarării Atenție la dependența de mediul de execuție!

de reținut! Proprietatea prototype are valori modificabile

json JavaScript Object Notation http://json.org/

json Format compact pentru interschimb de date în termeni de obiecte și literali între aplicații biblioteci de procesare și alte resurse de interes: http://jsonauts.github.io/

// definim un șir de caractere ce specifică diverse construcții JSON // (e.g., preluarea datelor via Ajax/WebSocket-uri de la un serviciu Web/API) var sirtux = '{ "nume": "Tux", "stoc": 33, "model": [ "candid", "viteaz" ] }'; var tux; try { // procesăm șirul pentru a genera un obiect JS via obiectul JSON tux = JSON.parse (sirtux); } catch (e) { console.log (e.message); /* eroare :( */ } // obiectul 'tux' generat cu JSON.parse () console.log (tux); // serializare ca șir de caractere console.log (JSON.stringify (tux)); procesare recurgând la obiectul predefinit JSON

instrumente procesare strictă a limbajului: "use strict"; verificare statică a codului: JSLint, JSHint, ESLint suport pentru unit testing: Jasmine, Qunit, Sinon.js, Tyrtle documentarea codului: JSDoc Toolkit optimizare de cod: Closure Compiler, Scriptalizer pachete & workflow-uri: Bower, Grunt, Yeoman, de studiat și S. Buraga, Ingineria dezvoltării aplicațiilor JavaScript http://profs.info.uaic.ro/~busaco/teach/courses/cliw/web-film.html#week10

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

Aspecte mai recente vizând JavaScript?

ECMAScript 2015 (ES6) specificație standardizată ediția 6, iunie 2015 http://www.ecma-international.org/ecma-262/6.0/

ECMAScript 2015 (ES6) lista facilităților: http://es6-features.org/ https://jsfeatures.in/#es6 https://ponyfoo.com/articles/tagged/es6-in-depth

ECMAScript 2015 (ES6) definirea de clase perspectiva paradigmei obiectuale parametri cu valori implicite și parametri multipli machete pentru șiruri de caractere (template literals) declararea succintă a funcțiilor anonime (arrow functions) iteratori și generatori notificări privind rezultatul oferit de o funcție (promises) noi tipuri de date e.g., Map, Set, Proxy, Reflection modularizarea codului: module + importuri http://profs.info.uaic.ro/~busaco/teach/courses/cliw/web-film.html#week13

Definirea de clase (perspectiva paradigmei obiectuale) simple sugar over the prototype-based OO pattern https://ponyfoo.com/articles/es6-classes-in-depth

const DIST = 7, MAXPOWER = 33; class Robot { constructor (distance = 0) { this.power = 0; this.distance = distance; } move () { if (this.power < 1) { throw new RangeError('N-am energie'); } this.power--; this.distance += DIST; } addpower () { if (this.power >= MAXPOWER) { throw new RangeError('Bateria e plina'); } this.power++; } } în ES6 se pot declara parametri cu valori implicite un robot poate fi mutat, parcurgând o distanță prestabilită și consumând o unitate energică suplimentar, poate fi alimentat cu energie

const DIST = 7, MAXPOWER = 33; class Robot { constructor (distance = 0) { this.power = 0; this.distance = distance; } move () { if (this.power < 1) { throw new RangeError('N-am energie'); } this.power--; this.distance += DIST; } addpower () { if (this.power >= MAXPOWER) { throw new RangeError('Bateria e plină'); } this.power++; } } // instanțiem un robot // distanța ia valoarea implicită let robot = new Robot(); console.log (robot.distance); try { robot.addpower(); robot.move(); robot.move(); } catch (e) { console.error (e.message); } finally { console.log ('M-am deplasat cu ' + robot.distance + ' metri, iar energia actuală este ' + robot.power); }

const DIST = 7, MAXPOWER = 33; class Robot { constructor (distance = 0) { this.power = 0; this.distance = distance; } move () { if (this.power < 1) { throw new RangeError('N-am energie'); } this.power--; this.distance += DIST; } addpower () { if (this.power >= MAXPOWER) { throw new RangeError('Bateria e plină'); } this.power++; } } // instanțiem un robot // distanța ia valoarea implicită let robot = new Robot(); console.log (robot.distance); try { robot.addpower(); robot.move(); robot.move(); } catch (e) { console.error (e.message); } finally { console.log ('M-am deplasat cu ' + robot.distance + ' metri, iar energia actuală este ' + robot.power); }

class R2D2 extends Robot { constructor (distance) { super(distance * 2); } move () { super.move(); this.power++; // R2D2 nu consumă energie ;) } } mai sunt permise: extinderi de clasă via extends acces cu super la membrii din clasa de bază metode de tip get și set metode statice specificate cu prefixul static (similar C++)

Noi declarații de variabile const valori constante vizibile la nivel de bloc let alternativă la var, cu vizibilitate la nivel de bloc (mărginirea domeniului de vizibilitate scope) ponyfoo.com/articles/es6-let-const-and-temporal-dead-zone-in-depth

function TestareVar() { var x = 33; if (true) { // aceeași variabilă var x = 74; console.log(x); // 74 } console.log(x); // 74 } function TestareLet() { let x = 33; if (true) { // variabilă diferită! let x = 74; console.log(x); // 74 } console.log(x); // 33 } developer.mozilla.org/en/docs/web/javascript/reference/statements/let

Parametrii unei funcții pot fi multipli (rest parameters) function concateneaza (...cuvinte) { return cuvinte.join(' '); } var sir = concateneaza ('ES6', 'e', 'super!'); console.log(sir); // "ES6 e super!" https://ponyfoo.com/articles/es6-spread-and-butter-in-depth

Destructurare în ES6 (destructuring) binds properties to as many variables as you need and it works with both arrays and objects https://ponyfoo.com/articles/es6-destructuring-in-depth

// selectarea elementelor dorite dintr-o listă (tablou) let [ primul,, ultimul ] = [ 'Radu', 'Ana', Date.now() ]; console.log (primul); // "Radu" console.log (ultimul); // data curentă în secunde // oferă coordonatele geografice pentru Iași function furnizeazacoordonate () { return { lat: 47.16667, long: 27.6 }; } var { lat, long } = furnizeazacoordonate (); console.log (lat); // furnizează un număr natural generat aleatoriu dintr-un anumit interval function aleator ({ min = 1, max = 300 } = { }) { return Math.floor(Math.random() * (max - min)) + min; } console.log (aleator());

Machete privind substituția de valorile de bază (template literals) machetă = orice șir de caractere delimitat de simbolul ` (inclusiv specificat pe mai multe linii de text multiline) o machetă poate include expresii JavaScript specificate cu ${ } ce vor fi înlocuite cu valoarea evaluată

var article = { // un obiect JS oferind date despre un articol title: 'Un exemplu de machete ES6', teaser: 'facilitati oferite de machete de substituție de valori', body: 'Generare HTML cu noul JavaScript', tags: [ 'ES6', 'JavaScript', 'HTML5' ] }; var { title, teaser, body, tags } = article; // destructurare var html = `<article> <header><h1>${title}</h1></header> <section> <h2>articol referitor la ${teaser}</h2> <p class='slogan'>${body}</p> </section> <footer> <ul>${tags.map(tag => `<li>${tag}</li>`).join('\n ')}</ul> </footer> </article>`; fiecărui element din tabloul tags îi corespunde o machetă a cărei valoare va fi un marcaj HTML console.log (html);

alte detalii sunt furnizate de https://ponyfoo.com/articles/es6-template-strings-in-depth http://es6-features.org/#stringinterpolation

Arrow functions declarare succintă a unei funcții anonime parametri => valoareoferită nu posedă propriile valori pentru this, arguments, super https://ponyfoo.com/articles/es6-arrow-functions-in-depth

// funcție anonimă cu un singur argument de intrare // se întoarce valoarea unei expresii JS console.log ( [2, 3, 5].map (numar => numar * 7) ); // [14, 21, 35] // în JavaScript clasic (ES5): console.log ( [2, 3, 5].map (function (numar) { return numar * 7; }) );

// definirea unei funcții recursive în ES6; aici, factorialul let factorial = (numar) => { return numar === 0? 1 : numar * factorial (numar - 1); }; console.log ( factorial (5) ); // 120

// prelucrarea facilă a tablourilor: filtrare, asociere de valori, var numere = [1, 7, 50, 74, 9, 85, 51, 12, 7, 15]; // suma tuturor valorilor: 311 var suma = numere.reduce ((a, b) => a + b); // doar numerele impare: [1, 7, 9, 85, 51, 7, 15] var impare = numere.filter (val => val % 2 === 1); // valorile pătratelor var patrate = numere.map (val => Math.pow(val, 2)); developer.mozilla.org/web/javascript/reference/functions/arrow_functions

Iteratori iterarea valorilor se poate realiza asupra oricărui obiect generarea de secvențe de valori (finite ori infinite) ce se pot prelucra via noua construcție for of https://ponyfoo.com/articles/es6-iterators-in-depth

secvența fiind infinită, trebuie să ieșim cu break

Iteratori remarcă: un singur element al secvenței poate fi accesat la un moment dat (lasy in nature)

Generatori generator = tip special de iterator ce returnează g obiecte de tip generator care ulterior pot fi iterate cu Array.from(g), [ g] sau for valoare of g https://ponyfoo.com/articles/es6-generators-in-depth

Generatori oprirea temporară și apoi continuarea execuției unui generator se realizează via yield https://developer.mozilla.org/web/javascript/reference/operators/yield

// declararea unui generator de identificatori numerici function* idmaker() { var index = 0; while (index < 3) yield index++; } var gen = idmaker(); console.log (gen.next().value); // 0 console.log (gen.next().value); // 1 console.log (gen.next().value); // 2 console.log (gen.next().value); // undefined aspecte (mai) avansate la http://exploringjs.com/es6/ch_generators.html https://www.promisejs.org/generators/

Promises a promise represents the eventual result of an asynchronous operation represents an operation that hasn t completed yet, but is expected in the future developer.mozilla.org/web/javascript/reference/global_objects/promise

Promises fiecare obiect de tip Promise se poate afla în una dintre stările: pending stare inițială, operația nu s-a terminat sau a fost anulată

Promises fiecare obiect de tip Promise se poate afla în una dintre stările: fulfilled operația s-a terminat cu succes, oferind un rezultat

Promises fiecare obiect de tip Promise se poate afla în una dintre stările: rejected operația a eșuat, oferindu-se un motiv (eroarea survenită)

// implementarea unui obiect Promise var promise = new Promise (function(resolve, reject) { // realizarea unor operații (eventual, în mod asincron) // apoi, în funcție de ceea ce s-a întâmplat if (/* totul e în regulă */) { resolve ("A mers!"); } else { reject (Error("S-a stricat")); } }); specificația pentru implementarea standardizată: https://promisesaplus.com/ biblioteci JS: https://promisesaplus.com/implementations

// implementarea unui obiect Promise var promise = new Promise (function(resolve, reject) { // realizarea unor operații (eventual, în mod asincron) // apoi, în funcție de ceea ce s-a întâmplat if (/* totul e în regulă */) { resolve ("A mers!"); } else { reject (Error("S-a stricat")); } }); // utilizarea ulterioară promise.then (function(result) { console.log (result); // "A mers!" }, function(err) { console.log (err); // Error: "S-a stricat" });

metodele then() și catch() pot fi înlănțuite un tutorial, oferind exemple pragmatice: www.html5rocks.com/en/tutorials/es6/promises/ a se studia și github.com/wbinnssmith/awesome-promises

Noi tipuri de date ES6 Symbol Map Set WeakMap WeakSet Proxy Reflection

Extinderea unor tipuri existente Number exprimarea de valori binare și octale String suport mai bun pentru Unicode RegExp operatorul y (sticky matching)

Module // --json.js-- function preiajson (url, callback) { let xhr = new XMLHttpRequest(); xhr.onload = function () { callback (this.responsetext) }; xhr.open ("GET", url, true); xhr.send (); } export function oferacontinut (url, callback) { preiajson (url, date => callback(json.parse(date))); } specificarea unui modul ce oferă (exportă) funcționalități

Module // --json.js-- function preiajson (url, callback) { let xhr = new XMLHttpRequest(); xhr.onload = function () { callback (this.responsetext) }; xhr.open ("GET", url, true); xhr.send (); } // --main.js-- (utilizarea modulului) import { oferacontinut } from "json.js"; oferacontinut ("http://undeva.info ", date => { proceseaza (date); }); export function oferacontinut (url, callback) { preiajson (url, date => callback(json.parse(date))); } aspecte avansate: exploringjs.com/es6/ch_modules.html ponyfoo.com/articles/es6-modules-in-depth

Instrumente ES6 în principal, convertire ES6 ES5 Babel https://babeljs.io/ Traceur https://github.com/google/traceur-compiler de consultat https://github.com/addyosmani/es6-tools

ECMAScript 2016 (ES7) specificație standardizată ediția 7, iunie 2016 http://www.ecma-international.org/ecma-262/7.0/

ECMAScript 2016 (ES7) operatorul ** (exponent) let valoarelacub = val => val ** 3; // Math.pow (val, 3); tablou cu elemente create dinamic (array comprehensions) [ for (x of [ 2, 3, 9, 4, 7 ]) if ( x % 2 === 0) x ]; // valori pare: [ 2, 4 ] funcții/generatori de tip asincron (async functions/generators) http://thecodebarbarian.com/common-async-await-design-patterns-in-node.js.html și altele

Alte resurse disponibile liber: Nicholas C. Zakas, Understanding ECMAScript 6 (2015) https://leanpub.com/understandinges6/read Axel Rauschmayer, Exploring ES6 (2017) http://exploringjs.com/es6/index.html Wolfram Kriesing, ES6 Katas (2016) http://es6katas.org/ Axel Rauschmayer, Exploring ES2016 & ES2017 (2017) http://exploringjs.com/es2016-es2017/index.html

N-am putea dezvolta în JavaScript aplicații Web la nivel de server?

node.js: caracterizare Node.js is a JavaScript runtime built on Chrome s V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js package ecosystem npm is the largest ecosystem of open source libraries in the world. Node.js is designed to build scalable network applications.

Ryan Dahl concepe Node.js (2009) http://nodejs.org/ rulează pe mașini respectând POSIX + Windows (2011) adoptat de industrie (2012) e.g., Cloud9 IDE, ebay, LinkedIn, Storify, Yahoo! Node.js Foundation (2015) IBM, Intel, Joyent, Microsoft, RedHat, SAP, The Linux Foundation, io.js o variantă Node.js concepută în ES6 al cărei cod-sursă a fost încorporat în Node.js 4 (2015) Node.js 6.10 LTS Long Term Support (februarie 2017) versiune stabilă actuală pentru uz în producție Node.js 7.7.3 varianta cea mai recentă (14 martie 2017) https://github.com/nodejs/node

node.js Permite dezvoltarea de aplicații Web la nivel de server în limbajul JavaScript recurge la V8 procesor (interpretor) JavaScript creat de Google, implementat în C++ și disponibil liber https://developers.google.com/v8/

node.js: caracterizare Oferă suport pentru cele mai importante protocoale Web și Internet HTTP (HyperText Transfer Protocol) DNS (Domain Name System) TLS (Transport Layer Security) functionalități de nivel scăzut (socket-uri TCP)

Uzual, o aplicație node.js: Web caracterizare realizează un număr mare de operații în acest caz, asincrone de intrare/ieșire G. Yeh (2014): www.slideshare.net/garyyeh165/basic-understanding-and-implement-of-nodejs

node.js: caracterizare Operațiile de intrare/ieșire sunt asincrone fiecare cerere (operație) adresată aplicației e.g., acces la disc, la rețea, la alt proces poate avea atașată o funcție de tratare a unui eveniment specific evented I/O

cod JS executat de client (browser Web) așteaptă și tratează evenimente de interacțiune (onclick, onmouseover, onkeypressed, ) programul trebuie să fie responsiv atunci când așteaptă încărcarea datelor de pe rețea (e.g., JSON, XML, imagini, video) via Ajax/Comet ori socket-uri Web procesare bazată pe evenimente evented/ event-based asincronism (e.g., operatii neblocante) cod JS rulat pe partea de server (node.js) așteaptă și tratează cereri (evenimente) provenite de la client(i) programul trebuie să fie responsiv atunci când așteaptă încărcarea datelor locale/externe (preluate din baze de date, fișiere, servicii Web, API-uri, ) adaptare după Ben Sheldon (2012): http://www.island94.org/?p=3066

node.js: caracterizare O aplicație node.js rulează într-un singur proces event loop an entity that handles & processes external events and converts them into callback invocations codul JavaScript nu este executat paralel, dar tratează în mod asincron diverse evenimente I/O http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

Aplicația Node.js reacționează la evenimente node.js: caracterizare context mai larg: reactive programming http://reactivex.io/ G. Yeh (2014): www.slideshare.net/garyyeh165/basic-understanding-and-implement-of-nodejs

node.js: caracterizare O aplicație node.js rulează într-un singur proces deosebire esențială față de serverele de aplicații Web tradiționale ce recurg la servere multi-process/threaded

node.js: caracterizare O aplicație node.js rulează într-un singur proces server tipic server node.js adaptare după Ben Sheldon (2012): http://www.island94.org/?p=3066

HTTP: server Web http://strongloop.com/strongblog/node-js-is-faster-than-java/

node.js: caracterizare Mediul node.js e disponibil gratuit open source pentru platformele UNIX/Linux, Windows, MacOS https://nodejs.org/en/download/

funcționalități suplimentare oferite de module administrate cu npm https://npmjs.org/

node.js: caracterizare Oferă un mediu de execuție în linia de comandă, pe baza unor biblioteci C++ și a procesorului V8 node program.js

node.js: exemplu Un prim program care emite mesaje de salut // salutari.js: un program (de sine-stătător) care emite un salut console.log ('Salutari banale din Node.js'); invocarea unei metode oferită de un obiect predefinit

node.js: exemplu Un prim program care emite mesaje de salut // salutari.js: un program (de sine-stătător) care emite un salut console.log ('Salutari banale din Node.js'); > node salutari.js Salutari banale din Node.js

/* Un program JavaScript ilustrând comportamentul asincron al operațiilor I/O implementate de Node.js */ var fs = require ('fs'); // acces la sistemul de fișiere fs.readfile ('salutari.txt', 'utf-8', function (eroare, date) { if (eroare) throw eroare; // excepție de citire console.log (date); }) console.log ('Gata!'); execuția (cod interpretat) pornește de la prima linie a programului JavaScript

/* Un program JavaScript ilustrând comportamentul asincron al operațiilor I/O implementate de Node.js */ var fs = require ('fs'); // acces la sistemul de fișiere fs.readfile ('salutari.txt', 'utf-8', function (eroare, date) { if (eroare) throw eroare; // excepție de citire console.log (date); }) console.log ('Gata!'); începe execuția unei operații asincrone (aici, citirea conținutului unui fișier text) care returnează imediat

/* Un program JavaScript ilustrând comportamentul asincron al operațiilor I/O implementate de Node.js */ var fs = require ('fs'); // acces la sistemul de fișiere fs.readfile ('salutari.txt', 'utf-8', function (eroare, date) { if (eroare) throw eroare; // excepție de citire console.log (date); }) console.log ('Gata!'); execuția continuă cu ultima linie de program > node asincronism.js Gata!

/* Un program JavaScript ilustrând comportamentul asincron al operațiilor I/O implementate de Node.js */ var fs = require ('fs'); // acces la sistemul de fișiere fs.readfile ('salutari.txt', 'utf-8', function (eroare, date) { if (eroare) throw eroare; // excepție de citire console.log (date); }) console.log ('Gata!'); după care sunt afișate datele preluate din fișier > node asincronism.js Gata! Un prim salut... Acesta este al doilea salut.

// Un program JavaScript care salută toți posibilii săi clienți Web var http = require ('http'); // folosim 'http', un modul Node predefinit http.createserver ( // creăm un server Web // funcție anonimă ce tratează o cerere și trimite un răspuns function (cerere, raspuns) { // afișăm la consola serverului mesaje de diagnostic console.log ('Am primit o cerere...'); // stabilim valori pentru diverse câmpuri din antetul mesajului HTTP raspuns.writehead (200, { 'Content-Type': 'text/html' }); // emitem răspunsul propriu-zis conform tipului MIME (aici, cod HTML) raspuns.end ('<html><body><h1>salutari </h1></body></html>'); } // serverul ascultă cereri la portul 8080 al mașinii locale ).listen (8080, "127.0.0.1"); console.log ('Serverul creat asteapta cereri la http://127.0.0.1:8080/');

programul JavaScript creat funcționează ca un server Web pentru fiecare cerere emisă de un posibil client (browser, aplicație desktop etc.) conform modelului client/server pe partea de server așteptare de cereri > node salutari-web.js Serverul creat asteapta cereri la http://127.0.0.1:8080/ Am primit o cerere... Am primit o cerere...

programul JavaScript creat funcționează ca un server Web pentru fiecare cerere emisă de un posibil client (browser, aplicație desktop etc.) conform modelului client/server pe partea de server așteptare de cereri > node salutari-web.js Serverul creat asteapta cereri la http://127.0.0.1:8080/ Am primit o cerere... Am primit o cerere... la client recepționarea răspunsului conform cererii GET emise de un program desktop și de un navigator Web > node client-salutari.js Am primit raspuns de la server -- cod HTTP: 200 Continut receptionat: <html><body> <h1>salutari din Node.js</h1></body></html>

// Un program JS care implementează un client pentru serviciul de salut var http = require ('http'); http.get ('http://127.0.0.1:8080/', // emite o cerere HTTP function (raspuns) { console.log ('Am primit raspuns de la server -- cod HTTP: ' + raspuns.statuscode); // statuscode: 200, 404, }) // tratăm diverse evenimente via funcții (eventual, anonime) de tip callback.on ('error', // eroare function (e) { console.log ('Eroare: ' + e.message); }).on ('response', // receptare răspuns de la server function (raspuns) { // există date de procesat raspuns.on ('data', function (date) { console.log ('Continut receptionat: ' + date); }); } );

node.js: module Funcția require () specifică utilizarea unui modul Node.js module predefinite (built-in): privitoare la tehnologii Web http, https, url, querystring referitoare la fișiere fs, path vizând rețeaua net, dns, dgram, tls, resurse privind sistemul de operare os, child_process alte aspecte de interes buffer, console, util, crypto

node.js: module documentația online aferentă nodejs.org/en/docs/ devdocs.io/node/

node.js: module http Dezvoltarea de aplicații Web via modulul http funcționalități HTTP de bază crearea unui server Web: createserver() realizarea de cereri HTTP: request() get()

node.js: module http Dezvoltarea de aplicații Web via modulul http servire de cereri HTTP clasa http.server metode uzuale: listen() settimeout() close() evenimente ce pot fi tratate: request connect close clienterror etc.

node.js: module http Dezvoltarea de aplicații Web via modulul http răspuns emis de server clasa http.serverresponse metode uzuale: writehead() getheader() removeheader() write() end() etc. evenimente: close finish proprietăți folositoare: statuscode headerssent

node.js: module http Dezvoltarea de aplicații Web via modulul http cerere emisă de client clasa http.clientrequest metode uzuale: write() abort() end() settimeout() setsocketkeepalive() evenimente ce pot fi tratate: response connect continue socket etc.

node.js: module http Dezvoltarea de aplicații Web via modulul http mesaj vehiculat clasa http.incomingmessage metode: setencoding() settimeout() pause() resume() evenimente ce pot fi tratate: data end close proprietăți de interes: httpversion headers method url statuscode socket

node.js: module url Procesarea adreselor Web via modulul url metode oferite: parse() format() resolve() http://nodejs.org/api/url.html

var url = require ('url'); var adresaweb = url.parse ( 'http://undeva.info:8080/oferta/jucarii/produs/?nume=tux&marime=17#descriere', true // generează un obiect 'query' ce include câmpurile din querystring ); console.log (adresaweb); if (adresaweb['query'].marime > 13) { console.log ('Jucaria e in regula.'); } else { console.log ('Jucaria e stricata.'); }

> node url.js { protocol: 'http:', slashes: true, auth: null, host: 'undeva.info:8080', port: '8080', hostname: 'undeva.info', hash: '#descriere', search: '?nume=tux&marime=17', query: { nume: 'Tux', marime: '17' }, pathname: '/oferta/jucarii/produs/', path: '/oferta/jucarii/produs/?nume=tux&marime=17', href: 'http://undeva.info:8080/oferta/jucarii/produs/?nume= ' } Jucaria e in regula.

node.js: module net Crearea de aplicații Internet modulul net partea de server: createserver() + clasa net.server metode: listen() close() address() getconnections() evenimente: listening connection close error

node.js: module net Crearea de aplicații Internet modulul net partea de client: connect() createconnection()

node.js: module net Crearea de aplicații Internet modulul net acces la socket-uri clasa net.socket metode: connect() write() setencoding() destroy() end() etc. evenimente: connect data end timeout drain error close proprietăți utile: localaddress localport remoteaddress remoteport bytesread byteswritten buffersize

node.js: module fs Acces la sistemul de fișiere via modulul fs metode folosite uzual comportament asincron: open() read() write() close() truncate() stat() chmod() rename() exists() isfile() isdirectory() issocket() mkdir() rmdir() readdir()

node.js: module fs Acces la sistemul de fișiere via modulul fs studiu de caz (Victor Porof, 2013 absolvent FII): generare de liste de melodii via itunes și Last.fm (ilustrează și maniera de creare a modulelor proprii) https://github.com/victorporof/plgen

node.js: fluxuri de date Accesul la date poate fi realizat prin intermediul fluxurilor (streams) abstractizează accesul la date stocate parțial (partially buffered data) se emit evenimente ce pot fi tratate de codul aplicației

node.js: fluxuri de date Accesul la date poate fi realizat prin intermediul fluxurilor (streams) pot fi citite stream.readable pot fi scrise stream.writable duplex (citite și scrise) stream.duplex realizând o transformare a datelor stream.transform detalii la https://nodejs.org/api/stream.html

node.js: fluxuri de date Accesul la date poate fi realizat prin intermediul fluxurilor (streams) fluxuri ce pot fi citite (readable streams) e.g., create de fs.createreadstream() http.serverrequest http.clientresponse net.socket child.stdout process.stdin

node.js: fluxuri de date Accesul la date poate fi realizat prin intermediul fluxurilor (streams) fluxuri ce pot fi citite (readable streams) e.g., create de fs.createreadstream() http.serverrequest http.clientresponse net.socket child.stdout process.stdin emit evenimentele readable data end error

node.js: fluxuri de date Accesul la date poate fi realizat prin intermediul fluxurilor (streams) fluxuri ce pot fi citite (readable streams) e.g., create de fs.createreadstream() http.serverrequest http.clientresponse net.socket child.stdout process.stdin au asociate metodele pause() resume() destroy()

node.js: fluxuri de date Accesul la date poate fi realizat prin intermediul fluxurilor (streams) fluxuri ce pot fi scrise (writeable streams) e.g., create de fs.createwritestream() http.serverresponse http.clientrequest net.socket child.stdin process.stdout

node.js: fluxuri de date Accesul la date poate fi realizat prin intermediul fluxurilor (streams) fluxuri ce pot fi scrise (writeable streams) e.g., create de fs.createwritestream() http.serverresponse http.clientrequest net.socket child.stdin process.stdout emit evenimentele drain error

node.js: fluxuri de date Accesul la date poate fi realizat prin intermediul fluxurilor (streams) fluxuri ce pot fi scrise (writeable streams) e.g., create de fs.createwritestream() http.serverresponse http.clientrequest net.socket child.stdin process.stdout oferă metodele write() end() destroy()

// Program ce preia ceea ce tastează utilizatorul la intrarea standard // și scrie într-un fișier conform M. Takada (2012) var fs = require ('fs'); var fisier = fs.createwritestream ('./spion.txt'); // la apariția datelor, le scriem în fișier process.stdin.on ('data', function (date) { fisier.write (date); } ); // tratăm evenimentul de terminare a fluxului process.stdin.on ('end', function() { fisier.end (); } ); // "reactivăm" intrarea standard; implicit, e în starea 'paused' process.stdin.resume (); obiectul process e global detalii la https://nodejs.org/api/process.html

node.js: fluxuri de date Accesul la date poate fi realizat prin intermediul fluxurilor (streams) exemple de fluxuri de tip duplex: socket-uri TCP create cu net.socket() privind arhivele create cu zlib nodejs.org/api/zlib.html date criptate via crypto nodejs.org/api/crypto.html

node.js: rulare temporizată Se poate planifica execuția codului JavaScript recurgerea la funcțiile globale settimeout () cleartimeout () setinterval () clearinterval ()

// creăm un server Web care trimite fiecărui client secvența valorilor unui contor var server = http.createserver ().listen (8080, '127.0.0.1'); // stabilim un comportament la apariția evenimentului 'request' (cerere de la un client) server.on ('request', function (cerere, raspuns) { console.log ('Cerere de la clientul ' + cerere.headers['user-agent']); raspuns.writehead (200, { 'Content-Type': 'text/html' }); var contor = 0; var interval = setinterval ( // generăm valori ale contorului conform intervalului de timp function () { raspuns.write ('<p>contorul are valoarea ' + contor + '</p>'); console.log ('Contorul are valoarea ' + contor); contor++; if (contor >= 7) { clearinterval (interval); // ștergem intervalul raspuns.end (); // închidem fluxul de răspuns console.log ('Am trimis raspuns clientului ' + cerere.headers['user-agent']); } }, 1000); // cod rulat la interval de 1000 milisecunde });

Cerere de la clientul Mozilla/5.0 (Windows NT 10.0 ) Firefox/52.0 Contorul are valoarea 0 Contorul are valoarea 1 Contorul are valoarea 2 Contorul are valoarea 3 Cerere de la clientul Edge/14.14393 Contorul are valoarea 4 Contorul are valoarea 0 Contorul are valoarea 5 Contorul are valoarea 1 Contorul are valoarea 6 codul este rulat asincron Am trimis raspuns clientului Mozilla/5.0 (Windows NT 10.0 ) Firefox/52.0 Contorul are valoarea 2 Contorul are valoarea 3 Contorul are valoarea 4 Contorul are valoarea 5 Contorul are valoarea 6 Am trimis raspuns clientului Edge/14.14393

Cerere de la clientul Mozilla/5.0 (Windows NT 10.0 ) Firefox/52.0 Contorul are valoarea 0 Contorul are valoarea 1 Contorul are valoarea 2 Contorul are valoarea 3 Cerere de la clientul Edge/14.14393 Contorul are valoarea 4 Contorul are valoarea 0 Contorul are valoarea 5 Contorul are valoarea 1 Contorul are valoarea 6 Am trimis raspuns clientului Mozilla/5.0 (Windows NT 10.0 ) Firefox/52.0 Contorul are valoarea 2 Contorul are valoarea 3 Contorul are valoarea 4 Contorul are valoarea 5 Contorul are valoarea 6 Am trimis raspuns clientului Edge/14.14393 browser-ul Web va aștepta ca întreaga secvență de valori să fie trimisă de către server de ce?

node.js: evenimente Emiterea (lansarea) și tratarea (prinderea) evenimentelor specificate de programator se realizează via event.eventemitter clasă utilizată intern de multe biblioteci de bază https://nodejs.org/api/events.html

node.js: module externe Funcția require () specifică utilizarea unui modul Node.js module disponibile on-line (instalate via utilitarul npm) de studiat Understanding NPM https://unpm.nodesource.com/

node.js: module externe Funcția require () specifică utilizarea unui modul Node.js instalare globală a unui modul: npm install modul g listarea modulelor ce sunt instalate local: npm list căutarea unui modul: npm search modul eliminarea unui modul: npm uninstall modul actualizarea unui modul: npm update modul

node.js: module acces la baze de date Operații cu baze de date relaționale SQLite recurgerea la modulul sql.js implementat în JavaScript via compilatorul emscripten nu depinde de alte module detalii la https://www.npmjs.com/package/sql.js exemple demonstrative: http://kripken.github.io/sql.js/gui/

node.js: module studiu de caz Dorim să realizăm un mini-robot care procesează conținutul diverselor resurse disponibile pe Web rol de client pentru un server Web prelucrează codul HTML Web scrapping metode consacrate: DOM (Document Object Model) SAX (Simple API for XML) în cursurile viitoare

var http = require ('http'); var qs = require ('querystring'); var dom = require ('xmldom').domparser; // de exemplu, dorim să obținem reprezentarea corespunzătoare resursei // de la http://www.google.ro/search?q=web+programming+node.js var cerere = http.get ("http://www.google.ro/search?" + qs.stringify ({ q: 'web programming node.js' }), function (raspuns) { var rezultat = ''; // răspunsul poate sosi în fragmente de date raspuns.on ('data', function (date) { // tratăm evenimentul privitor la rezultat += date; // apariția datelor }); // tratăm evenimentul de finalizare a transferului de date de la server raspuns.on ('end', function() { console.log (procesarehtml (rezultat)); }); }); conectare la un server Web

// realizează procesarea dorită (Web scrapping) function procesarehtml (document) { var adrese = [ ]; // instanțiem un procesor DOM try { var doc = new dom().parsefromstring (document, "text/html"); // preluăm toate elementele <a> var noduri = doc.getelementsbytagname ('a'); // obținem valoarea atributului 'href' (URL-ul) for (var i = 0; i < noduri.length; i++) { // plasăm în tablou doar dacă e relativ și e prefixat de "/url?q=" var uri = noduri[i].getattribute ('href'); if (!uri.match (/^http(s?)/gi) && uri.match (/^\/url\?q=/g)) adrese.push (uri); } } catch (e) { console.log (e.message); } return (adrese); } procesare document cu DOMParser https://developer.mozilla.org/domparser

node.js: module lista modulelor Node.js nodejsmodules.org/

node.js: framework-uri web Uzual, încurajează dezvoltarea de aplicații Web în care interacțiunea cu utilizatorul se realizează într-o singură pagină (SPA Single-Page Applications) real-time single-page Web apps

node.js: framework-uri web exemple Alte facilități notabile: MVC (Model-View-Controller) și variantele transfer de date în timp-real e.g., cu Socket.IO servicii Web paradigma REST suport pentru baze de date NoSQL machete de redare a conținutului (templates)

node.js: framework-uri web exemple http://nodeframework.com/

node.js: framework-uri web exemple Derby Express Flatiron Geddy Locomotive Meteor Mojito SocketStream TowerJS

node.js: framework-uri web express Framework minimalist ce încurajează dezvoltarea de aplicații Web tradiționale reprezentări multiple via hipermedia bazate pe un unic punct de acces: SPA (Single Page App) hibride (Web + aplicații native) http://expressjs.com/

/ app.js package.json bin data node_modules body-parser cookie-parser debug express lib jade morgan public images javascripts stylesheets style.css routes index.js users.js views error.jade index.jade layout.jade diverse configurări ale aplicației specificarea modelelor de date module Node.js adiționale conținut static destinat clientului (e.g., foi de stiluri CSS, biblioteci JS procesate de browser, imagini, ) rute vizând deservirea cererilor pe baza URL-urilor solicitate de client specificarea interfeței (view-ul) via machete de vizualizare descrise cu JADE: http://jade-lang.com/ eșafodajul unei aplicații Web bazate pe Express

node.js: framework-uri web MEAN (MongoDB, Express, Angular, Node.js) mean.io exemplificări: https://github.com/piyasde/express4mongoangular scotch.io/tutorials/creating-a-single-page-todo-app-with-node-and-angular

node.js: suport es6 Node.js 4+ oferă suport pentru ECMAScript 2015 (ES6) facilități deja incluse: declararea variabilelor cu let și const specificarea claselor colecții de date (Map, WeakMap, Set, WeakSet) generatori execuție asincronă (Promises)... https://nodejs.org/en/docs/es6/

node.js: suport es6 situația curentă a facilităților ECMAScript implementate de instrumente de conversie, navigatoare Web și Node.js http://kangax.github.io/compat-table/es2016plus/

node.js: suport es6 Node.js starea actuală de implementare a facilităților oferite de ECMAScript: http://node.green/

node.js: utilizări pragmatice Deservirea unui volum mare de conexiuni concurente cu necesar minim de resurse (procesor, memorie) într-un singur proces

node.js: utilizări pragmatice Procesarea în timp-real a datelor JSON oferite de API-uri (multiple) inclusiv, crearea de aplicații oferind fluxuri de date (streaming data) de studiat https://gulp.readme.io/docs/understanding-streams

node.js: utilizări pragmatice Dezvoltarea rapidă de servicii Web sau API-uri conform paradigmei REST (REpresentational State Transfer) în cursurile viitoare câteva framework-uri pentru dezvoltarea de API-uri: actionhero.js, facet, Frisby, restify, restmvc, percolator,

node.js: utilizări pragmatice Crearea de aplicații native (desktop) folosind tehnologii Web moderne precum HTML5 nw.js (fost node-webkit) utilizarea modulelor Node.js direct la nivel de DOM http://nwjs.io/

node.js: instrumente de dezvoltare Mediu de dezvoltare tradițional (desktop) exemplificări: Nodeclipse & Enide (pentru Eclipse) http://www.nodeclipse.org/ Node.js Tools for Visual Studio https://www.visualstudio.com/vs/node-js/

node.js: utilizări pragmatice dezvoltare în nori de aplicații Web e.g., Cloud9 și Koding S. Buraga, Cu codul în nori (2015) http://www.slideshare.net/busaco/cu-codul-n-nori