SlideShare a Scribd company logo
1 of 58
Download to read offline
http://serenity.su




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




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




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




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



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



                                              НАЧАТЬ ЛЕГКО

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

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

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

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

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


                                                     http://nodejs.org/#download

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



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

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




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



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

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

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




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



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

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

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

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




                                                      5
среда, 29 августа 12 г.
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 г.
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 г.
http://serenity.su



                                   РЕЗУЛЬТАТ




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



                                             7
среда, 29 августа 12 г.
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 г.
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 г.
http://serenity.su




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




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




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




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




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




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




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




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




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




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




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




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




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



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




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




среда, 29 августа 12 г.
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 г.
http://serenity.su



                                   РЕЗУЛЬТАТ




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



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




                                 NPM
                          NODE PACKAGE MANAGER




среда, 29 августа 12 г.
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 г.
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 г.
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 г.
http://serenity.su



                                   РЕЗУЛЬТАТ




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



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




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




среда, 29 августа 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');



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



                                   РЕЗУЛЬТАТ




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



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




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




среда, 29 августа 12 г.
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 г.
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 г.
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 г.
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 г.
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 г.
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 г.
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 г.
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 г.
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 г.
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 г.
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 г.
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 г.
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 г.
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 г.
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 г.
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 г.
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 г.
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 г.
http://serenity.su




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



                              подробнее: http://j.mp/twitter-conf
среда, 29 августа 12 г.
http://serenity.su



                                                 ЗАДАЧИ


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

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

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

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


                                             подробнее: http://j.mp/twitter-conf
среда, 29 августа 12 г.
http://serenity.su



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



                          WebSockets (HTML5)                                Twitter Streaming API
                          с помощью socket.io                            с помощью http streaming




                                           подробнее: http://j.mp/twitter-conf
среда, 29 августа 12 г.
http://serenity.su



                                   СХЕМА РАБОТЫ


                                           Node.JS                                   Twitter




                          WebSockets                                 Streaming API
                                       подробнее: http://j.mp/twitter-conf
среда, 29 августа 12 г.
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 г.
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 г.
http://serenity.su




                                 ДЕМО



                          подробнее: http://j.mp/twitter-conf
среда, 29 августа 12 г.
http://serenity.su




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



                          http://simonenko.su
                          alexey@simonenko.su




среда, 29 августа 12 г.
КОНТАКТЫ
                                         на http://serenity.su


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

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



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

More Related Content

More from Alexey Simonenko

Ликбез по веб-технологиям
Ликбез по веб-технологиямЛикбез по веб-технологиям
Ликбез по веб-технологиямAlexey Simonenko
 
10 игровых механик в HTML Academy
10 игровых механик в HTML Academy10 игровых механик в HTML Academy
10 игровых механик в HTML AcademyAlexey Simonenko
 
Веб-дизайнер не художник
Веб-дизайнер не художникВеб-дизайнер не художник
Веб-дизайнер не художникAlexey Simonenko
 
«TIME» — автоматизация агентства
«TIME» — автоматизация агентства«TIME» — автоматизация агентства
«TIME» — автоматизация агентстваAlexey Simonenko
 
ECMAScript 6 — будущее JavaScript
ECMAScript 6 — будущее JavaScriptECMAScript 6 — будущее JavaScript
ECMAScript 6 — будущее JavaScriptAlexey Simonenko
 
Адаптивный веб-дизайн
Адаптивный веб-дизайнАдаптивный веб-дизайн
Адаптивный веб-дизайнAlexey Simonenko
 
PR с помощью большого мероприятия
PR с помощью большого мероприятияPR с помощью большого мероприятия
PR с помощью большого мероприятияAlexey Simonenko
 
Facebook для бизнеса
Facebook для бизнесаFacebook для бизнеса
Facebook для бизнесаAlexey Simonenko
 

More from Alexey Simonenko (8)

Ликбез по веб-технологиям
Ликбез по веб-технологиямЛикбез по веб-технологиям
Ликбез по веб-технологиям
 
10 игровых механик в HTML Academy
10 игровых механик в HTML Academy10 игровых механик в HTML Academy
10 игровых механик в HTML Academy
 
Веб-дизайнер не художник
Веб-дизайнер не художникВеб-дизайнер не художник
Веб-дизайнер не художник
 
«TIME» — автоматизация агентства
«TIME» — автоматизация агентства«TIME» — автоматизация агентства
«TIME» — автоматизация агентства
 
ECMAScript 6 — будущее JavaScript
ECMAScript 6 — будущее JavaScriptECMAScript 6 — будущее JavaScript
ECMAScript 6 — будущее JavaScript
 
Адаптивный веб-дизайн
Адаптивный веб-дизайнАдаптивный веб-дизайн
Адаптивный веб-дизайн
 
PR с помощью большого мероприятия
PR с помощью большого мероприятияPR с помощью большого мероприятия
PR с помощью большого мероприятия
 
Facebook для бизнеса
Facebook для бизнесаFacebook для бизнеса
Facebook для бизнеса
 

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

  • 2. http://serenity.su Немного о себе: • Работаю в интернете более 12 лет • Сейчас директор по технологиям в Serenity • Активно эксперементирую с HTML5/JavaScript • simonenko.su • github.com/meritt среда, 29 августа 12 г.
  • 3. http://serenity.su NODE.JS ЭТО ПЛАТФОРМА ДЛЯ СОЗДАНИЯ ЛЕГКО МАСШТАБИРУЕМЫХ СЕТЕВЫХ ПРИЛОЖЕНИЙ 3 среда, 29 августа 12 г.
  • 4. http://serenity.su НАЧАТЬ ЛЕГКО • Работает везде: Windows, OS X, Linux • Устанавливается как обычное приложение • Для начала работы не нужен сервер • Для работы подойдет любой текстовый редактор • Достаточно знать 1 язык для сервера и клиента http://nodejs.org/#download среда, 29 августа 12 г.
  • 5. http://serenity.su ЧТО ТАКОЕ NODE.JS? • Построен на JavaScript движке браузера Google Chrome V8 5 среда, 29 августа 12 г.
  • 6. http://serenity.su ЧТО ТАКОЕ NODE.JS? • Построен на JavaScript движке браузера Google Chrome V8 • Event-driven, non-blocking I/O, streams 5 среда, 29 августа 12 г.
  • 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. 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. 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. http://serenity.su РЕЗУЛЬТАТ $ node server.js Server running at http://127.0.0.1:3000 7 среда, 29 августа 12 г.
  • 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. 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. http://serenity.su ПОЧЕМУ ТАК БЫСТРО!? среда, 29 августа 12 г.
  • 14. http://serenity.su ОДНОПОТОЧНЫЙ СИНХРОННЫЙ I/O среда, 29 августа 12 г.
  • 15. http://serenity.su МУЛЬТИПОТОЧНЫЙ СИНХРОННЫЙ I/O среда, 29 августа 12 г.
  • 16. http://serenity.su МУЛЬТИПОТОЧНЫЙ СИНХРОННЫЙ I/O среда, 29 августа 12 г.
  • 17. http://serenity.su Всегда можно купить еще несколько серверов, но это стоит денег. среда, 29 августа 12 г.
  • 18. http://serenity.su ОДНОПОТОЧНЫЙ АСИНХРОННЫЙ I/O среда, 29 августа 12 г.
  • 19. http://serenity.su ПРОБЛЕМА NODE.JS В CPU ВЫЧИСЛЕНИЯХ среда, 29 августа 12 г.
  • 20. http://serenity.su COMMONJS И СИСТЕМА МОДУЛЕЙ среда, 29 августа 12 г.
  • 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. http://serenity.su РЕЗУЛЬТАТ $ node server.js Server running at http://127.0.0.1:3000 19 среда, 29 августа 12 г.
  • 23. http://serenity.su NPM NODE PACKAGE MANAGER среда, 29 августа 12 г.
  • 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. 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. 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. http://serenity.su РЕЗУЛЬТАТ $ node server.js Server running at http://127.0.0.1:3000 24 среда, 29 августа 12 г.
  • 28. http://serenity.su ПОПРОБУЕМ УСЛОЖНИТЬ среда, 29 августа 12 г.
  • 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. http://serenity.su РЕЗУЛЬТАТ $ node server.js Server running at http://127.0.0.1:3000 27 среда, 29 августа 12 г.
  • 31. http://serenity.su ТИПИЧНЫЕ ПРОБЛЕМЫ среда, 29 августа 12 г.
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. http://serenity.su ОРГАНИЗУЕМ TWITTER КОНФЕРЕНЦИЮ? подробнее: http://j.mp/twitter-conf среда, 29 августа 12 г.
  • 51. http://serenity.su ЗАДАЧИ • Получать сообщения из twitter как только они написаны • Отображать сообщения из twitter в браузере моментально • Работать без перезагрузки • Держать большие нагрузки подробнее: http://j.mp/twitter-conf среда, 29 августа 12 г.
  • 52. http://serenity.su ЧТО ИСПОЛЬЗОВАТЬ? WebSockets (HTML5) Twitter Streaming API с помощью socket.io с помощью http streaming подробнее: http://j.mp/twitter-conf среда, 29 августа 12 г.
  • 53. http://serenity.su СХЕМА РАБОТЫ Node.JS Twitter WebSockets Streaming API подробнее: http://j.mp/twitter-conf среда, 29 августа 12 г.
  • 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. 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. http://serenity.su ДЕМО подробнее: http://j.mp/twitter-conf среда, 29 августа 12 г.
  • 57. http://serenity.su Спасибо! Алексей Симоненко директор по технологиям http://simonenko.su alexey@simonenko.su среда, 29 августа 12 г.
  • 58. КОНТАКТЫ на http://serenity.su СЛЕДИТЕ ЗА НАМИ vk.com/serenity_su twitter.com/serenity_su facebook.com/serenity.su среда, 29 августа 12 г.