58
http://serenity.su среда, 29 августа 12 г.

Node.js для начинающих

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Node.js для начинающих

http://serenity.su

среда, 29 августа 12 г.

Page 2: Node.js для начинающих

http://serenity.su

Немного о себе:• Работаю в интернете более 12 лет• Сейчас директор по технологиям в Serenity• Активно эксперементирую с HTML5/JavaScript• simonenko.su• github.com/meritt

http://serenity.su

среда, 29 августа 12 г.

Page 3: Node.js для начинающих

http://serenity.su

NODE.JS ЭТО ПЛАТФОРМА ДЛЯ СОЗДАНИЯ ЛЕГКО МАСШТАБИРУЕМЫХ СЕТЕВЫХ

ПРИЛОЖЕНИЙ

3среда, 29 августа 12 г.

Page 4: Node.js для начинающих

http://serenity.su

•Работает везде: Windows, OS X, Linux

•Устанавливается как обычное приложение

•Для начала работы не нужен сервер

•Для работы подойдет любой текстовый редактор

•Достаточно знать 1 язык для сервера и клиента

НАЧАТЬ ЛЕГКО

http://nodejs.org/#download

среда, 29 августа 12 г.

Page 5: Node.js для начинающих

http://serenity.su

ЧТО ТАКОЕ NODE.JS?

•Построен на JavaScript движке браузера Google Chrome V8

5среда, 29 августа 12 г.

Page 6: Node.js для начинающих

http://serenity.su

ЧТО ТАКОЕ NODE.JS?

•Построен на JavaScript движке браузера Google Chrome V8

•Event-driven, non-blocking I/O, streams

5среда, 29 августа 12 г.

Page 7: Node.js для начинающих

http://serenity.su

ЧТО ТАКОЕ NODE.JS?

•Построен на JavaScript движке браузера Google Chrome V8

•Event-driven, non-blocking I/O, streams

•Реализация самых важных протоколов (HTTP, DNS, TLS/SSL)

5среда, 29 августа 12 г.

Page 8: Node.js для начинающих

http://serenity.su

ЧТО ТАКОЕ NODE.JS?

•Построен на JavaScript движке браузера Google Chrome V8

•Event-driven, non-blocking I/O, streams

•Реализация самых важных протоколов (HTTP, DNS, TLS/SSL)

•Node Package Manager (npm) — уже более 9000 модулей

5среда, 29 августа 12 г.

Page 9: Node.js для начинающих

http://serenity.su

ПРИМЕР “HELLO WORLD”

var http = require('http');

var server = http.createServer(function(request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World');});

server.listen(3000);

console.log('Server running at http://127.0.0.1:3000');

среда, 29 августа 12 г.

Page 10: Node.js для начинающих

http://serenity.su

$ node server.js Server running at http://127.0.0.1:3000

РЕЗУЛЬТАТ

7среда, 29 августа 12 г.

Page 11: Node.js для начинающих

http://serenity.su

СРАВНИМ NODE.JS И PHP

•Для сравнения возьмем сайты digitalconf.ru и htmlacademy.ru

•Оба сайта расположены на одинаковом выделенном хостинге

•Для node.js используем: nginx, nodejs, express

•Для php используем: apache, php, zend framework

$ ab -c 10 -n 1000 http://digitalconf.ru/

8среда, 29 августа 12 г.

Page 12: Node.js для начинающих

http://serenity.su

РЕЗУЛЬТАТЫ

digitalconf.ru

htmlacademy.ru

0 55 110 165 220

25

203

ab -c 10 -n 1000

Requests per second

9среда, 29 августа 12 г.

Page 13: Node.js для начинающих

http://serenity.su

ПОЧЕМУ ТАК БЫСТРО!?

среда, 29 августа 12 г.

Page 14: Node.js для начинающих

http://serenity.su

ОДНОПОТОЧНЫЙ СИНХРОННЫЙ I/O

среда, 29 августа 12 г.

Page 15: Node.js для начинающих

http://serenity.su

МУЛЬТИПОТОЧНЫЙ СИНХРОННЫЙ I/O

среда, 29 августа 12 г.

Page 16: Node.js для начинающих

http://serenity.su

МУЛЬТИПОТОЧНЫЙ СИНХРОННЫЙ I/O

среда, 29 августа 12 г.

Page 17: Node.js для начинающих

http://serenity.su

Всегда можно купить еще несколько серверов, но это стоит денег.

среда, 29 августа 12 г.

Page 18: Node.js для начинающих

http://serenity.su

ОДНОПОТОЧНЫЙ АСИНХРОННЫЙ I/O

среда, 29 августа 12 г.

Page 19: Node.js для начинающих

http://serenity.su

ПРОБЛЕМА NODE.JSВ CPU ВЫЧИСЛЕНИЯХ

среда, 29 августа 12 г.

Page 20: Node.js для начинающих

http://serenity.su

COMMONJS И СИСТЕМА МОДУЛЕЙ

среда, 29 августа 12 г.

Page 21: Node.js для начинающих

http://serenity.su

// hello.jsexports.world = function(text) { return 'Hello ' + text + '!';};

// server.jsvar http = require('http');var hello = require('./hello');

var server = http.createServer(function(request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end(hello.world('ITMO'));});

server.listen(3000);

console.log('Server running at http://127.0.0.1:3000');

ПРИМЕР РАБОТЫ МОДУЛЕЙ

среда, 29 августа 12 г.

Page 22: Node.js для начинающих

http://serenity.su

$ node server.js Server running at http://127.0.0.1:3000

РЕЗУЛЬТАТ

19среда, 29 августа 12 г.

Page 23: Node.js для начинающих

http://serenity.su

NPMNODE PACKAGE MANAGER

среда, 29 августа 12 г.

Page 24: Node.js для начинающих

http://serenity.su

МОДУЛИ О КОТОРЫХ СТОИТ ЗНАТЬ

•express — sinatra inspired web development framework

•mustache — logic-less {{mustache}} templates with JavaScript

•socket.io — real-time apps made cross-browser & easy with a WebSocket-like API

•request — simplified HTTP request client

•async — higher-order functions and common patterns for asynchronous code

среда, 29 августа 12 г.

Page 26: Node.js для начинающих

http://serenity.su

ПРИМЕР “HELLO WORLD” НА EXPRESS

var express = require('express');

var server = express.createServer();

server.get('/', function(request, response) { response.send('Hello Express World');});

server.listen(3000);console.log('Server running at http://127.0.0.1:3000');

среда, 29 августа 12 г.

Page 27: Node.js для начинающих

http://serenity.su

$ node server.js Server running at http://127.0.0.1:3000

РЕЗУЛЬТАТ

24среда, 29 августа 12 г.

Page 28: Node.js для начинающих

http://serenity.su

ПОПРОБУЕМ УСЛОЖНИТЬ

среда, 29 августа 12 г.

Page 29: Node.js для начинающих

http://serenity.su

ПРИМЕР РАБОТЫ С ПАРАМЕТРАМИ

var express = require('express');var server = express.createServer();

server.get('/', function(request, response) { response.redirect('/alexey');});

server.get('/:name', function(request, response) { response.send('Hello ' + request.params.name + '!');});

server.listen(3000);console.log('Server running at http://127.0.0.1:3000');

среда, 29 августа 12 г.

Page 30: Node.js для начинающих

http://serenity.su

$ node server.js Server running at http://127.0.0.1:3000

РЕЗУЛЬТАТ

27среда, 29 августа 12 г.

Page 31: Node.js для начинающих

http://serenity.su

ТИПИЧНЫЕ ПРОБЛЕМЫ

среда, 29 августа 12 г.

Page 32: Node.js для начинающих

http://serenity.su

СОХРАНЕНИЕ ОКРУЖЕНИЯ

var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};

for (animal in animals) { setTimeout(function() { console.log(animal + ': ' + animals[animal]); }, 100);}

среда, 29 августа 12 г.

Page 33: Node.js для начинающих

http://serenity.su

СОХРАНЕНИЕ ОКРУЖЕНИЯ

var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};

for (animal in animals) { setTimeout(function() { console.log(animal + ': ' + animals[animal]); }, 100);}

$ node example.js turtles: 17turtles: 17turtles: 17turtles: 17

среда, 29 августа 12 г.

Page 34: Node.js для начинающих

http://serenity.su

СОХРАНЕНИЕ ОКРУЖЕНИЯ

var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};

for (animal in animals) { setTimeout(function() { console.log(animal + ': ' + animals[animal]); }, 100);}

$ node example.js turtles: 17turtles: 17turtles: 17turtles: 17

bad way

среда, 29 августа 12 г.

Page 35: Node.js для начинающих

http://serenity.su

var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};

for (animal in animals) { (function(animal) { setTimeout(function() { console.log(animal + ': ' + animals[animal]); }, 100); })(animal);}

СОХРАНЕНИЕ ОКРУЖЕНИЯ

среда, 29 августа 12 г.

Page 36: Node.js для начинающих

http://serenity.su

var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};

for (animal in animals) { (function(animal) { setTimeout(function() { console.log(animal + ': ' + animals[animal]); }, 100); })(animal);}

СОХРАНЕНИЕ ОКРУЖЕНИЯ

$ node example.js cats: 10dogs: 1frogs: 6turtles: 17

среда, 29 августа 12 г.

Page 37: Node.js для начинающих

http://serenity.su

var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17};

for (animal in animals) { (function(animal) { setTimeout(function() { console.log(animal + ': ' + animals[animal]); }, 100); })(animal);}

СОХРАНЕНИЕ ОКРУЖЕНИЯ

$ node example.js cats: 10dogs: 1frogs: 6turtles: 17

good way

среда, 29 августа 12 г.

Page 38: Node.js для начинающих

http://serenity.su

var fs = require('fs');

function content() { var results = []; var files = [1, 2, 3, 4, 5];

for (var i=0; i<files.length; i++) { var file = files[i] + '.txt';

fs.readFile(file, 'utf-8', function(error, data) { results.push('data for ' + file + ' file'); }); }

return results;}

var results = content();console.log(results);

БЛОКИРОВКИ

среда, 29 августа 12 г.

Page 39: Node.js для начинающих

http://serenity.su

var fs = require('fs');

function content() { var results = []; var files = [1, 2, 3, 4, 5];

for (var i=0; i<files.length; i++) { var file = files[i] + '.txt';

fs.readFile(file, 'utf-8', function(error, data) { results.push('data for ' + file + ' file'); }); }

return results;}

var results = content();console.log(results);

БЛОКИРОВКИ

$ node example.js []

среда, 29 августа 12 г.

Page 40: Node.js для начинающих

http://serenity.su

var fs = require('fs');

function content() { var results = []; var files = [1, 2, 3, 4, 5];

for (var i=0; i<files.length; i++) { var file = files[i] + '.txt';

fs.readFile(file, 'utf-8', function(error, data) { results.push('data for ' + file + ' file'); }); }

return results;}

var results = content();console.log(results);

БЛОКИРОВКИ

$ node example.js []

bad way

среда, 29 августа 12 г.

Page 41: Node.js для начинающих

http://serenity.su

var fs = require('fs');

function content(callback) { var results = []; var files = [1, 2, 3, 4, 5];

for (var i=0; i<files.length; i++) { var file = files[i] + '.txt';

(function(file) { fs.readFile(file, 'utf-8', function(error, data) { results.push('data for ' + file + ' file');

if (results.length == files.length) callback(results); }); })(file); }}

content(function(results) { console.log(results);});

БЛОКИРОВКИ

среда, 29 августа 12 г.

Page 42: Node.js для начинающих

http://serenity.su

var fs = require('fs');

function content(callback) { var results = []; var files = [1, 2, 3, 4, 5];

for (var i=0; i<files.length; i++) { var file = files[i] + '.txt';

(function(file) { fs.readFile(file, 'utf-8', function(error, data) { results.push('data for ' + file + ' file');

if (results.length == files.length) callback(results); }); })(file); }}

content(function(results) { console.log(results);});

БЛОКИРОВКИ

$ node example.js [ 'data for 2.txt', 'data for 4.txt', 'data for 1.txt', 'data for 5.txt', 'data for 3.txt' ]

среда, 29 августа 12 г.

Page 43: Node.js для начинающих

http://serenity.su

var fs = require('fs');

function content(callback) { var results = []; var files = [1, 2, 3, 4, 5];

for (var i=0; i<files.length; i++) { var file = files[i] + '.txt';

(function(file) { fs.readFile(file, 'utf-8', function(error, data) { results.push('data for ' + file + ' file');

if (results.length == files.length) callback(results); }); })(file); }}

content(function(results) { console.log(results);});

БЛОКИРОВКИ

$ node example.js [ 'data for 2.txt', 'data for 4.txt', 'data for 1.txt', 'data for 5.txt', 'data for 3.txt' ]

good way

среда, 29 августа 12 г.

Page 44: Node.js для начинающих

http://serenity.su

var fs = require('fs');var results = ['start'];

fs.readFile('alpha.txt', 'utf-8', function(error, data) { results.push('data for alpha.txt');

fs.readFile('beta.txt', 'utf-8', function(error, data) { results.push('data for beta.txt');

fs.readFile('gamma.txt', 'utf-8', function(error, data) { results.push('data for gamma.txt');

console.log(results); }); });});

СПАГЕТТИ-КОД

среда, 29 августа 12 г.

Page 45: Node.js для начинающих

http://serenity.su

var fs = require('fs');var results = ['start'];

fs.readFile('alpha.txt', 'utf-8', function(error, data) { results.push('data for alpha.txt');

fs.readFile('beta.txt', 'utf-8', function(error, data) { results.push('data for beta.txt');

fs.readFile('gamma.txt', 'utf-8', function(error, data) { results.push('data for gamma.txt');

console.log(results); }); });});

СПАГЕТТИ-КОД

$ node example.js [ 'start', 'data for alpha.txt', 'data for beta.txt', 'data for gamma.txt' ]

среда, 29 августа 12 г.

Page 46: Node.js для начинающих

http://serenity.su

var fs = require('fs');var results = ['start'];

fs.readFile('alpha.txt', 'utf-8', function(error, data) { results.push('data for alpha.txt');

fs.readFile('beta.txt', 'utf-8', function(error, data) { results.push('data for beta.txt');

fs.readFile('gamma.txt', 'utf-8', function(error, data) { results.push('data for gamma.txt');

console.log(results); }); });});

СПАГЕТТИ-КОД

$ node example.js [ 'start', 'data for alpha.txt', 'data for beta.txt', 'data for gamma.txt' ]

bad way

среда, 29 августа 12 г.

Page 47: Node.js для начинающих

http://serenity.su

var fs = require('fs');

function alpha(results, callback) { fs.readFile('alpha.txt', 'utf-8', function(error, data) { results.push('data for alpha.txt'); beta(results, callback); });}

function beta(results, callback) { fs.readFile('beta.txt', 'utf-8', function(error, data) { results.push('data for beta.txt'); gamma(results, callback); });}

function gamma(results, callback) { fs.readFile('gamma.txt', 'utf-8', function(error, data) { results.push('data for gamma.txt'); callback(results); });}

alpha(['start'], function(results) { console.log(results);});

СПАГЕТТИ-КОД

среда, 29 августа 12 г.

Page 48: Node.js для начинающих

http://serenity.su

var fs = require('fs');

function alpha(results, callback) { fs.readFile('alpha.txt', 'utf-8', function(error, data) { results.push('data for alpha.txt'); beta(results, callback); });}

function beta(results, callback) { fs.readFile('beta.txt', 'utf-8', function(error, data) { results.push('data for beta.txt'); gamma(results, callback); });}

function gamma(results, callback) { fs.readFile('gamma.txt', 'utf-8', function(error, data) { results.push('data for gamma.txt'); callback(results); });}

alpha(['start'], function(results) { console.log(results);});

СПАГЕТТИ-КОД

$ node example.js [ 'start', 'data for alpha.txt', 'data for beta.txt', 'data for gamma.txt' ]

среда, 29 августа 12 г.

Page 49: Node.js для начинающих

http://serenity.su

var fs = require('fs');

function alpha(results, callback) { fs.readFile('alpha.txt', 'utf-8', function(error, data) { results.push('data for alpha.txt'); beta(results, callback); });}

function beta(results, callback) { fs.readFile('beta.txt', 'utf-8', function(error, data) { results.push('data for beta.txt'); gamma(results, callback); });}

function gamma(results, callback) { fs.readFile('gamma.txt', 'utf-8', function(error, data) { results.push('data for gamma.txt'); callback(results); });}

alpha(['start'], function(results) { console.log(results);});

СПАГЕТТИ-КОД

$ node example.js [ 'start', 'data for alpha.txt', 'data for beta.txt', 'data for gamma.txt' ]

good way

среда, 29 августа 12 г.

Page 50: Node.js для начинающих

http://serenity.su

ОРГАНИЗУЕМ TWITTER КОНФЕРЕНЦИЮ?

подробнее: http://j.mp/twitter-conf

среда, 29 августа 12 г.

Page 51: Node.js для начинающих

http://serenity.su

ЗАДАЧИ

•Получать сообщения из twitter как только они написаны

•Отображать сообщения из twitter в браузере моментально

•Работать без перезагрузки

•Держать большие нагрузки

подробнее: http://j.mp/twitter-conf

среда, 29 августа 12 г.

Page 52: Node.js для начинающих

http://serenity.su

ЧТО ИСПОЛЬЗОВАТЬ?

WebSockets (HTML5)с помощью socket.io

Twitter Streaming APIс помощью http streaming

подробнее: http://j.mp/twitter-conf

среда, 29 августа 12 г.

Page 53: Node.js для начинающих

http://serenity.su

СХЕМА РАБОТЫ

Node.JS Twitter

WebSockets Streaming API

подробнее: http://j.mp/twitter-conf

среда, 29 августа 12 г.

Page 54: Node.js для начинающих

http://serenity.su

ПОЛУЧАЕМ СООБЩЕНИЯ ИЗ TWITTERvar https = require('https');var message = '';var options = { host: 'stream.twitter.com', path: '/1/statuses/filter.json?track=iphone'};

https.get(options, function(response) { response.setEncoding('utf8'); response.on('data', function(chunk) { message += chunk; newline = message.indexOf("\r");

if (newline !== -1) { tweet = message.slice(0, newline); } message = message.slice(newline + 1); });});

среда, 29 августа 12 г.

Page 55: Node.js для начинающих

http://serenity.su

ОТПРАВЛЯЕМ СООБЩЕНИЯ ЧЕРЕЗ WEBSOCKETS

...

https.get(options, function(response) { ...

tweet = message.slice(0, newline);

clients.forEach(function(client) { client.send(tweet); });

...});

...

var clients = [];

var io = require('socket.io').listen(8080);

io.sockets.on('connection', function(socket) { clients.push(socket);});

...

среда, 29 августа 12 г.

Page 56: Node.js для начинающих

http://serenity.su

ДЕМО

подробнее: http://j.mp/twitter-conf

среда, 29 августа 12 г.

Page 57: Node.js для начинающих

http://serenity.suhttp://serenity.su

Спасибо!Алексей Симоненкодиректор по технологиям

http://simonenko.su

[email protected]

среда, 29 августа 12 г.

Page 58: Node.js для начинающих

КОНТАКТЫна http://serenity.su

СЛЕДИТЕ ЗА НАМИ

vk.com/serenity_su twitter.com/serenity_su facebook.com/serenity.su

среда, 29 августа 12 г.