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

2,240 views

Published on

Published in: Technology
1 Comment
3 Likes
Statistics
Notes
No Downloads
Views
Total views
2,240
On SlideShare
0
From Embeds
0
Number of Embeds
349
Actions
Shares
0
Downloads
17
Comments
1
Likes
3
Embeds 0
No embeds

No notes for slide

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

  1. 1. http://serenity.suсреда, 29 августа 12 г.
  2. 2. http://serenity.su Немного о себе: • Работаю в интернете более 12 лет • Сейчас директор по технологиям в Serenity • Активно эксперементирую с HTML5/JavaScript • simonenko.su • github.com/merittсреда, 29 августа 12 г.
  3. 3. http://serenity.su NODE.JS ЭТО ПЛАТФОРМА ДЛЯ СОЗДАНИЯ ЛЕГКО МАСШТАБИРУЕМЫХ СЕТЕВЫХ ПРИЛОЖЕНИЙ 3среда, 29 августа 12 г.
  4. 4. http://serenity.su НАЧАТЬ ЛЕГКО • Работает везде: Windows, OS X, Linux • Устанавливается как обычное приложение • Для начала работы не нужен сервер • Для работы подойдет любой текстовый редактор • Достаточно знать 1 язык для сервера и клиента http://nodejs.org/#downloadсреда, 29 августа 12 г.
  5. 5. http://serenity.su ЧТО ТАКОЕ NODE.JS? • Построен на JavaScript движке браузера Google Chrome V8 5среда, 29 августа 12 г.
  6. 6. http://serenity.su ЧТО ТАКОЕ NODE.JS? • Построен на JavaScript движке браузера Google Chrome V8 • Event-driven, non-blocking I/O, streams 5среда, 29 августа 12 г.
  7. 7. http://serenity.su ЧТО ТАКОЕ NODE.JS? • Построен на JavaScript движке браузера Google Chrome V8 • Event-driven, non-blocking I/O, streams • Реализация самых важных протоколов (HTTP, DNS, TLS/SSL) 5среда, 29 августа 12 г.
  8. 8. 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 г.
  9. 9. 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 г.
  10. 10. http://serenity.su РЕЗУЛЬТАТ $ node server.js Server running at http://127.0.0.1:3000 7среда, 29 августа 12 г.
  11. 11. http://serenity.su СРАВНИМ NODE.JS И PHP • Для сравнения возьмем сайты digitalconf.ru и htmlacademy.ru • Оба сайта расположены на одинаковом выделенном хостинге • $ ab -c 10 -n 1000 http://digitalconf.ru/ • Для node.js используем: nginx, nodejs, express • Для php используем: apache, php, zend framework 8среда, 29 августа 12 г.
  12. 12. http://serenity.su РЕЗУЛЬТАТЫ ab -c 10 -n 1000 digitalconf.ru 203 htmlacademy.ru 25 0 55 110 165 220 Requests per second 9среда, 29 августа 12 г.
  13. 13. http://serenity.su ПОЧЕМУ ТАК БЫСТРО!?среда, 29 августа 12 г.
  14. 14. http://serenity.su ОДНОПОТОЧНЫЙ СИНХРОННЫЙ I/Oсреда, 29 августа 12 г.
  15. 15. http://serenity.su МУЛЬТИПОТОЧНЫЙ СИНХРОННЫЙ I/Oсреда, 29 августа 12 г.
  16. 16. http://serenity.su МУЛЬТИПОТОЧНЫЙ СИНХРОННЫЙ I/Oсреда, 29 августа 12 г.
  17. 17. http://serenity.su Всегда можно купить еще несколько серверов, но это стоит денег.среда, 29 августа 12 г.
  18. 18. http://serenity.su ОДНОПОТОЧНЫЙ АСИНХРОННЫЙ I/Oсреда, 29 августа 12 г.
  19. 19. http://serenity.su ПРОБЛЕМА NODE.JS В CPU ВЫЧИСЛЕНИЯХсреда, 29 августа 12 г.
  20. 20. http://serenity.su COMMONJS И СИСТЕМА МОДУЛЕЙсреда, 29 августа 12 г.
  21. 21. 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);среда, 29 августа 12 г.
  22. 22. http://serenity.su РЕЗУЛЬТАТ $ node server.js Server running at http://127.0.0.1:3000 19среда, 29 августа 12 г.
  23. 23. http://serenity.su NPM NODE PACKAGE MANAGERсреда, 29 августа 12 г.
  24. 24. 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 г.
  25. 25. http://serenity.su КАК УСТАНОВИТЬ? $ npm install express express@2.5.9 ./node_modules/express !"" qs@0.4.2 !"" mime@1.2.4 !"" mkdirp@0.3.0 #"" connect@1.8.7 (formidable@1.0.9)среда, 29 августа 12 г.
  26. 26. 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 г.
  27. 27. http://serenity.su РЕЗУЛЬТАТ $ node server.js Server running at http://127.0.0.1:3000 24среда, 29 августа 12 г.
  28. 28. http://serenity.su ПОПРОБУЕМ УСЛОЖНИТЬсреда, 29 августа 12 г.
  29. 29. 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 г.
  30. 30. http://serenity.su РЕЗУЛЬТАТ $ node server.js Server running at http://127.0.0.1:3000 27среда, 29 августа 12 г.
  31. 31. http://serenity.su ТИПИЧНЫЕ ПРОБЛЕМЫсреда, 29 августа 12 г.
  32. 32. 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 г.
  33. 33. http://serenity.su СОХРАНЕНИЕ ОКРУЖЕНИЯ var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17}; for (animal in animals) { setTimeout(function() { $ node example.js console.log(animal + : + animals[animal]); }, 100); turtles: 17 } turtles: 17 turtles: 17 turtles: 17среда, 29 августа 12 г.
  34. 34. http://serenity.su СОХРАНЕНИЕ ОКРУЖЕНИЯ var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17}; bad way for (animal in animals) { setTimeout(function() { $ node example.js console.log(animal + : + animals[animal]); }, 100); turtles: 17 } turtles: 17 turtles: 17 turtles: 17среда, 29 августа 12 г.
  35. 35. 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 г.
  36. 36. http://serenity.su СОХРАНЕНИЕ ОКРУЖЕНИЯ var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17}; for (animal in animals) { (function(animal) { setTimeout(function() { $ node example.js cats: 10 console.log(animal + : + animals[animal]); }, 100); dogs: 1 })(animal); frogs: 6 } turtles: 17среда, 29 августа 12 г.
  37. 37. http://serenity.su СОХРАНЕНИЕ ОКРУЖЕНИЯ var animals = {cats: 10, dogs: 1, frogs: 6, turtles: 17}; good way for (animal in animals) { (function(animal) { setTimeout(function() { $ node example.js cats: 10 console.log(animal + : + animals[animal]); }, 100); dogs: 1 })(animal); frogs: 6 } turtles: 17среда, 29 августа 12 г.
  38. 38. 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 г.
  39. 39. 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); $ node example.js }); } [] return results; } var results = content(); console.log(results);среда, 29 августа 12 г.
  40. 40. http://serenity.su БЛОКИРОВКИ var fs = require(fs); function content() { var results = []; var files = [1, 2, 3, 4, 5]; bad way 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); $ node example.js }); } [] return results; } var results = content(); console.log(results);среда, 29 августа 12 г.
  41. 41. 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 г.
  42. 42. 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) { $ node example.js fs.readFile(file, utf-8, function(error, data) { [ data for 2.txt, results.push(data for + file + file); data for 4.txt, if (results.length == files.length) callback(results); }); data for 1.txt, })(file); data for 5.txt, } } data for 3.txt ] content(function(results) { console.log(results); });среда, 29 августа 12 г.
  43. 43. 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++) { good way var file = files[i] + .txt; (function(file) { $ node example.js fs.readFile(file, utf-8, function(error, data) { [ data for 2.txt, results.push(data for + file + file); data for 4.txt, if (results.length == files.length) callback(results); }); data for 1.txt, })(file); data for 5.txt, } } data for 3.txt ] content(function(results) { console.log(results); });среда, 29 августа 12 г.
  44. 44. 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 г.
  45. 45. 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); $ node example.js fs.readFile(beta.txt, utf-8, function(error, data) { results.push(data for beta.txt); [ start, data for alpha.txt, fs.readFile(gamma.txt, utf-8, function(error, data) { results.push(data for gamma.txt); data for beta.txt, data for gamma.txt ] console.log(results); }); }); });среда, 29 августа 12 г.
  46. 46. http://serenity.su СПАГЕТТИ-КОД var fs = require(fs); var results = [start]; fs.readFile(alpha.txt, utf-8, function(error, data) { bad way results.push(data for alpha.txt); $ node example.js fs.readFile(beta.txt, utf-8, function(error, data) { results.push(data for beta.txt); [ start, data for alpha.txt, fs.readFile(gamma.txt, utf-8, function(error, data) { results.push(data for gamma.txt); data for beta.txt, data for gamma.txt ] console.log(results); }); }); });среда, 29 августа 12 г.
  47. 47. 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 г.
  48. 48. 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) { $ node example.js results.push(data for beta.txt); gamma(results, callback); [ start, } }); data for alpha.txt, function gamma(results, callback) { data for beta.txt, fs.readFile(gamma.txt, utf-8, function(error, data) { results.push(data for gamma.txt); data for gamma.txt ] callback(results); }); } alpha([start], function(results) { console.log(results); });среда, 29 августа 12 г.
  49. 49. 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); }); } good way function beta(results, callback) { fs.readFile(beta.txt, utf-8, function(error, data) { results.push(data for beta.txt); gamma(results, callback); }); $ node example.js [ start, data for alpha.txt, } function gamma(results, callback) { data for beta.txt, fs.readFile(gamma.txt, utf-8, function(error, data) { results.push(data for gamma.txt); data for gamma.txt ] callback(results); }); } alpha([start], function(results) { console.log(results); });среда, 29 августа 12 г.
  50. 50. http://serenity.su ОРГАНИЗУЕМ TWITTER КОНФЕРЕНЦИЮ? подробнее: http://j.mp/twitter-confсреда, 29 августа 12 г.
  51. 51. http://serenity.su ЗАДАЧИ • Получать сообщения из twitter как только они написаны • Отображать сообщения из twitter в браузере моментально • Работать без перезагрузки • Держать большие нагрузки подробнее: http://j.mp/twitter-confсреда, 29 августа 12 г.
  52. 52. http://serenity.su ЧТО ИСПОЛЬЗОВАТЬ? WebSockets (HTML5) Twitter Streaming API с помощью socket.io с помощью http streaming подробнее: http://j.mp/twitter-confсреда, 29 августа 12 г.
  53. 53. http://serenity.su СХЕМА РАБОТЫ Node.JS Twitter WebSockets Streaming API подробнее: http://j.mp/twitter-confсреда, 29 августа 12 г.
  54. 54. 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); }); });среда, 29 августа 12 г.
  55. 55. http://serenity.su ОТПРАВЛЯЕМ СООБЩЕНИЯ ЧЕРЕЗ WEBSOCKETS ... ... https.get(options, function(response) { var clients = []; ... var io = require(socket.io).listen(8080); tweet = message.slice(0, newline); io.sockets.on(connection, function(socket) { clients.forEach(function(client) { clients.push(socket); client.send(tweet); }); }); ... ... });среда, 29 августа 12 г.
  56. 56. http://serenity.su ДЕМО подробнее: http://j.mp/twitter-confсреда, 29 августа 12 г.
  57. 57. http://serenity.su Спасибо! Алексей Симоненко директор по технологиям http://simonenko.su alexey@simonenko.suсреда, 29 августа 12 г.
  58. 58. КОНТАКТЫ на http://serenity.su СЛЕДИТЕ ЗА НАМИ vk.com/serenity_su twitter.com/serenity_su facebook.com/serenity.suсреда, 29 августа 12 г.

×