SlideShare a Scribd company logo
Introduction in Node.js (in russian)
Михаил Давыдов
Разработчик 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": "b@rubble.com"
}
}
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
56
Михаил Давыдов
Разработчик JavaScript
azproduction@yandex-team.ru
azproduction
Спасибо

More Related Content

What's hot (20)

PDF
DevOps или исскуство ухода за Интернет-проектом
Alexander Titov
 
PDF
Иван Карев — Клиентская оптимизация
Yandex
 
PDF
2013 09 19 кеширование на клиенте и сервере
Yandex
 
PDF
Выжимаем из сервера максимум (Андрей Паньгин)
Ontico
 
PDF
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Ontico
 
PDF
How to build solid CI-CD pipeline / Илья Беда (beda.software)
Ontico
 
PPTX
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Ontico
 
PDF
Незаурядная Java как инструмент разработки высоконагруженного сервера
odnoklassniki.ru
 
PPTX
Евгений Потапов (Сумма Айти)
Ontico
 
PDF
Иван Карев — Клиентская оптимизация
Yandex
 
PPTX
Windows Azure and node js
Alex Tumanoff
 
PPTX
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Ontico
 
PPTX
Chef @DevWeb
Alex Chistyakov
 
ODP
Smirnov twisted-python
Andrey Smirnov
 
PPTX
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
Volha Banadyseva
 
PDF
Чему мы научились разрабатывая микросервисы?
Vadim Madison
 
PDF
Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)
Ontico
 
PDF
Basis.js – «под капотом»
Roman Dvornov
 
PDF
Дмитрий Стогов
CodeFest
 
PDF
Распределенные системы в Одноклассниках
odnoklassniki.ru
 
DevOps или исскуство ухода за Интернет-проектом
Alexander Titov
 
Иван Карев — Клиентская оптимизация
Yandex
 
2013 09 19 кеширование на клиенте и сервере
Yandex
 
Выжимаем из сервера максимум (Андрей Паньгин)
Ontico
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Ontico
 
How to build solid CI-CD pipeline / Илья Беда (beda.software)
Ontico
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Ontico
 
Незаурядная Java как инструмент разработки высоконагруженного сервера
odnoklassniki.ru
 
Евгений Потапов (Сумма Айти)
Ontico
 
Иван Карев — Клиентская оптимизация
Yandex
 
Windows Azure and node js
Alex Tumanoff
 
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Ontico
 
Chef @DevWeb
Alex Chistyakov
 
Smirnov twisted-python
Andrey Smirnov
 
HTML 5: будущее уже сегодня, Сергей Байдачный, Microsoft Ukraine
Volha Banadyseva
 
Чему мы научились разрабатывая микросервисы?
Vadim Madison
 
Производительность WebGL-приложений / Дмитренко Кирилл (Яндекс)
Ontico
 
Basis.js – «под капотом»
Roman Dvornov
 
Дмитрий Стогов
CodeFest
 
Распределенные системы в Одноклассниках
odnoklassniki.ru
 

Viewers also liked (12)

PDF
JavaScript. Event Loop and Timers (in russian)
Mikhail Davydov
 
PDF
JavaScript. Basics (in russian)
Mikhail Davydov
 
PDF
Ajax and Transports (in russian)
Mikhail Davydov
 
PDF
Dart - светлая сторона силы?
Mikhail Davydov
 
PDF
JavaScript. OOP (in russian)
Mikhail Davydov
 
PDF
Dump-IT Загрузка и инициализация JavaScript
Mikhail Davydov
 
PDF
JavaScript. Loops and functions (in russian)
Mikhail Davydov
 
PDF
Components now! (in russian)
Mikhail Davydov
 
PDF
JavaScript. Event Model (in russian)
Mikhail Davydov
 
PDF
JavaScript. Async (in Russian)
Mikhail Davydov
 
PDF
Components now!
Mikhail Davydov
 
PDF
Node Foundation Membership Overview 20160907
NodejsFoundation
 
JavaScript. Event Loop and Timers (in russian)
Mikhail Davydov
 
JavaScript. Basics (in russian)
Mikhail Davydov
 
Ajax and Transports (in russian)
Mikhail Davydov
 
Dart - светлая сторона силы?
Mikhail Davydov
 
JavaScript. OOP (in russian)
Mikhail Davydov
 
Dump-IT Загрузка и инициализация JavaScript
Mikhail Davydov
 
JavaScript. Loops and functions (in russian)
Mikhail Davydov
 
Components now! (in russian)
Mikhail Davydov
 
JavaScript. Event Model (in russian)
Mikhail Davydov
 
JavaScript. Async (in Russian)
Mikhail Davydov
 
Components now!
Mikhail Davydov
 
Node Foundation Membership Overview 20160907
NodejsFoundation
 
Ad

Similar to Introduction in Node.js (in russian) (20)

PPTX
What do you MEAN? или введение в Fullstack JavaScript
Vasiliy Teliatnikov
 
PPT
Node.js (RichClient)
Serge Shirokov
 
PPT
Node.JS: возможности для РНР-разработчика
Alexei Smolyanov
 
PPT
Типичный стек технологий для использования с Node.js
Serge Shirokov
 
PDF
Devcamp nodejs-2010
Antono Vasiljev
 
PDF
Node.js Меньше сложности, больше надежности Holy.js 2021
Timur Shemsedinov
 
PDF
Серверный JavaScript: NodeJS и CouchDB
Stepan Stolyarov
 
PDF
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
CodeFest
 
PPT
ВВЕДЕНИЕ В NODE.JS
Pavel Tsukanov
 
PDF
NPM и модульная архитектура приложения
Denis Latushkin
 
PPTX
Nikita Galkin "5 production Node.js stories"
OdessaJS Conf
 
PPT
Current State of Server Side JavaScript
Oleg Podsechin
 
PPT
Drupal and NodeJS.
DrupalForumZP2012
 
PDF
2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js
Омские ИТ-субботники
 
PPT
Эффективное программирование на NodeJS
Yura Bogdanov
 
PDF
Денис Чистяков — JavaScript на фронте и в тылу
Yandex
 
PDF
JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js
GeeksLab Odessa
 
PDF
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Yandex
 
PDF
Desktop app based on node js and html5
Provectus
 
PDF
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
QADay
 
What do you MEAN? или введение в Fullstack JavaScript
Vasiliy Teliatnikov
 
Node.js (RichClient)
Serge Shirokov
 
Node.JS: возможности для РНР-разработчика
Alexei Smolyanov
 
Типичный стек технологий для использования с Node.js
Serge Shirokov
 
Devcamp nodejs-2010
Antono Vasiljev
 
Node.js Меньше сложности, больше надежности Holy.js 2021
Timur Shemsedinov
 
Серверный JavaScript: NodeJS и CouchDB
Stepan Stolyarov
 
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
CodeFest
 
ВВЕДЕНИЕ В NODE.JS
Pavel Tsukanov
 
NPM и модульная архитектура приложения
Denis Latushkin
 
Nikita Galkin "5 production Node.js stories"
OdessaJS Conf
 
Current State of Server Side JavaScript
Oleg Podsechin
 
Drupal and NodeJS.
DrupalForumZP2012
 
2014-08-02 03 Дмитрий Шматко. Первые впечатления от Node.js
Омские ИТ-субботники
 
Эффективное программирование на NodeJS
Yura Bogdanov
 
Денис Чистяков — JavaScript на фронте и в тылу
Yandex
 
JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js
GeeksLab Odessa
 
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Yandex
 
Desktop app based on node js and html5
Provectus
 
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
QADay
 
Ad

Introduction in Node.js (in russian)