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