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

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

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

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 г.