avansat tehnologii webbusaco/teach/courses/web/presentations/web05... · ga .ro / ~ co / adoptă...

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

Upload: others

Post on 29-Dec-2019

15 views

Category:

Documents


0 download

TRANSCRIPT

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/Tehnologii Web

    programare Web

    ⍟JavaScript la nivel de server – Node.js

    (aspecte esențiale)

    avansat

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    „Cine a văzut vreodată o bijuterie frumos cizelatăde bijutier cu ajutorul ciocanului?”

    Jan Amos Comenius

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    JavaScript

    un limbaj de programare pentru Web

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Limbaj de tip script (interpretat)

    destinat să manipuleze, să automatizezeși să integreze funcționalitățile

    oferite de un anumit sistem

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Limbaj de tip script (interpretat)

    nu necesită intrări/ieșiri în mod implicit

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Adoptă diverse paradigme de programare

    imperativă

    à la C

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Adoptă diverse paradigme de programare

    funcțională

    λ calculfuncții anonime, închideri (closures),…

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Adoptă diverse paradigme de programare

    pseudo-obiectuală

    via prototipuri (obiectele moștenesc alte obiecte, nu clase)

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Adoptă diverse paradigme de programare

    dinamică

    variabilele își pot schimba tipul pe parcursul rulării programului

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Cum putem executa programele JavaScript?

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Mediu de execuție (host-environment)

    navigator Web

    permite rularea de aplicații Web la nivelul unei platforme(un sistem de operare)

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Mediu de execuție (host-environment)

    navigator Web

    „injectarea” de cod JavaScriptîn documentele HTML via elementul

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Mediu de execuție (host-environment)

    navigator Web

    „injectarea” de cod JavaScriptîn documentele HTML via elementul

    cod extern referit printr-un URL vs. cod inclus direct în pagina Web

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Mediu de execuție (host-environment)

    independent de navigatorul Web

    platforme de dezvoltare de aplicații distribuite: Node.jsservere Web – nginScript în cadrul Nginx

    servere de baze de date – e.g., Apache CouchDBcomponente ale sistemului de operare

    aplicații de sine-stătătoare – e.g., Adobe Creative Suite

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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: sintaxa

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Number

    reprezentare în dublă precizie

    stocare pe 64 biți – standardul IEEE 754

    caracteristici: tipuri de date

    developer.mozilla.org/Web/JavaScript/Reference/Global_Objects/Number

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    String

    secvențe de caractere Unicode

    fiecare caracter ocupă 16 biți (UTF-16)

    caracteristici: tipuri de date

    developer.mozilla.org/Web/JavaScript/Reference/Global_Objects/String

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Boolean

    expresii ce se pot evalua ca fiind true/false

    caracteristici: tipuri de date

    developer.mozilla.org/Web/JavaScript/Reference/Global_Objects/Boolean

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Object

    aproape totul e considerat ca fiind obiect,inclusiv funcțiile

    caracteristici: tipuri de date

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Null

    semnifică „nicio valoare”

    caracteristici: tipuri de date

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Undefined

    are semnificația „nicio valoare asignată încă”

    caracteristici: tipuri de date

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Nu există valori întregi

    caracteristici: tipuri de date

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Nu există valori întregi

    convertirea unui șir în număr: parseInt ()

    parseInt ("123") 123parseInt ("11", 2) 3

    caracteristici: tipuri de date

    indică bazade numerație

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    „Valoarea” NaN (“not a number”)

    parseInt ("Salut") NaNisNaN (NaN + 3) true

    valori speciale:Infinity

    –Infinity

    caracteristici: tipuri de date

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Șirurile sunt obiecte

    "Salut".length 5

    un caracter reprezintă un șir de lungime 1

    caracteristici: tipuri de date

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Valorile 0, "", NaN, null, undefinedsunt interpretate ca fiind false

    !!234 true

    caracteristici: tipuri de date

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Variabilele se declară cu var

    var marime;

    var numeAnimal = "Tux";

    variabilele declarate fără valori asignate, se consideră undefined

    caracteristici: variabile

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Dacă nu se folosește var,atunci variabila este considerată globală

    de evitat așa ceva!

    caracteristici: variabile

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Valorile sunt „legate” tardiv la variabile(late binding)

    caracteristici: variabile

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Similari celor din C:

    pentru numere: + – * / %testare: == === != !== ?:asignare: += –= *= /= %=

    incrementare și decrementare: ++ – –logici: ! && ||

    concatenare de șiruri: "Java" + "Script" "JavaScript"

    caracteristici: operatori

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Conversia tipurilor se face „din zbor” (dinamic)

    "3" + 4 + 5 3453 + 4 + "5" 75

    adăugând un șir vid la o expresie,o convertim pe aceasta la string

    caracteristici: operatori

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Egalitatea valorilor se testează cu == și !=

    1 == true true

    a se folosi: 1 === true false

    caracteristici: operatori

    inhibă conversiatipurilor de date

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Aflarea tipului unei expresii: operatorul typeoftypeof "Tux" string

    caracteristici: operatori

    operand rezultat

    undefined 'undefined'

    null 'object'

    de tip Boolean 'boolean'

    de tip Number 'number'

    de tip String 'string'

    Function 'function'

    orice alte valori 'object'

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Operatorii logici && și ||

    var nume = unNume || "Implicit";

    caracteristici: operatori

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Operatorul ternar de test ? :

    var prezență = (studenți > 33) ? "Prea mulți" : "Cam puțini…";

    caracteristici: operatori

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Testare: if … else, switchpentru 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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Ciclare: while, do … while, for

    do {

    var nume = preiaNume ();

    } while (nume != "");

    for (var contor = 0; contor < 33; contor++) {

    // de 33 de ori…

    }

    caracteristici: control

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Excepții: try … catch … finallytry {

    // 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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Excepții: try … catch … finallytry {

    // 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: control

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

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

    caracteristici: obiecte

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

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

    proprietățile pot conține alte obiecte,valori primitive sau metode

    caracteristici: obiecte

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Obiecte predefinite:

    Global Object

    Function Array

    String RegExp

    Boolean Number

    Math Date

    caracteristici: obiecte

    de studiat developer.mozilla.org/JavaScript/Reference/Global_Objects

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Obiecte fundamentale vizând gestionarea erorilor

    Error

    EvalError

    RangeError

    ReferenceError

    SyntaxError

    TypeError

    URIError

    caracteristici: obiecte

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Create prin intermediul operatorului new:

    var ob = new Object();

    var ob = { }; // echivalent cu linia anterioară

    caracteristici: obiecte

    se preferă această sintaxă

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Accesarea proprietăților – operatorul .

    ob.nume = "Tux";

    var nume = ob.nume;

    caracteristici: obiecte

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Accesarea proprietăților – operatorul .

    ob.nume = "Tux";

    var nume = ob.nume;

    echivalent cu:

    ob["nume"] = "Tux";

    var nume = ob["nume"];

    caracteristici: obiecte

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Declarare + asignare:

    var pinguin = {

    nume: "Tux",

    proprietati: {

    culoare: "verde",

    marime: 17

    }

    }

    caracteristici: obiecte

    accesare:pinguin.proprietati.marime 17

    pinguin["proprietati"]["culoare"] verde

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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)

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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: obiecte

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Tipuri speciale de obiecte

    proprietățile (cheile) sunt numere,nu șiruri de caractere

    caracteristici: tablouri

    developer.mozilla.org/Web/JavaScript/Reference/Global_Objects/Array

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Elementele pot aparțineunor tipuri de date eterogene

    var animale = [ 33, "vierme", false, "gaga" ];

    caracteristici: tablouri

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Tablourile pot avea „găuri” (sparse arrays):

    var animale = [ "pinguin", "omida", "pterodactil" ];

    animale[33] = "om";

    animale.length 34typeof animale[13] undefined

    caracteristici: tablouri

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Tablourile pot avea „găuri” (sparse arrays):

    var animale = [ "pinguin", "omida", "pterodactil" ];

    animale[33] = "om";

    animale.length 34typeof animale[13] undefined

    pentru a adăuga elemente putem recurge la:animale[animale.length] = altAnimal;

    caracteristici: tablouri

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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));

    }

    caracteristici: tablouri – exemplu

    adaptare după John Kugelman (2009)

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    rezultatul obținut în urma rulării programului JavaScript via aplicația JS Bin

    http://jsbin.com/

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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: tablouri

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Definite via function

    function transformaPixeliInPuncte (px) {var puncte = px * 300;return puncte;

    }

    caracteristici: funcții

    developer.mozilla.org/Web/JavaScript/Reference/Global_Objects/Function

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Dacă nu este întors nimic în mod explicit, valoarea de retur se consideră undefined

    caracteristici: funcții

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Funcțiile sunt tot obiecte

    astfel, pot fi specificate funcții anonime

    în acest sens, JavaScript este un limbaj funcțional

    caracteristici: funcții

    expresiilambda

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

    variabilele declarate în funcție nu vor fi

    accesibile din exterior, fiind „închise”

    funcție closure

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

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

    console.log ( media() );

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    variabila media este de tip functionapelul media() întoarce valoarea NaN

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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)

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Operatorul new creează un nou obiect vid șiapelează 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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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: obiecte

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

    // instanțierea unui obiectvar tux = new Animal ("Tux", 17); console.log (tux.oferaNume ());var jox = tux;console.log (jox.oferaNume ());// alt obiectvar pax = new Animal ("Pax", 15); pax.marime = 21;console.log (pax.oferaMarime ());

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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: obiecte

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Orice obiect deține trei tipuri de proprietăți:

    named data propertyo proprietate având asignată o valoare

    named accessor propertyde tip setter/getter pentru a stabili/accesa o valoare

    internal propertyfolosită exclusiv de procesorul ECMAScript (JavaScript)

    caracteristici: proprietăți

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Fiecare proprietate are asociate atributele:

    [[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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    proprietăți interne importante (folosite de procesorul ECMAScript, dar inaccesibile la nivel de program)

    [[Prototype]] definește ierarhiilor de obiecte

    [[Get]] [[Put]] [[CanPut]] pentru accesarea valorilor

    [[HasProperty]]

    [[DefineOwnProperty]]

    [[GetProperty]]

    [[GetOwnProperty]]

    [[Delete]]

    manipularea proprietăților

    [[Extensible]] indică obiectele ce pot fi extinse

    [[Construct]]

    [[Call]]asociate obiectelor executabile

    (funcții)

    [[Code]]

    [[Scope]]desemnează codul & contextul

    unei obiect de tip funcție

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    // 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 }

    )

    caracteristici: proprietăți

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Deoarece orice obiect deține în mod implicit proprietatea prototype,

    structura unei „clase” poate fi extinsă ulterior

    caracteristici: prototipuri

    developer.mozilla.org/Web/JavaScript/Reference/Global_Objects/Object/prototype

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Dacă se încearcă accesarea unui element inexistentîn cadrul unui obiect dat,

    se va verifica lanțul de prototipuri (prototype chain)

    caracteristici: prototipuri

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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 Animalvar tux = new Animal ("Tux", 17);

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Pentru a cunoaște tipul unui obiect(pe baza constructorului și a ierarhiei de prototipuri)

    se folosește operatorul instanceof

    caracteristici: prototipuri

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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: prototipuri

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Adăugarea unei metode se realizează via prototype

    Animal.prototype.oferaNumeMare = function () {

    return this.nume.toUpperCase ();

    };

    tux.oferaNumeMare () "TUX"

    caracteristici: extinderea claselor

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Cel mai general prototype este cel al lui Object

    una dintre metodele disponibile – predefinite –este toString() care poate fi suprascrisă (over-ride)

    caracteristici: extinderea claselor

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    var tux = new Animal ("Tux", 17);

    tux.toString () [object Object]

    Animal.prototype.toString = function () {return '' + this.oferaNume () + '';

    };

    tux.toString () "Tux"

    caracteristici: extinderea claselor

    Atenție la pericole! – e.g., comportamentul diferital construcției for (var proprietate in obiect)

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Șablon general:

    ClasaDeBaza = function () { /* … */ };

    SubClasa = function () { /* … */ };

    SubClasa.prototype = new ClasaDeBaza ();

    caracteristici: extinderea claselor

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    JavaScript oferă un singur spațiu de nume, la nivel global

    conflicte privind denumirea funcțiilor/variabilelorspecificate de programe diferite,

    concepute de mai multi dezvoltatori

    caracteristici: încapsulare

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

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

    caracteristici: încapsulare

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Codul poate fi complet încapsulatvia funcții anonime

    care „păstrează” construcțiile la nivel privat

    caracteristici: încapsulare

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Declararea imbricată – ca expresii de tip funcție –a funcțiilor anonime are denumirea closures

    https://developer.mozilla.org/en/JavaScript/Guide/Closures

    caracteristici: closures

    închideri

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Șablonul general:

    // specificarea unei expresii de tip funcție

    ( function () {

    // variabilele și funcțiile vor fi vizibile doar aici

    // variabilele globale pot fi accesate

    } ( ) );

    caracteristici: closures

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/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 privatemodularizarea codului (module pattern)

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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;}

    }; };

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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 */

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Totul în JavaScript este obiect – chiar și funcțiile

    de reținut!

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Orice obiect este întotdeauna mutabil(poate fi alterat oricând)

    proprietățile și metodele sunt disponibileoriunde în program (public scope)

    de reținut!

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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!

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Funcțiile ascund orice e definit în interiorul lor

    de reținut!

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Operatorul “.” este echivalentcu de-referențierea:

    ob.prop === ob["prop"]

    de reținut!

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Operatorul new creează obiecte aparținând„clasei” specificate de funcția constructor

    de reținut!

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Accesorul this este relativ la contextul execuției, nu al declarării

    de reținut!

    Atenție la dependența de mediul de execuție!

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Proprietatea prototype are valori modificabile

    de reținut!

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    JavaScript Object Notation

    http://json.org/

    json

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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/

    json

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    // 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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

    instrumente

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    instrumente

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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Aspecte mai recente vizând JavaScript?

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    ECMAScript 2015 (ES6)

    specificație standardizată – ediția 6, iunie 2015

    http://www.ecma-international.org/ecma-262/6.0/

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    ECMAScript 2015 (ES6)

    lista facilităților:http://es6-features.org/

    https://jsfeatures.in/#ES6

    https://ponyfoo.com/articles/tagged/es6-in-depth

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/ECMAScript 2015 (ES6)

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

    machete pentru șiruri de caractere (template literals)declararea succintă a funcțiilor anonime (arrow functions)

    iteratori și generatorinotificări privind rezultatul oferit de o funcție (promises)

    noi tipuri de date – e.g., Map, Set, Proxy, Reflectionmodularizarea codului: module + importuri

    http://profs.info.uaic.ro/~busaco/teach/courses/cliw/web-film.html#week13

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Definirea de clase(perspectiva paradigmei obiectuale)

    “simple sugar over the prototype-based OO pattern”

    https://ponyfoo.com/articles/es6-classes-in-depth

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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++;

    }}

    un robot poate fi mutat, parcurgând o distanță

    prestabilită și consumând o unitate energică

    suplimentar, poate fi alimentat cu energie

    în ES6 se pot declaraparametri cu valori implicite

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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);

    }

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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);

    }

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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 extendsacces – cu super – la membrii din clasa de bază

    metode de tip get și setmetode statice specificate cu prefixul static (similar C++)

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    function TestareLet() {

    let x = 33;

    if (true) {

    // variabilă diferită!

    let x = 74;

    console.log(x); // 74

    }

    console.log(x); // 33

    }

    function TestareVar() {

    var x = 33;

    if (true) {

    // aceeași variabilă

    var x = 74;

    console.log(x); // 74

    }

    console.log(x); // 74

    }

    developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    // 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());

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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ă

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    var article = { // un obiect JS oferind date despre un articoltitle: '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; // destructurarevar html = `

    ${title}

    Articol referitor la ${teaser}

    ${body}

    ${tags.map(tag => `${tag}`).join('\n ')}

    `;

    console.log (html);

    fiecărui element din tabloul tags îi corespunde o machetă a cărei valoare va fi un marcaj HTML

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    alte detalii sunt furnizate dehttps://ponyfoo.com/articles/es6-template-strings-in-depth

    http://es6-features.org/#StringInterpolation

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Arrow functions

    declarare succintă a unei funcții anonimeparametri => valoareOferită

    nu posedă propriile valori pentru this, arguments, super

    https://ponyfoo.com/articles/es6-arrow-functions-in-depth

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    // 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;

    }) );

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    // 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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    // 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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Iteratori

    remarcă:un singur element al secvenței poate fi accesat

    la un moment dat (lasy in nature)

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Generatori

    generator = tip special de iterator ce returnează gobiecte 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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Generatori

    oprirea temporară și apoi continuarea execuției unui generator se realizează via yield

    https://developer.mozilla.org/Web/JavaScript/Reference/Operators/yield

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    // 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/

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Promises

    fiecare obiect de tip Promisese poate afla în una dintre stările:

    pending – stare inițială, operația nu s-a terminat sau a fost anulată

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Promises

    fiecare obiect de tip Promisese poate afla în una dintre stările:

    fulfilled – operația s-a terminat cu succes, oferind un rezultat

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Promises

    fiecare obiect de tip Promisese poate afla în una dintre stările:

    rejected – operația a eșuat, oferindu-se un motiv (eroarea survenită)

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    // 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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    // 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"

    });

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Noi tipuri de date ES6

    SymbolMapSet

    WeakMapWeakSet

    ProxyReflection

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Extinderea unor tipuri existente

    Number – exprimarea de valori binare și octale

    String – suport mai bun pentru Unicode

    RegExp – operatorul y (sticky matching)

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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)));

    }

    aspecte avansate: exploringjs.com/es6/ch_modules.html

    ponyfoo.com/articles/es6-modules-in-depth

    // --main.js-- (utilizarea modulului)

    import { oferaContinut } from "json.js";

    oferaContinut ("http://undeva.info ",

    date => { proceseaza (date); });

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Instrumente ES6

    în principal, convertire ES6ES5

    Babel – https://babeljs.io/Traceur – https://github.com/google/traceur-compiler

    de consultat https://github.com/addyosmani/es6-tools

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    ECMAScript 2016 (ES7)

    specificație standardizată – ediția 7, iunie 2016

    http://www.ecma-international.org/ecma-262/7.0/

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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 buildscalable network applications.”

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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/

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: caracterizare

    Oferă suport pentru cele mai importanteprotocoale Web și Internet

    HTTP (HyperText Transfer Protocol)DNS (Domain Name System)

    TLS (Transport Layer Security)functionalități de nivel scăzut (socket-uri TCP)

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: caracterizareUzual, o aplicație Web 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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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 aveaatașată o funcție de tratare a unui eveniment specific

    evented I/O

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    cod JS executat declient (browser Web)

    cod JS rulat pe parteade server (node.js)

    așteaptă și trateazăevenimente de

    interacțiune(onclick, onmouseover,

    onkeypressed,…)

    procesarebazată pe

    evenimenteevented/

    event-based

    așteaptă și trateazăcereri (evenimente)

    provenite de la client(i)

    programul trebuie să fie responsiv atunci când

    așteaptă încărcareadatelor de pe rețea

    (e.g., JSON, XML, imagini, video) via Ajax/Comet

    ori socket-uri Web

    asincronism(e.g., operatiineblocante)

    programul trebuie să fie responsiv atunci când

    așteaptă încărcareadatelor locale/externe(preluate din baze de

    date, fișiere, servicii Web, API-uri,…)

    adaptare după Ben Sheldon (2012): http://www.island94.org/?p=3066

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: caracterizare

    O aplicație node.js rulează într-un singur proces

    event loop ≡ “an entity that handles & processes externalevents 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/

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: caracterizareAplicația Node.js „reacționează” la evenimente

    context mai larg: reactive programming – http://reactivex.io/

    G. Yeh (2014): www.slideshare.net/garyyeh165/basic-understanding-and-implement-of-nodejs

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: caracterizare

    O aplicație node.js rulează într-un singur proces

    deosebire esențială față de serverele de aplicații Webtradiționale ce recurg la servere multi-process/threaded

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    HTTP: server Web

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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    Mediul node.js e disponibil gratuit – open source –pentru platformele UNIX/Linux, Windows, MacOS

    https://nodejs.org/en/download/

    node.js: caracterizare

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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 uneimetode oferită de

    un obiect predefinit

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    /* 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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    /* 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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    /* 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!

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    /* 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.

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    // 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 ('Salutari…');

    }

    // 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/');

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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 Webpentru fiecare cerere emisă de un posibil client (browser,aplicație desktop etc.) conform modelului client/server

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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 GETemise de un program desktop și de un navigator Web

    > node client-salutari.js

    Am primit raspuns de la server -- cod HTTP: 200

    Continut receptionat:

    Salutari din Node.js

    programul JavaScript creat funcționează ca un server Webpentru fiecare cerere emisă de un posibil client (browser,aplicație desktop etc.) conform modelului client/server

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    // 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);

    });

    }

    );

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: module

    Funcția require () specifică utilizarea unui modul Node.js

    module predefinite (built-in):

    privitoare la tehnologii Web – http, https, url, querystringreferitoare 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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: module

    documentația online aferentă

    nodejs.org/en/docs/

    devdocs.io/node/

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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()

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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.

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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.

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: module – url

    Procesarea adreselor Web via modulul url

    metode oferite: parse() format() resolve()

    http://nodejs.org/api/url.html

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/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.');

    }

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    > 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.

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: module – net

    Crearea de aplicații Internet – modulul net

    partea de client:

    connect()

    createConnection()

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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 localPortremoteAddress remotePort bytesRead bytesWritten bufferSize

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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()

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: fluxuri de date

    Accesul la date poate fi realizatprin intermediul fluxurilor (streams)

    abstractizează accesul la date stocate parțial(partially buffered data)

    se emit evenimente ce pot fi tratate de codul aplicației

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: fluxuri de date

    Accesul la date poate fi realizatprin intermediul fluxurilor (streams)

    pot fi citite – stream.Readablepot fi scrise – stream.Writable

    duplex (citite și scrise) – stream.Duplexrealizând o transformare a datelor – stream.Transform

    detalii la https://nodejs.org/api/stream.html

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: fluxuri de date

    Accesul la date poate fi realizatprin intermediul fluxurilor (streams)

    fluxuri ce pot fi citite (readable streams)e.g., create de fs.createReadStream() http.ServerRequesthttp.ClientResponse net.Socket child.stdout process.stdin

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: fluxuri de date

    Accesul la date poate fi realizatprin intermediul fluxurilor (streams)

    fluxuri ce pot fi citite (readable streams)e.g., create de fs.createReadStream() http.ServerRequesthttp.ClientResponse net.Socket child.stdout process.stdin

    emit evenimentele readable data end error

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: fluxuri de date

    Accesul la date poate fi realizatprin intermediul fluxurilor (streams)

    fluxuri ce pot fi citite (readable streams)e.g., create de fs.createReadStream() http.ServerRequesthttp.ClientResponse net.Socket child.stdout process.stdin

    au asociate metodele pause() resume() destroy()

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: fluxuri de date

    Accesul la date poate fi realizatprin 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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: fluxuri de date

    Accesul la date poate fi realizatprin 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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: fluxuri de date

    Accesul la date poate fi realizatprin 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()

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    // 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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: fluxuri de date

    Accesul la date poate fi realizatprin 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.htmldate criptate via crypto – nodejs.org/api/crypto.html

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: rulare temporizată

    Se poate planifica execuția codului JavaScript

    recurgerea la funcțiile globalesetTimeout ()

    clearTimeout ()

    setInterval ()

    clearInterval ()

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    // 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 ('

    Contorul are valoarea ' + contor + '

    ');

    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

    });

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

    codul este rulatasincron

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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 valorisă fie trimisă de către serverde ce?

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: module externe

    Funcția require () specifică utilizarea unui modul Node.js

    module disponibile on-line (instalate via utilitarul npm)

    de studiat Understanding NPMhttps://unpm.nodesource.com/

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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 moduleliminarea unui modul: npm uninstall modulactualizarea unui modul: npm update modul

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: module – acces la baze de date

    Operații cu baze de date relaționale SQLite

    recurgerea la modulul sql.js implementat în JavaScriptvia 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/

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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 HTMLWeb scrappingmetode consacrate:

    DOM (Document Object Model)SAX (Simple API for XML)

    în cursurile viitoare

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    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

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    // realizează procesarea dorită (Web scrapping)function procesareHTML (document) {

    var adrese = [ ]; // instanțiem un procesor DOMtry {var doc = new dom().parseFromString (document, "text/html");// preluăm toate elementele 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 DOMParserhttps://developer.mozilla.org/DOMParser

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: module

    lista modulelor Node.jsnodejsmodules.org/

  • Dr.

    Sab

    in B

    ura

    ga

    profs.in

    fo.uaic.ro/~busa

    co/

    node.js: framework-uri web

    Uzual, încurajează dezvoltarea de aplicații Webîn care interacțiunea cu utilizatorulse realizează într-o singură pagină

    (SPA – Single-Page Applications)

    real-time single-page Web apps