Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

3

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

6 Node.js Node   V8   JS   Среда Виртуалка любой   Интерфейс

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

25

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

Библиотеки Node.js express optimist colors … https://github.com/joyent/node/wiki/modules https://npmjs.org/

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

41

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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' ]

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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!

Slide 46

Slide 46 text

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!

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

52 node-webkit Node,   DOM   V8   JS   Среда Виртуалка Интерфейс GUI+*  

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

54 Список файлов в текущей директории
    var fs = require('fs'); fs.readDirSync('.') .forEach(function (file) { $('<li/>') .text(file) .appendTo('.b-files-list'); }); node-webkit

    Slide 55

    Slide 55 text

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

    Slide 56

    Slide 56 text

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