node.js erlaubt die Ausführung von Javascript auf dem Server. Zusammen mit YUI3 gibt es jetzt auch noch einen echten DOM und plötzlich macht alles Spass :-)
Javascript auf Client und Server mit node.js - webtech 2010
1. Dirk Ginader | Yahoo! Inc.
Javascript
auf Client UND Server
2. warum JS auf dem Server?
• Web Developer mögen Javascript
• Javascript Frameworks
• Code nur einmal schreiben
• Progressive Enhancement einfach
so!
• node.js
3. node.js
• Javascript auf dem Server
• V8 Engine (rockt googles Chrome)
• blockt nicht
• statt dessen alles auf Event Basis
• CommonJS
• fantastisch schnell!
5. blockt nicht?
• in PHP:
$query="SELECT * FROM foo WHERE bar='baz'";
$result=mysql_query($query);
// ... und dann wird gewartet...
DoSomethingElse(); // passiert später
• in node.js:
db.query("SELECT * FROM foo WHERE bar='baz'",
function (update, select) {
// callback wenn fertig
});
DoSomethingElse(); // passiert sofort
6. blockt nicht?
• bei einer Abfrage nicht so schlimm
• aber bei 10?
• oder bei 100?
• node macht alle Abfragen
gleichzeitig
• php wartet auf jede einzelne
nacheinander...
• VIEL schneller!
7. Logik nur einmal schreiben!
• Wenn man progressive enhancement
ernst nimmt schreibt man viel
Business und Renderlogik zweimal
8. Logik nur einmal schreiben!
• Currency Converter
– http://finance.yahoo.com/currency-
converter/
– damals Javascript + PHP
– 2x Logik Konvertierung
– 2x Rendering
– Rundungsfehler!
9. Logik nur einmal schreiben!
• Formular Validierung
– 2x Regular Expressions!
– 2x Fehlermeldungen!
– 2x komplexes Testen von Radio- und
Selectboxen
– Anzeigen der Fehler beim Feld ist
schmerzhaft auf dem Server
10. Erste Schritte
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('Hello Worldn');
}).listen(8124, "127.0.0.1");
console.log('Server running at http://
127.0.0.1:8124/');
11. Erste Schritte
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('Hello Worldn');
}).listen(8124, "127.0.0.1");
console.log('Server running at http://
127.0.0.1:8124/');
12. Erste Schritte
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('Hello Worldn');
}).listen(8124, "127.0.0.1");
console.log('Server running at http://
127.0.0.1:8124/');
13. Erste Schritte
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('Hello Worldn');
}).listen(8124, "127.0.0.1");
console.log('Server running at http://
127.0.0.1:8124/');
14. Erste Schritte
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('Hello Worldn');
}).listen(8124, "127.0.0.1");
console.log('Server running at http://
127.0.0.1:8124/');
15. Erste Schritte
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('Hello Worldn');
}).listen(8124, "127.0.0.1");
console.log('Server running at http://
127.0.0.1:8124/');
16. node ist der Server!
• kein Apache!
•keine neue Instanz jedes mal...
• läuft ständig!
•kann persistente Daten halten!
•kann viele User gleichzeitig bedienen...
• ... und verbinden!
17. socket.io Server
var http = require('http'),
io = require('socket.io'),
server = http.createServer(function(req, res){
// hello world
});
var socket = io.listen(server);
socket.on('connection', function(client){
// neuer User!
client.on('message', function(){ … })
client.on('disconnect', function(){ … })
});
18. socket.io Client
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = new io.Socket({node_server_url});
socket.on('connect', function(){ … })
socket.on('message', function(){ … })
socket.on('disconnect', function(){ … })
</script>
• HTML5 Socket nur in Webkit!?
19. socket.io Client
• Supports
– WebSocket, Flash Socket, ActiveX
HTMLFile (IE), XHR with multipart
encoding, XHR with long-polling, JSONP
polling (for cross-domain)
• Tested on
– Safari 4, Google Chrome 5, Internet
Explorer 6, Internet Explorer 7, Internet
Explorer 8, iPhone Safari, iPad Safari,
Firefox 3, Firefox 4 (Minefield), Opera
10.61
21. express.js
• http://expressjs.com/
• Framework für node.js
• macht Application Entwicklung sehr
viel einfacher
• var app = express.createServer();
app.get('/', function(req, res){
res.send('Hello World');
});
app.listen(3000);
• url routing, static file server,
views ...
22. YUI3 auf node.js
• Dav Glass schaffte es als erster eine
Javascript Library auf node.js zu
bringen
• Die besondere Architektur von YUI3
machte das “ganz einfach”
• Auch YUI2 Module laufen jetzt auf
node (dank YUI2 in YUI3)
• Alle YUI3 Gallery Module
automatisch
23. EIN DOM AUF DEM SERVER!
• Dav Glass kombinierte
• http://github.com/tmpvar/jsdom
•um einen echten DOM wie im Browser
auf den Server zu bringen!
• http://github.com/tautologistics/
node-htmlparser
•für innerHTML Support
• fake window und document Objekte
24. Templating wie wir es kennen
<div id=‘header’>
<h1>{headline}</h1>
</div>
<div id=‘navigation’>
<ul>{nav}</ul>
</div>
<div id=‘content’>
{content}
</div>
... und jetzt muss auf einer Seite die
Navigation weg...
Neues Template?
25. Templating wie wir es wollen
<div id=‘header’>
<h1>My awesome Company</h1>
</div>
<div id=‘navigation’>
<ul>
<li class=‘home’><a href=”/”>Home</a></li>...
</ul>
</div>
<div id=‘content’>
<p>example content</p>
</div>
h1.html(‘hey!’);
content.addClass(‘active’);
navigation.remove();
26. DOM mit YUI3
• Kann genau das!
• http://express.davglass.com/
• http://github.com/davglass/yui-
express
32. nodemon autorestart
• node restart nach jeder Code
Änderung wird schnell “etwas
Anstrengend”...
• Remy Sharp fand das auch:
http://github.com/remy/nodemon
• nodemon macht das automatisch!
• $ nodemon server.js
statt
$ node server.js
33. CommonJS
• http://www.commonjs.org/
• Standard für Javascript Module mit
einheitlichem Interface
• erlaubt require(‘module’);
• Nicht nur node.js sondern auch
•couchDB
•Narwhal
•RingoJS
•...