Михаил Давыдов
Разработчик JavaScript
Node.js –
серверный
JavaScript
3
4
История Node.js
•  Разработка с 2009 – Ryan Dahl
•  Поддержка Joyent
•  Событийный асинхронный I/O
•  V8 JavaScript от G...
5
Где и почему?
•  Node.js = JavaScript + Асинхронность
•  Приложения реального времени
–  Чаты
–  Серверы игр
–  Серверы ...
6
Node.js
Node	
  V8	
  JS	
  
Среда	

Виртуалка	

любой	
  
Интерфейс
7
Установка
•  http://nodejs.org/download/
•  Просто выполняем установочный файл
8
В консоли
> node -v
v0.8.8
# npm – Node Package Manager
> npm -v
1.1.59
> node -e 'console.log("123")'
123
Запуск
9
main.js
console.log('Hello World!');
Запуск файла с node.js
> node main.js
Hello World!
Модули в Node.js
CommonJS Module
Глобальные переменные модуля
Любой файл – модуль
Глобальные переменные модуля
•  module = {exports:{}, ...};!
–  Объект описывающий данный модуль
•  exports = {};!
–  Объе...
13
require()
•  Формат: .js .json .node
–  Может быть любой формат (нужно прописать правило)
–  Нативные модули на C++
•  ...
14
module.js
var npmModule = require('npmModule'),
fs = require('fs'),
someMyModule = require('../dep.js');
var myFunction...
15
main.js
var module = require('./module.js');
typeof module; // object
typeof module.myFunction; // function
var result ...
16
Запуск файла с node.js
> node main.js
/path/to/myOtherModule.js
5.14159
17
Node.js кэширует модули и
выполняет их код
только 1 раз
18
Другие глобальные переменные
•  console
–  вывод данных в STDOUT
–  log
–  dir
•  process
–  информация о текущем проце...
NPM
Управление зависимостями
Декларация зависимостей
Задачи npm
•  Устанавливает модули из репозитория
•  Устраняет зависимости
•  Удаляет не нужные модули
•  Отправляет ваши ...
21
Зависимости main.js
•  main.js
–  module.js – наш модуль
•  module.js
–  npmModule – не наш модуль
–  fs – модуль node....
22
npmModule может быть не
установлен – его нужно
задекларировать
23
{
"dependencies": {
"npmModule": "*",
"npmModule": ">=1.0.2",
"npmModule": "http://asdf.com/asdf.tar.gz"
},
"name": "yo...
24
npm install
> wget http://site.ru/your-app.zip
> unzip your-app.zip
> cd your-app
> npm install
your-app
+-npmModule
> ...
25
Базовые модули Node
fs
http
http://nodejs.org/api/
27
fs
•  Всевозможные функции работы с fs
•  fs.readFile
•  fs.writeFile
•  fs.realpath
•  …
http://nodejs.org/api/fs.html
28
Каждая функция fs имеет 2
типа: синхронный и
асинхронный
29
main.js
var fs = require('fs');
fs.readFile('./package.json', 'utf8', file);
function file(err, json) {
if (err) throw ...
30
Синхронный для CLI
Асинхронный для сервера
31
http/https
•  Всевозможные функции работы с http
•  HTTP(S) сервер
•  Скачивание файлов по сети
–  аналоги $.get, $.pos...
32
main.js
var http = require('http');
http.get('http://site/', function (res) {
console.log("response: " + res.statusCode...
33
var http = require('http');
var server = http.createServer();
server.on('request', function (req, res) {
res.writeHead(...
34
Все API низкоуровневое
•  Объект req – Request
–  Описывает текущий запрос
–  Заголовки запроса
–  Тело запроса
–  Тип ...
35
var url = require('url');
// req.url == /?page=pagename&pewpew=ololo
function onRequest(req, res) {
var data = url.pars...
36
Как же много писать...
Библиотеки Node.js
express
optimist
colors
…
https://github.com/joyent/node/wiki/modules
https://npmjs.org/
38
// В 5 строк
require('express')()
.get('/', function (req, res) {
res.send('hello world');
})
.listen();
express – http...
39
var express = require('express');
var app = express();
var staticDir = __dirname + '/public';
app.get('/', function (re...
40
var optimist = require('optimist')
.default('port', 80)
.default('host', '0.0.0.0');
var cfg = optimist.argv;
require('...
41
42
Можно и руками, но сильно
дольше…
43
console.log(process.argv);
CLI парсер руками
> node main.js --port 81 --host pewpew.com
> node main.js
[
'/path/to/node...
44
CLI парсер руками
> node main.js --port 81 --host pewpew.com
// argv парсер в 97 байт
var argv = (function(a,b,c,d){c={...
45
require('colors');
console.log('hello'.green);
console.log('i like cake'.underline.red)
console.log('OMG Rainbows!'.rai...
46
require('colors');
console.log('hello'.green);
console.log('i like cake'.underline.red)
console.log('OMG Rainbows!'.rai...
47
Можно и руками, но сильно
дольше…
48
var red = 'u001b[31m',
blue = 'u001b[34m',
reset = 'u001b[0m';
console.log(
red + 'hello' + reset + ' ' +
blue + 'world...
49
Все эти библиотеки можно
установить через npm:
npm install express!
node+dom
Бонус: node-webkit
51
Цель – десктопные
приложения на DOM и
Node.js API
https://github.com/zcbenz/nw-sample-apps
https://github.com/rogerwang...
52
node-webkit
Node,	
  
DOM	
  
V8	
  JS	
  
Среда	

Виртуалка	

Интерфейс	

GUI+*	
  
53
Аналогов много, но node-
webkit это первый, кто
использует Node.js
54
Список файлов в текущей директории
<ol class="b-files-list"></ol>
<script src="http://yandex.st/jquery/1.8.2/jquery.min...
55
Заключение
•  Node.js
•  Npm
•  Формат модуля
–  CommonJS Module/1.0
–  exports, module, require
–  кэширование модуля
...
56
Михаил Давыдов
Разработчик JavaScript
azproduction@yandex-team.ru
azproduction
Спасибо
Introduction in Node.js (in russian)
Upcoming SlideShare
Loading in …5
×

Introduction in Node.js (in russian)

1,088 views
834 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,088
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Introduction in Node.js (in russian)

  1. 1. Михаил Давыдов Разработчик JavaScript Node.js – серверный JavaScript
  2. 2. 3
  3. 3. 4 История Node.js •  Разработка с 2009 – Ryan Dahl •  Поддержка Joyent •  Событийный асинхронный I/O •  V8 JavaScript от Google •  libUV - ядро Node –  событийный ввод-вывод •  Кроссплатформенный (native)
  4. 4. 5 Где и почему? •  Node.js = JavaScript + Асинхронность •  Приложения реального времени –  Чаты –  Серверы игр –  Серверы Push-уведомлений •  Нагруженные прокси •  Сервисы с большим числом клиентов •  Везде, где время I/O больше вычислений
  5. 5. 6 Node.js Node  V8  JS   Среда Виртуалка любой   Интерфейс
  6. 6. 7 Установка •  http://nodejs.org/download/ •  Просто выполняем установочный файл
  7. 7. 8 В консоли > node -v v0.8.8 # npm – Node Package Manager > npm -v 1.1.59 > node -e 'console.log("123")' 123 Запуск
  8. 8. 9 main.js console.log('Hello World!'); Запуск файла с node.js > node main.js Hello World!
  9. 9. Модули в Node.js CommonJS Module Глобальные переменные модуля
  10. 10. Любой файл – модуль
  11. 11. Глобальные переменные модуля •  module = {exports:{}, ...};! –  Объект описывающий данный модуль •  exports = {};! –  Объект экспорта данного модуля •  require(moduleName): *! •  __filename! •  __dirname! http://nodejs.org/api/modules.html http://nodejs.org/api/globals.html
  12. 12. 13 require() •  Формат: .js .json .node –  Может быть любой формат (нужно прописать правило) –  Нативные модули на C++ •  Имена модулей в require() –  Поведение по умолчанию: –  'имя_модуля' -> npm или базовый node.js –  './путь/до/модуля.js' -> локальный –  './путь/до' -> './путь/до/index.js' https://github.com/joyent/node/blob/master/lib/ module.js
  13. 13. 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
  14. 14. 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
  15. 15. 16 Запуск файла с node.js > node main.js /path/to/myOtherModule.js 5.14159
  16. 16. 17 Node.js кэширует модули и выполняет их код только 1 раз
  17. 17. 18 Другие глобальные переменные •  console –  вывод данных в STDOUT –  log –  dir •  process –  информация о текущем процессе –  время работы –  затраты памяти –  Информация о текущей ОС –  текущая рабочая папка CWD –  PID •  setTimeout, setInterval http://nodejs.org/api/process.html
  18. 18. NPM Управление зависимостями Декларация зависимостей
  19. 19. Задачи npm •  Устанавливает модули из репозитория •  Устраняет зависимости •  Удаляет не нужные модули •  Отправляет ваши модули в репозиторий •  … https://npmjs.org/
  20. 20. 21 Зависимости main.js •  main.js –  module.js – наш модуль •  module.js –  npmModule – не наш модуль –  fs – модуль node.js –  ../dep.js – наш модуль
  21. 21. 22 npmModule может быть не установлен – его нужно задекларировать
  22. 22. 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": "b@rubble.com" } } package.json https://npmjs.org/doc/json.html
  23. 23. 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
  24. 24. 25
  25. 25. Базовые модули Node fs http http://nodejs.org/api/
  26. 26. 27 fs •  Всевозможные функции работы с fs •  fs.readFile •  fs.writeFile •  fs.realpath •  … http://nodejs.org/api/fs.html
  27. 27. 28 Каждая функция fs имеет 2 типа: синхронный и асинхронный
  28. 28. 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
  29. 29. 30 Синхронный для CLI Асинхронный для сервера
  30. 30. 31 http/https •  Всевозможные функции работы с http •  HTTP(S) сервер •  Скачивание файлов по сети –  аналоги $.get, $.post http://nodejs.org/api/http.html
  31. 31. 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
  32. 32. 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
  33. 33. 34 Все API низкоуровневое •  Объект req – Request –  Описывает текущий запрос –  Заголовки запроса –  Тело запроса –  Тип запроса GET POST –  URL запроса •  Объект res – Response –  Описывает ответ на запрос –  Заголовки ответа –  Тело ответа –  Статус ответа
  34. 34. 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
  35. 35. 36 Как же много писать...
  36. 36. Библиотеки Node.js express optimist colors … https://github.com/joyent/node/wiki/modules https://npmjs.org/
  37. 37. 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
  38. 38. 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
  39. 39. 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
  40. 40. 41
  41. 41. 42 Можно и руками, но сильно дольше…
  42. 42. 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' ]
  43. 43. 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
  44. 44. 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!
  45. 45. 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!
  46. 46. 47 Можно и руками, но сильно дольше…
  47. 47. 48 var red = 'u001b[31m', blue = 'u001b[34m', reset = 'u001b[0m'; console.log( red + 'hello' + reset + ' ' + blue + 'world' + reset); Цветастая консоль руками > node main.js hello world
  48. 48. 49 Все эти библиотеки можно установить через npm: npm install express!
  49. 49. node+dom Бонус: node-webkit
  50. 50. 51 Цель – десктопные приложения на DOM и Node.js API https://github.com/zcbenz/nw-sample-apps https://github.com/rogerwang/node-webkit
  51. 51. 52 node-webkit Node,   DOM   V8  JS   Среда Виртуалка Интерфейс GUI+*  
  52. 52. 53 Аналогов много, но node- webkit это первый, кто использует Node.js
  53. 53. 54 Список файлов в текущей директории <ol class="b-files-list"></ol> <script src="http://yandex.st/jquery/1.8.2/jquery.min.js"> </script> <script> var fs = require('fs'); fs.readDirSync('.') .forEach(function (file) { $('<li/>') .text(file) .appendTo('.b-files-list'); }); </script> node-webkit
  54. 54. 55 Заключение •  Node.js •  Npm •  Формат модуля –  CommonJS Module/1.0 –  exports, module, require –  кэширование модуля •  Зависимости проекта –  package.json •  Базовые модули •  Библиотеки Node.js
  55. 55. 56 Михаил Давыдов Разработчик JavaScript azproduction@yandex-team.ru azproduction Спасибо

×