introduction in node.js (in russian)
TRANSCRIPT
Михаил Давыдов Разработчик JavaScript
Node.js – серверный JavaScript
3
4
История Node.js
• Разработка с 2009 – Ryan Dahl • Поддержка Joyent • Событийный асинхронный I/O • V8 JavaScript от Google • libUV - ядро Node
– событийный ввод-вывод
• Кроссплатформенный (native)
5
Где и почему?
• Node.js = JavaScript + Асинхронность • Приложения реального времени
– Чаты – Серверы игр – Серверы Push-уведомлений
• Нагруженные прокси • Сервисы с большим числом клиентов • Везде, где время I/O больше вычислений
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 = {};!– Объект экспорта данного модуля
• require(moduleName): *!• __filename!• __dirname!
http://nodejs.org/api/modules.html http://nodejs.org/api/globals.html
13
require()
• Формат: .js .json .node – Может быть любой формат (нужно прописать правило) – Нативные модули на C++
• Имена модулей в require() – Поведение по умолчанию: – 'имя_модуля' -> npm или базовый node.js – './путь/до/модуля.js' -> локальный – './путь/до' -> './путь/до/index.js'
https://github.com/joyent/node/blob/master/lib/module.js
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
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
16
Запуск файла с node.js
> node main.js /path/to/myOtherModule.js 5.14159
17
Node.js кэширует модули и выполняет их код только 1 раз
18
Другие глобальные переменные
• console – вывод данных в STDOUT – log – dir
• process – информация о текущем процессе – время работы – затраты памяти – Информация о текущей ОС – текущая рабочая папка CWD – PID
• setTimeout, setInterval
http://nodejs.org/api/process.html
NPM
Управление зависимостями
Декларация зависимостей
Задачи npm
• Устанавливает модули из репозитория • Устраняет зависимости • Удаляет не нужные модули • Отправляет ваши модули в репозиторий • …
https://npmjs.org/
21
Зависимости main.js
• main.js – module.js – наш модуль
• module.js – npmModule – не наш модуль – fs – модуль node.js – ../dep.js – наш модуль
22
npmModule может быть не установлен – его нужно задекларировать
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
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
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 err; console.log(json); } var json = fs.readFileSync('./package.json', 'utf8');
fs
http://nodejs.org/api/fs.html
30
Синхронный для CLI Асинхронный для сервера
31
http/https
• Всевозможные функции работы с http • HTTP(S) сервер • Скачивание файлов по сети
– аналоги $.get, $.post
http://nodejs.org/api/http.html
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
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
34
Все API низкоуровневое
• Объект req – Request – Описывает текущий запрос – Заголовки запроса – Тело запроса – Тип запроса GET POST – URL запроса
• Объект res – Response – Описывает ответ на запрос – Заголовки ответа – Тело ответа – Статус ответа
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
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 фреймворк
http://expressjs.com/api.html http://expressjs.com/guide.html
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
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
41
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' ]
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
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!
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!
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
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/node-webkit
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.js"> </script> <script> var fs = require('fs'); fs.readDirSync('.') .forEach(function (file) { $('<li/>') .text(file) .appendTo('.b-files-list'); }); </script>
node-webkit
55
Заключение
• Node.js • Npm • Формат модуля
– CommonJS Module/1.0 – exports, module, require – кэширование модуля
• Зависимости проекта – package.json
• Базовые модули • Библиотеки Node.js