Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

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

Avatar for Alexey Simonenko

Alexey Simonenko

April 25, 2012
Tweet

More Decks by Alexey Simonenko

Other Decks in Programming

Transcript

  1. http://serenity.su Немного о себе: • Работаю в интернете более 12

    лет • Сейчас директор по технологиям в Serenity • Активно эксперементирую с HTML5/JavaScript • simonenko.su • github.com/meritt http://serenity.su суббота, 25 августа 12 г.
  2. http://serenity.su •Работает везде: Windows, OS X, Linux •Устанавливается как обычное

    приложение •Для начала работы не нужен сервер •Для работы подойдет любой текстовый редактор •Достаточно знать 1 язык для сервера и клиента НАЧАТЬ ЛЕГКО http://nodejs.org/#download суббота, 25 августа 12 г.
  3. http://serenity.su ЧТО ТАКОЕ NODE.JS? •Построен на JavaScript движке браузера Google

    Chrome V8 •Event-driven, non-blocking I/O, streams 5 суббота, 25 августа 12 г.
  4. http://serenity.su ЧТО ТАКОЕ NODE.JS? •Построен на JavaScript движке браузера Google

    Chrome V8 •Event-driven, non-blocking I/O, streams •Реализация самых важных протоколов (HTTP, DNS, TLS/SSL) 5 суббота, 25 августа 12 г.
  5. 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 суббота, 25 августа 12 г.
  6. 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'); суббота, 25 августа 12 г.
  7. 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 суббота, 25 августа 12 г.
  8. http://serenity.su РЕЗУЛЬТАТЫ digitalconf.ru htmlacademy.ru 0 55 110 165 220 25

    203 ab -c 10 -n 1000 Requests per second 9 суббота, 25 августа 12 г.
  9. http://serenity.su // hello.js exports.world = function(text) { return 'Hello '

    + text + '!'; }; // server.js var 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'); ПРИМЕР РАБОТЫ МОДУЛЕЙ суббота, 25 августа 12 г.
  10. 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 суббота, 25 августа 12 г.
  11. 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'); суббота, 25 августа 12 г.
  12. 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'); суббота, 25 августа 12 г.
  13. 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); } суббота, 25 августа 12 г.
  14. 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: 17 turtles: 17 turtles: 17 turtles: 17 суббота, 25 августа 12 г.
  15. 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: 17 turtles: 17 turtles: 17 turtles: 17 bad way суббота, 25 августа 12 г.
  16. 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); } СОХРАНЕНИЕ ОКРУЖЕНИЯ суббота, 25 августа 12 г.
  17. 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: 10 dogs: 1 frogs: 6 turtles: 17 суббота, 25 августа 12 г.
  18. 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: 10 dogs: 1 frogs: 6 turtles: 17 good way суббота, 25 августа 12 г.
  19. 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); БЛОКИРОВКИ суббота, 25 августа 12 г.
  20. 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 [] суббота, 25 августа 12 г.
  21. 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 суббота, 25 августа 12 г.
  22. 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); }); БЛОКИРОВКИ суббота, 25 августа 12 г.
  23. 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' ] суббота, 25 августа 12 г.
  24. 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 суббота, 25 августа 12 г.
  25. 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); }); }); }); СПАГЕТТИ-КОД суббота, 25 августа 12 г.
  26. 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' ] суббота, 25 августа 12 г.
  27. 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 суббота, 25 августа 12 г.
  28. 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); }); СПАГЕТТИ-КОД суббота, 25 августа 12 г.
  29. 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' ] суббота, 25 августа 12 г.
  30. 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 суббота, 25 августа 12 г.
  31. http://serenity.su ЗАДАЧИ •Получать сообщения из twitter как только они написаны

    •Отображать сообщения из twitter в браузере моментально •Работать без перезагрузки •Держать большие нагрузки подробнее: http://j.mp/twitter-conf суббота, 25 августа 12 г.
  32. http://serenity.su ЧТО ИСПОЛЬЗОВАТЬ? WebSockets (HTML5) с помощью socket.io Twitter Streaming

    API с помощью http streaming подробнее: http://j.mp/twitter-conf суббота, 25 августа 12 г.
  33. http://serenity.su ПОЛУЧАЕМ СООБЩЕНИЯ ИЗ TWITTER var 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); }); }); суббота, 25 августа 12 г.
  34. 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); }); ... суббота, 25 августа 12 г.