On Github askarby / appacademy_presentation_nyheder_i_javascript_2014
Udarbejdet af Anders Bruhn Skarby / @askarby for App Academy
En blanding af slide-deck
Live-kodning (tags i git)
Dialog frem og tilbage
Hvor vi kradser i overfladen på AngularJS og lærer om de mest basale principper - lige akkurat nok til at komme igang.
Hvad gør denne applikation?
<html> <head>...</head> <body> <div id="container1"> <ul></ul> <button id="btn1"><button/> </div> <div id="container2"> <input id="inp1"/> <textarea id="edt1"><textarea/> <button id="btn2"><button/> </div> ... </body> </html>
... jeg viser ikke hele koden
... her er de vigtige dele
<html> <head> <script src="..." /> <script>...</script> ... </head> <body> <script src="..." /> <script src="..." /> <script>...<(script> <script>...</script> ... </body> </html>
Fordi:
<html> <head>...</head> <body ng-app="notepad" ng-controller="MainCtrl as main"> <notelist id="container1"> <ul> <li ng-repeat="note in notes">{{note.title}}</li> </ul> <button id="btn1" ng-click="main.createNewNote()"><button/> </notelist> <editor id="container2"> <input id="inp1" ng-model="note.title"/> <textarea id="edt1" ng-model="note.content"><textarea/> <button id="btn2" ng-click="main.save()">Save note<button/> </editor> ... </body> </html>
Controlleren er mest interessant
angular.controller('MainCtrl', function ($scope) { $scope.friend = 'Bob'; });
En del af HTML
<input type="text" ng-model="friend" /> <div>Vores ven hedder {{friend}}</div>
angular.controller('MainCtrl', function ($scope, StorageService) { $scope.friend = 'Bob'; this.save = function () { StorageService.save($scope.friend); }; }); angular.service('StorageService', function ($http) { this.saveFriend = function (friend) { // ... Use $http service ... }; });
Fordi det er begrænset hvor interessante slides er.
Hvor vi kradser i overfladen på Express og NodeJS, og lærer lige akkurat nok til at skrive en backend til vores frontend.
Vi tager dem lige en for en...
Ét event-loop, der kører i V8-motoren, som så spørger ud til eksterne C-libraries, får svar igen når event-loopet kører forbi og modulet har et svar klar. → Non-blocking I/O.
Ufattelig hurtigt til I/O - uden at skabe unødvendig load!
Man kan som webudvikler ikke udelukke sig selv fra hverken frontend eller backend
Moduler eksporteres med module.exports:
module.exports = function messenger(name) { return { sayHello: function () { console.log('Hello ' + name); }, sayBye: function () { console.log('Goodbye ' + name); } } };
Som så kan importeres vha. require
var messenger = require('./messenger.js'); messenger('Anders').sayHello(); messenger('Anders').sayBye();
En manifest-fil per modul, denne hedder package.json, skrevet i JSON
{ "name" : "some-library", "main" : "./lib/some-lib.js" }
Hvis ikke argument til require('...') findes i core modules, eller i /, ./ eller ../ - så tjekkes der i parent-folderen (med tilføjet node_modules)
Dem tager vi også lige, en for en...
Hvis du skal bruge etstatisk skrevet sprog til modellering af kompleks forretningslogik, skal du nok lede andetsteds.
Callback-baserede API'er
function processData(initial) { this.outer(initial, function (err, data) { // Work with data... }); }
function processData(initial) { this.outer(initial, function (err, data1) { data1.inner(function (err, data2) { data2.nested(function (err, data3) { data3.errrmagerd(data2, data3, function (err, data4) { // etc. }); }); }); }); }
Løsning: Brug promises
Eksempel taget fra NodeJS' website
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/');
Vi skal selv inspicere req-objektet for informationer om URL, HTTP Method etc, ved bare 2 URL'er bliver det ulæseligt!
var http = require('http'); http.createServer(function (req, res) { if (req.method === 'GET' && req.url === '/') { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); } else if (req.method === 'GET' && req.url === '/other') { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello Universe\n'); } }).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/');
Brug Express frameworket, og lav læsbar kode!
var express = require('express'); var app = express(); app.get('/', function (req, res) { res.send('Hello World'); }); app.get('/other', function (req, res) { res.send('Hello Universe'); }); var server = app.listen(1337, function () { console.log('Example app listening at http:/127.0.0.1:1337/'); });
Lad os kode en backend til vores post-it frontend.
Hvor vi lærer at bruge Gulp som et byggeværktøj, da vi ved at vores tid er dyrebar og at automatisering at repetative opgaver er alfa-omega.
Der er 2 primære byggeværktøjer i JavaScript
Skal "bygge" vores frontend - "bygge" som i:
"Jeg er doven" - brug Yeoman, sammen med gulp og bower.
npm install -g yo gulp bower npm install -g generator-gulp-angular yo gulp-angular gulp serve