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

КРиПИ - Node.js – серверный JavaScript

КРиПИ - Node.js – серверный JavaScript

Mikhail Davydov

November 20, 2012
Tweet

More Decks by Mikhail Davydov

Other Decks in Education

Transcript

  1. View Slide

  2. Михаил Давыдов
    Разработчик JavaScript
    Node.js –
    серверный
    JavaScript

    View Slide

  3. 3

    View Slide

  4. 4
    История Node.js
    •  Разработка с 2009 – Ryan Dahl
    •  Поддержка Joyent
    •  Событийный асинхронный I/O
    •  V8 JavaScript от Google
    •  libUV - ядро Node
    –  событийный ввод-вывод
    •  Кроссплатформенный (native)

    View Slide

  5. 5
    Где и почему?
    •  Node.js = JavaScript + Асинхронность
    •  Приложения реального времени
    –  Чаты
    –  Серверы игр
    –  Серверы Push-уведомлений
    •  Нагруженные прокси
    •  Сервисы с большим числом клиентов
    •  Везде, где время I/O больше вычислений

    View Slide

  6. 6
    Node.js
    Node  
    V8  
    JS  
    Среда

    Виртуалка

    любой  
    Интерфейс

    View Slide

  7. 7
    Установка
    •  http://nodejs.org/download/
    •  Просто выполняем установочный файл

    View Slide

  8. 8
    В консоли
    > node -v
    v0.8.8
    # npm – Node Package Manager
    > npm -v
    1.1.59
    > node -e 'console.log("123")'
    123
    Запуск

    View Slide

  9. 9
    main.js
    console.log('Hello World!');
    Запуск файла с node.js
    > node main.js
    Hello World!

    View Slide

  10. Модули в Node.js
    CommonJS Module
    Глобальные переменные модуля

    View Slide

  11. Любой файл – модуль

    View Slide

  12. Глобальные переменные модуля
    •  module = {exports:{}, ...};!
    –  Объект описывающий данный модуль
    •  exports = {};!
    –  Объект экспорта данного модуля
    •  require(moduleName): *!
    •  __filename!
    •  __dirname!
    http://nodejs.org/api/modules.html
    http://nodejs.org/api/globals.html

    View Slide

  13. 13
    require()
    •  Формат: .js .json .node
    –  Может быть любой формат (нужно прописать правило)
    –  Нативные модули на C++
    •  Имена модулей в require()
    –  Поведение по умолчанию:
    –  'имя_модуля' -> npm или базовый node.js
    –  './путь/до/модуля.js' -> локальный
    –  './путь/до' -> './путь/до/index.js'
    https://github.com/joyent/node/blob/master/lib/
    module.js

    View Slide

  14. 14
    module.js
    var npmModule = require('npmModule'),
    fs = require('fs'),
    someMyModule = require('../dep.js');
    var myFunction = function (a, b) {
    return Math.PI * a + b;
    };
    console.log(__filename);
    exports.myFunction = myFunction;
    // Или
    // module.exports = myFunction;
    CommonJS Modules/1.0

    View Slide

  15. 15
    main.js
    var module = require('./module.js');
    typeof module; // object
    typeof module.myFunction; // function
    var result = module.myFunction(1, 2);
    console.log(result);
    require('./module.js');
    CommonJS Modules/1.0

    View Slide

  16. 16
    Запуск файла с node.js
    > node main.js
    /path/to/myOtherModule.js
    5.14159

    View Slide

  17. 17
    Node.js кэширует модули и
    выполняет их код
    только 1 раз

    View Slide

  18. 18
    Другие глобальные переменные
    •  console
    –  вывод данных в STDOUT
    –  log
    –  dir
    •  process
    –  информация о текущем процессе
    –  время работы
    –  затраты памяти
    –  Информация о текущей ОС
    –  текущая рабочая папка CWD
    –  PID
    •  setTimeout, setInterval
    http://nodejs.org/api/process.html

    View Slide

  19. NPM
    Управление зависимостями
    Декларация зависимостей

    View Slide

  20. Задачи npm
    •  Устанавливает модули из репозитория
    •  Устраняет зависимости
    •  Удаляет не нужные модули
    •  Отправляет ваши модули в репозиторий
    •  …
    https://npmjs.org/

    View Slide

  21. 21
    Зависимости main.js
    •  main.js
    –  module.js – наш модуль
    •  module.js
    –  npmModule – не наш модуль
    –  fs – модуль node.js
    –  ../dep.js – наш модуль

    View Slide

  22. 22
    npmModule может быть не
    установлен – его нужно
    задекларировать

    View Slide

  23. 23
    {
    "dependencies": {
    "npmModule": "*",
    "npmModule": ">=1.0.2",
    "npmModule": "http://asdf.com/asdf.tar.gz"
    },
    "name": "your-app",
    "version": "1.0.0",
    "description": "Hello World!",
    "author": {
    "name": "Barney Rubble",
    "email": "[email protected]"
    }
    }
    package.json
    https://npmjs.org/doc/json.html

    View Slide

  24. 24
    npm install
    > wget http://site.ru/your-app.zip
    > unzip your-app.zip
    > cd your-app
    > npm install
    your-app
    +-npmModule
    > node mian.js

    View Slide

  25. 25

    View Slide

  26. Базовые модули Node
    fs
    http
    http://nodejs.org/api/

    View Slide

  27. 27
    fs
    •  Всевозможные функции работы с fs
    •  fs.readFile
    •  fs.writeFile
    •  fs.realpath
    •  …
    http://nodejs.org/api/fs.html

    View Slide

  28. 28
    Каждая функция fs имеет 2
    типа: синхронный и
    асинхронный

    View Slide

  29. 29
    main.js
    var fs = require('fs');
    fs.readFile('./package.json', 'utf8', file);
    function file(err, json) {
    if (err) throw err;
    console.log(json);
    }
    var json = fs.readFileSync('./package.json',
    'utf8');
    fs
    http://nodejs.org/api/fs.html

    View Slide

  30. 30
    Синхронный для CLI
    Асинхронный для сервера

    View Slide

  31. 31
    http/https
    •  Всевозможные функции работы с http
    •  HTTP(S) сервер
    •  Скачивание файлов по сети
    –  аналоги $.get, $.post
    http://nodejs.org/api/http.html

    View Slide

  32. 32
    main.js
    var http = require('http');
    http.get('http://site/', function (res) {
    console.log("response: " + res.statusCode);
    })
    .on('error', function (e) {
    console.log("Got error: " + e.message);
    });
    http – клиент
    http://nodejs.org/api/http.html

    View Slide

  33. 33
    var http = require('http');
    var server = http.createServer();
    server.on('request', function (req, res) {
    res.writeHead(200, {
    'Content-Type': 'text/plain'
    });
    res.end('okay');
    });
    server.listen(80, '127.0.0.1');
    http – сервер
    http://nodejs.org/api/http.html

    View Slide

  34. 34
    Все API низкоуровневое
    •  Объект req – Request
    –  Описывает текущий запрос
    –  Заголовки запроса
    –  Тело запроса
    –  Тип запроса GET POST
    –  URL запроса
    •  Объект res – Response
    –  Описывает ответ на запрос
    –  Заголовки ответа
    –  Тело ответа
    –  Статус ответа

    View Slide

  35. 35
    var url = require('url');
    // req.url == /?page=pagename&pewpew=ololo
    function onRequest(req, res) {
    var data = url.parse(req.url, true),
    page = data.query.page,
    userAgent = req.headers['user-agent'];
    res.setHeader("Set-Cookie", "p=" + page);
    res.setHeader("Content-Type","text/plain");
    res.writeHead(200);
    res.end(userAgent);
    }
    http – чуть сложнее сервер
    http://nodejs.org/api/http.html

    View Slide

  36. 36
    Как же много писать...

    View Slide

  37. Библиотеки Node.js
    express
    optimist
    colors

    https://github.com/joyent/node/wiki/modules
    https://npmjs.org/

    View Slide

  38. 38
    // В 5 строк
    require('express')()
    .get('/', function (req, res) {
    res.send('hello world');
    })
    .listen();
    express – http фреймворк
    http://expressjs.com/api.html
    http://expressjs.com/guide.html

    View Slide

  39. 39
    var express = require('express');
    var app = express();
    var staticDir = __dirname + '/public';
    app.get('/', function (req, res){
    res.send('hello world');
    });
    app.use(express.static(staticDir));
    app.use(express.logger());
    app.listen(3000);
    express – http фреймворк
    http://expressjs.com/api.html
    http://expressjs.com/guide.html

    View Slide

  40. 40
    var optimist = require('optimist')
    .default('port', 80)
    .default('host', '0.0.0.0');
    var cfg = optimist.argv;
    require('http').createServer();
    server.listen(cfg.port, cfg.host);
    optimist – CLI парсер
    https://github.com/substack/node-optimist
    > node main.js --port 81 --host pewpew.com
    > node main.js

    View Slide

  41. 41

    View Slide

  42. 42
    Можно и руками, но сильно
    дольше…

    View Slide

  43. 43
    console.log(process.argv);
    CLI парсер руками
    > node main.js --port 81 --host pewpew.com
    > node main.js
    [
    '/path/to/node',
    'main.js',
    '--port',
    '80',
    '--host',
    'pewpew.com'
    ]

    View Slide

  44. 44
    CLI парсер руками
    > node main.js --port 81 --host pewpew.com
    // argv парсер в 97 байт
    var argv = (function(a,b,c,d){c={};for
    (a=a.split(/\s*\B[\/-]+([\w-]+)[\s=]
    */),d=1;b=a[d++];c[b]=a[d++]||!0);return c})
    (process.argv.join(' '));
    console.log(argv);
    // {port: "81", host: "pewpew.com"}
    https://gist.github.com/1497865

    View Slide

  45. 45
    require('colors');
    console.log('hello'.green);
    console.log('i like cake'.underline.red)
    console.log('OMG Rainbows!'.rainbow);
    colors – подсветка консоли
    https://github.com/Marak/colors.js
    > node main.js
    hello
    I like cake
    OMG Rainbows!

    View Slide

  46. 46
    require('colors');
    console.log('hello'.green);
    console.log('i like cake'.underline.red)
    console.log('OMG Rainbows!'.rainbow);
    colors – подсветка консоли
    https://github.com/Marak/colors.js
    > node main.js
    hello
    I like cake
    OMG Rainbows!

    View Slide

  47. 47
    Можно и руками, но сильно
    дольше…

    View Slide

  48. 48
    var red = '\u001b[31m',
    blue = '\u001b[34m',
    reset = '\u001b[0m';
    console.log(
    red + 'hello' + reset + ' ' +
    blue + 'world' + reset);
    Цветастая консоль руками
    > node main.js
    hello world

    View Slide

  49. 49
    Все эти библиотеки можно
    установить через npm:
    npm install express!

    View Slide

  50. node+dom
    Бонус: node-webkit

    View Slide

  51. 51
    Цель – десктопные
    приложения на DOM и
    Node.js API
    https://github.com/zcbenz/nw-sample-apps
    https://github.com/rogerwang/node-webkit

    View Slide

  52. 52
    node-webkit
    Node,  
    DOM  
    V8  
    JS  
    Среда

    Виртуалка

    Интерфейс

    GUI+*  

    View Slide

  53. 53
    Аналогов много, но node-
    webkit это первый, кто
    использует Node.js

    View Slide

  54. 54
    Список файлов в текущей директории

    <br/>
    <br/>var fs = require('fs');<br/>fs.readDirSync('.')<br/>.forEach(function (file) {<br/>$('<li/>')<br/>.text(file)<br/>.appendTo('.b-files-list');<br/>});<br/>
    node-webkit

    View Slide

  55. 55
    Заключение
    •  Node.js
    •  Npm
    •  Формат модуля
    –  CommonJS Module/1.0
    –  exports, module, require
    –  кэширование модуля
    •  Зависимости проекта
    –  package.json
    •  Базовые модули
    •  Библиотеки Node.js

    View Slide

  56. 56
    Михаил Давыдов
    Разработчик JavaScript
    [email protected]
    azproduction
    Спасибо

    View Slide