70
MEAN Stack MEAN Stack Francesco Maria Pavone Nicola Sanitate

Mean Stack

Embed Size (px)

DESCRIPTION

Presentation about Mean Stack used during the Bits&Biz 2013. You can find information about Node.js, Express, MongoDB and AngularJS, the technologies behind the Mean Stack.

Citation preview

Page 1: Mean Stack

MEAN StackMEAN Stack

Francesco Maria Pavone

Nicola Sanitate

Page 2: Mean Stack
Page 3: Mean Stack

Node.jsNode.jsNode.js is a platform built on Chrome's

JavaScript runtime for easily building fast,scalable network applications...

http://nodejs.org

Page 4: Mean Stack

Node.jsNode.jsV8 runtime (2008)

Prestazioni elevate (x10 volte rispetto al passato)Modello I/O asincrono non bloccanteSistema di pacchettizzazione (NPM registry)

Page 5: Mean Stack

Analogia del fast foodAnalogia del fast food

Page 6: Mean Stack

Da:

a:

EsempioEsempiovar file = fs.readFileSync("file.txt");// e ora aspetta...

fs.readFile("file.txt", function(err,data){ print(data);});// e ora continuiamo...

Page 7: Mean Stack

Migliaia di pacchetti (40662):Migliaia di pacchetti (40662):ExpressPassportSocket.IOKarmaJadeGruntBowerYeoman...

Page 8: Mean Stack

ExpressExpressFramework NodeJS per web applicationRouting di baseAdatto a costruire API Rest

get, post, put, deleteUtilizzo di middleware

Page 9: Mean Stack

EsempioEsempiovar express = require('express');var app = new express();...app.get('/',function(req,res){ fs.readFile("articles.json", function(err,articles){ res.json(articles); });});

Page 10: Mean Stack

MongoDbMongoDbNoSQLBase di dati a documenti

Page 11: Mean Stack

Persist differentPersist different

Page 12: Mean Stack

EsempioEsempioRealizzazione blogRealizzazione blog

Page 13: Mean Stack

EsempioEsempioLorem Ipsum

di Pinco Pallino

Tags lorem, ipsum

post autore

* 1

tag

commento

1

*post_tag

1

*

1

*CommentiMario Rossi Lorem ipsum dolor sit amet, consectetuer adipiscing elit.

Luigi Bianchi Aliquam velit dui, commodo quis, porttitor eget, convallis et, nisi. Ut venenatis.

20 settembre 2013

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In leo ante, venenatis eu, volutpat ut, imperdiet auctor, enim. Integer porta. Suspendisse fermentum. Praesent lacus. Vestibulum viverra varius enim. Sed a lorem ut est tincidunt consectetuer. Morbi urna. Nullam sapien mauris, venenatis at, fermentum at, tempus eu, urna. Etiam pede nunc, vestibulum vel, rutrum et, tincidunt eu, enim. Mauris ac massa vestibulum nisl facilisis viverra. Curabitur tincidunt tellus nec purus. Aliquam velit dui, commodo quis, porttitor eget, convallis et, nisi. Ut venenatis.

Page 14: Mean Stack

Query al databaseQuery al databaseSELECT * FROM Post p JOIN Autore aON p.autore = a.idWHERE p.id = 25;

SELECT * FROM Commento cWHERE c.post_id = 25;

SELECT * FROM Tag_post tp JOIN Tag tON t.id = tp.tag_idWHERE tp.post_id = 25;

Page 15: Mean Stack

Esempio: blog (documenti)Documenti vs RelazionaleDocumenti vs Relazionale

{ "_id" : ObjectId("3329e84fa45603fbb374bc3d"), "author" : { "name": "Albert", "surname": "Einstein" }, "title" : "Il mio post", "body" : "Il mio post", "comments" : [{ "author": "enrico", "body": "bellissimo post." }, ... ], "date" : ISODate("2013-09-20T15:21:32.543Z"), "permalink" : "Il_mio_post", "tags" : ["mongo", "database"]}

Page 16: Mean Stack

QueryQuerydb.posts.find({title: "Il mio post"})

Page 17: Mean Stack

Schema designSchema designSchemaless? (Schema flessibile)Modellazione attraverso l'applicazione

La struttura dei dati riflette ciò che l'applicazione devemanipolare

Page 18: Mean Stack

To embed or not to embed?To embed or not to embed?

Page 19: Mean Stack

EmbeddingEmbeddingProPro

Performanceaccesso al disco

Consistenzaevitare anomalie nellemodifiche

ControControDimensione documenti

Ridondanza dei dati

Page 20: Mean Stack

Linee guida per l'embeddingLinee guida per l'embeddingRelazioni 1:1Relazioni 1:1

EMBEDEMBED

Page 21: Mean Stack

UtenteEsempio 1:1Esempio 1:1

{ _id: "utente_1", username: "user1", password: "password", profilo: { eta: 25, sesso: "M", ... }}

Page 22: Mean Stack

Linee guida per l'embeddingLinee guida per l'embeddingRelazioni 1:MoltiRelazioni 1:Molti

EMBED (dai molti all'1)EMBED (dai molti all'1)

Page 23: Mean Stack

PostEsempio 1:MoltiEsempio 1:Molti

{ _id: "post_1", titolo: "post1", messaggio: "Il mio primo post", autore: "user_1", commenti: [ { messaggio: "commento 1", autore: "autore 1" }, { messaggio: "commento 2", autore: "autore 2" } ]}

Page 24: Mean Stack

Linee guida per l'embeddingLinee guida per l'embeddingRelazioni Molti:MoltiRelazioni Molti:Molti

LINK (array di ID)LINK (array di ID)

Page 25: Mean Stack

Post

Tag

Esempio Molti:MoltiEsempio Molti:Molti{ _id: "post_1", titolo: "post1", messaggio: "Il mio primo post", autore: "user_1", tags: ["tagId1", "tagId2", ...]}

{ _id: "tagId1", tag: "MongoDB"}

Page 26: Mean Stack

Operazioni di scrittura concorrentiOperazioni di scrittura concorrentiNONO Transazioni Transazioni

SISI Operazioni atomiche Operazioni atomiche

Page 27: Mean Stack
Page 28: Mean Stack

Superheroic JavaScript MVW Framework

Page 29: Mean Stack

HTML enhanced for web apps!

Page 30: Mean Stack

AngularJS is what HTML would have been,had it been designed for building web-apps.

Page 31: Mean Stack

C'era una volta...C'era una volta...

Page 32: Mean Stack

2009 @ Google Inc.2009 @ Google Inc.

Page 33: Mean Stack

Google FeedbackGoogle Feedback6 mesi di progetto17.000 linee di codice front-endsviluppo lentocodice poco testabile

Page 34: Mean Stack

FrustrazioneFrustrazione

Page 35: Mean Stack

Misko HeveryMisko Hevery

Page 36: Mean Stack

Misko HeveryMisko Heverydice di voler riscrivere l'intero progetto

da soloin 2 settimane

con una libreria open-source che ha creato lui per hobby

Page 37: Mean Stack

Misko HeveryMisko HeveryFallisce

ci mette 3 settimaneporta le linee di codice da 17.000 a 1.500

Page 38: Mean Stack

AngularJSAngularJSprogetto patrocinato da Google

394 contributors in tutto il mondosu GitHub sotto MIT License

Page 39: Mean Stack

ConcettiConcettiClient-Side TemplatesModel View ControllerData BindingDependency InjectionDirectives

Page 40: Mean Stack

Client-Side TemplatesClient-Side Templates

Page 41: Mean Stack

Server-Side TemplatesServer-Side TemplatesIl server assembla i dati e il markupIl browser riceve l'HTML e lo mostra

Page 42: Mean Stack

Client-Side TemplatesClient-Side TemplatesIl server invia dati e markupIl browser assembla l'HTML e lo mostra

Page 43: Mean Stack

ConfrontoConfronto

Server-Side TemplatesServer-Side Templates

Client-Side TemplatesClient-Side Templates

<table> <tr> <td>Totale:</td> <td>1000 €</td> </tr></table>

<table> <tr> <td>Totale:</td> <td>{{total}} €</td> </tr></table>

{total: 1000}

Page 44: Mean Stack

EsempioEsempioindex.htmlindex.html

<html ng-app> <head>

<script src="angular.js"></script> <script src="controllers.js"></script>

</head> <body>

<div ng-controller='GreetingCtrl'> <p>{{greeting.text}}, World!</p>

</div> </body>

</html>

controller.jscontroller.js

function GreetingCtrl ($scope) { $scope.greeting = { text: 'Hello' };

}

Page 45: Mean Stack

Model View ControllerModel View Controller

Page 46: Mean Stack

VantaggiVantaggimodello mentale su dove posizionare il codicefacilità per chi deve capire cosa c'è scritto nel codiceapplicazione più estendibile, manutenibile e testabile

Page 47: Mean Stack

MVC in AngularJSMVC in AngularJS

View

Controller

Model

DOM

Funzione

Oggetto

Page 48: Mean Stack

Data BindingData Binding

Page 49: Mean Stack

Prima di AJAXPrima di AJAXTecnologie come Rails, PHP e JSP aiutavano a creare UI

fondendo markup e dati prima di inviarli all'utente

Page 50: Mean Stack

Con l'arrivo di AJAXCon l'arrivo di AJAXQuesto modello è stato esteso grazie alla possibilità di

aggiornare parti del DOM separatamente

Page 51: Mean Stack

ProblemaProblemaHo due rappresentazioni dei dati!

UI JS

Page 52: Mean Stack
Page 53: Mean Stack

Data BindingData BindingSe mappate una parte della UI con una proprietà Javascript

AngularJS le manterrà sincronizzate automaticamente

Page 54: Mean Stack

EsempioEsempioindex.htmlindex.html

<html ng-app> <head>

<script src="angular.js"></script> <script src="controllers.js"></script>

</head> <body>

<div ng-controller='GreetingCtrl'> <input ng-model='greeting.text'> <p>{{greeting.text}}, World!</p>

</div> </body>

</html>

Page 55: Mean Stack

Dependency InjectionDependency Injection

Page 56: Mean Stack

Dependency InjectionDependency InjectionLe classi non creano dipendenze,

ma chiedono ciò di cui hanno bisogno

Page 57: Mean Stack

EsempioEsempiocontroller.jscontroller.js

function GreetingCtrl ($scope, $location) { $scope.greeting = { text: 'Hello', url: $location.absUrl() };

}

index.htmlindex.html

<html ng-app> <head>

<script src="angular.js"></script> <script src="controllers.js"></script>

</head> <body>

<div ng-controller='GreetingCtrl'> <input ng-model='greeting.text'> <p>{{greeting.text}}, World!</p> <p>Welcome to {{greeting.url}}</p>

</div> </body>

</html>

Page 58: Mean Stack

VantaggiVantaggiBasso accoppiamentoRiusabilitàTestabilità

Page 59: Mean Stack

Volete saperne di più?Volete saperne di più?

http://martinfowler.com/articles/injection.html

Page 60: Mean Stack

DirectivesDirectives

Page 61: Mean Stack

DirectivesDirectivesPermettono di estendere la sintassi HTMLL'unico strumento per manipolare il DOME' possibile definirne di nuove

Page 62: Mean Stack

Tutorial - ToDo ListTutorial - ToDo ListVisualizzare la todo listInserire nuovi taskCancellare task eseguiti

Page 63: Mean Stack

TutorialTutorialindex.htmlindex.html

<html ng-app> <head>

<script src="angular.js"></script> <script src="controllers.js"></script>

</head> <body>

<div ng-controller='TodoCtrl'> <form ng-submit='add()'>

<input ng-model='task'> </form> <p ng-repeat='todo in todos'>

<input type='checkbox' ng-model='todo.done' /> {{todo.text}} </p>

</div> </body>

</html>

Page 64: Mean Stack

TutorialTutorialcontroller.jscontroller.js

function TodoCtrl ($scope) { $scope.todos = [];

$scope.add = function() { $scope.todos.push({

text: $scope.task, done: false

}); $scope.task = ' ';

};

$scope.clear = function() { $scope.todos.filter(function(todo) {

return !todo.done; });

}; }

Page 65: Mean Stack

ConclusioniConclusioni

Page 66: Mean Stack

Unico linguaggioUnico linguaggio

Page 67: Mean Stack

Approccio costruttivoApproccio costruttivo

Page 68: Mean Stack

MaturitàMaturità

Page 69: Mean Stack

ny questions?ny questions?

Page 70: Mean Stack

rigatourigatou