ݺߣ

ݺߣShare a Scribd company logo
Типичный стек технологий для использования с node.js Сергей Широков, Jensen Technologies, 2011
Модули Модулей много Списки модулей есть, статистики использования — нет Люди, пытающиеся впервые написать что нибудь, видят просто список в алфавитном порядке Кроме модулей нужны другие компоненты
Компоненты стека Фронтенд Поддержка и мониторинг процессов Управление выполнением (flow control) Фреймворк Шаблонизатор Хранилище данных
Фронтенд
Использование фронтендов Nginx — отличный фронтенд Единственный минус — не работает с WebSockets Варианты: HAProxy, фронтенд на node либо вообще без него
Поддержка и мониторинг
Чем пользуются nodemon forever (Nodejutsu) haibu node-autorestart runit init Upstart Monit UNIX Node
Управление выполнением
Упорядочивание кода Step(   function readId() {    fs.readFile(__filename, this);   },   function getItem(err, id) {    if (err) throw err;    db.getFromDB(id, this);   },   function showIt(err, item) {    if (err) throw err;    console.log(item.name);   } ); fs.readFile(__filename, function(err, id) {    if (err) throw err;    db.getFromDB(id, function(err, item) {   if (err) throw err;      console.log(item.name);    });  }) До После
Step и async Step — библиотека от Tim Caswell, в разработке больше года, 316 watchers Async — библиотека от Caolan McMahon, полгода в разработке, 538 watchers (помимо них есть node-seq, node-promise, flow-js, nimble, streamline и множество других, в том числе самописных)
Использование Step Step(   function readFirst() {    fs.readFile(filename, this);   },   function readSecond(err, name) {    if (err) throw err;    fs.readFile(name, this);   },   function showIt(err, text) {    if (err) throw err;    console.log(newText);   } ); Step(   function loadStuff() {    fs.readFile(file1, this.parallel());    fs.readFile(file2, this.parallel());   },   function showStuff(err, first, second) {    if (err) throw err;    console.log(first);    console.log(second);   } ) Последовательное выполнение Параллельное  выполнение
Произвольное  число задач Step(   function  readDir () {    fs.readdir(__dirname, this);   },   function  readFiles (err, results) {    if (err) throw err;    var group = this.group();    results.forEach(function (filename) {     if (/\.js$/.test(filename)) {      fs.readFile(__dirname + "/" + filename, 'utf8', group());     }    });   },   function  showAll (err , files) {    if (err) throw err;    console.dir(files);   } );
Использование async async.map(['file1','file2','file3'], fs.readFile, function(err, results){    // results is now an array of stats for each file }); Параллельное чтение Последовательное чтение async.series([    function(callback){ fs.readFile('file1', callback) },    function(callback){ fs.readFile('file2', callback) },    function(callback){ fs.readFile('file3', callback) } ], function(err, results) { // результаты });
Другие возможности async Фильтры,  reduce Асинхронные циклы ( whilst ,  until ) Кеширование результатов асинхронных вызовов ( memoize )
Фреймворк
Connect — структура Функционал добавляется с помощью middleware Запрос и ответ проходят через все подключенные middleware (если один не оборвёт цепь или не вернёт ответ) Достаточно для простых сайтов / сервисов
Доступные middleware router  — позволяет назначать функции определенным URL vhost  — виртуальные хосты и поддомены static  — отдача статических файлов logger  — ведение логов session  — работа с сессией compiler  — сборка CSS из SASS, JS из CoffeeScript и т.д. connect-gzip  — сжатие ответов connect-i18n  — определение языка пользователя по заголовкам Всего больше 50 модулей
Express Надстройка над Connect View и redirection helpers Возможность подключать шаблонизатор прямо к фреймворку Генерация заготовки сайта из командной строки Разные конфигурации для dev / production
Шаблонизатор
Статистика использования
Использование Jade Основан на HAML Гибкая настройка Логи ошибок Версии для разных языков, в т.ч. PHP !!! 5 html(lang="en")   head    title= pageTitle    script(type='text/javascript')     if (foo) {      bar()     }   body    h1 Jade - node template engine    #container     - if (youAreUsingJade)      p You are amazing     - else      p Get on it!
Использование EJS Embedded JavaScript Шаблонизация в стиле PHP Логи ошибок Фильтры <h1><?= title ?></h1> <ul> <% for(var i=0; I < supplies.length; i++) {%>   <li><%= supplies[i] %></li> <% } %> </ul> <%= img_tag('test.jpg') %>
Хранилище данных
Хранилища выбираются под задачу
Что предлагают хостинги Nodester : облачный CouchDB (Iris Couch) Duostack : MySQL, MongoDB Joyent : MySQL, Redis, CouchDB, MongoDB (непросто, но можно) Nodejutsu : MongoDB, Redis, CouchDB
Другая статистика
Для чего используют node
NPM, CoffeeScript, Fibers NPM  используют 95% разработчиков — это фактически стандарт CoffeeScript  используют более 30% Fibers  — примерно 5%
Использование с другими серверными технологиями
Мой стек Фронтенд: Nginx (если не работаю с Websockets) Фреймворк:  Express Шаблонизатор:  Mu Поддержка:  Runit + доп. скрипты для запуска Управление выполнением:  Step Дополнительные скрипты для деплоя из Git и создания &quot;виртуальных хостов&quot;
Вопросы?

More Related Content

What's hot (20)

Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
tfmailru
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python Meetup
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Ontico
Введение в потоки питона
Введение в потоки питонаВведение в потоки питона
Введение в потоки питона
Andrey Niahajchyk
About Python
About PythonAbout Python
About Python
Yury Yurevich
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
Alexey Paznikov
Something about Golang
Something about GolangSomething about Golang
Something about Golang
Anton Arhipov
C++ для web с помощью Emscripten
C++ для web с помощью EmscriptenC++ для web с помощью Emscripten
C++ для web с помощью Emscripten
corehard_by
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
PyNSK
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
Alexey Paznikov
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Python Meetup
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Ontico
Почему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияПочему Rust стоит вашего внимания
Почему Rust стоит вашего внимания
Michael Pankov
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
Alexey Paznikov
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Python Meetup
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bash
kuchinskaya
Паттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере TarantoolПаттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере Tarantool
Alexandre Kalendarev
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
Alexey Paznikov
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
Alexey Paznikov
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
tfmailru
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Python Meetup
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Ontico
Введение в потоки питона
Введение в потоки питонаВведение в потоки питона
Введение в потоки питона
Andrey Niahajchyk
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
Alexey Paznikov
C++ для web с помощью Emscripten
C++ для web с помощью EmscriptenC++ для web с помощью Emscripten
C++ для web с помощью Emscripten
corehard_by
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
PyNSK
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
Alexey Paznikov
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Python Meetup
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...
Ontico
Почему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияПочему Rust стоит вашего внимания
Почему Rust стоит вашего внимания
Michael Pankov
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
Alexey Paznikov
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Асинхронное распределенное выполнение задач. Stdlib, Celery, RQ и собственные...
Python Meetup
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bash
kuchinskaya
Паттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере TarantoolПаттерны и примеры структур данных в NoSQL на примере Tarantool
Паттерны и примеры структур данных в NoSQL на примере Tarantool
Alexandre Kalendarev
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
Alexey Paznikov
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
Alexey Paznikov

Similar to Типичный стек технологий для использования с Node.js (20)

Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Vladimir Kochetkov
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
SmartTools
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
Zestranec
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
Pavlo Iuriichuk
QA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
QA Fest 2015. Иван Пашко. XPath yourself. Tips & TricksQA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
QA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
QAFest
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
Technopark
Js Http Request дмитрий котеров
Js Http Request   дмитрий котеровJs Http Request   дмитрий котеров
Js Http Request дмитрий котеров
Media Gorod
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
2ГИС Технологии
Систематизация экспрешнов в IE
Систематизация экспрешнов в IEСистематизация экспрешнов в IE
Систематизация экспрешнов в IE
Roman Komarov
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
ZFConf Conference
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
Ruslan Shevchenko
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
SQALab
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9
Technopark
Rich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkRich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend Framework
Georgy Turevich
XML Native Database на примере SednaXML
XML Native Database на примере SednaXMLXML Native Database на примере SednaXML
XML Native Database на примере SednaXML
Slach
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
CodeFest
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2
Alex Tumanoff
Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчика
Alexei Smolyanov
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
Ontico
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Vladimir Kochetkov
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
SmartTools
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
Zestranec
QA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
QA Fest 2015. Иван Пашко. XPath yourself. Tips & TricksQA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
QA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks
QAFest
Web весна 2013 лекция 9
Web весна 2013 лекция 9Web весна 2013 лекция 9
Web весна 2013 лекция 9
Technopark
Js Http Request дмитрий котеров
Js Http Request   дмитрий котеровJs Http Request   дмитрий котеров
Js Http Request дмитрий котеров
Media Gorod
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИСTARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
TARS: Сделай уровень frontend-рутины 0% — Артём Малко, 2ГИС
2ГИС Технологии
Систематизация экспрешнов в IE
Систематизация экспрешнов в IEСистематизация экспрешнов в IE
Систематизация экспрешнов в IE
Roman Komarov
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
ZFConf Conference
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
Ruslan Shevchenko
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
SQALab
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9
Technopark
Rich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend FrameworkRich UI on Dojo Toolkit and Zend Framework
Rich UI on Dojo Toolkit and Zend Framework
Georgy Turevich
XML Native Database на примере SednaXML
XML Native Database на примере SednaXMLXML Native Database на примере SednaXML
XML Native Database на примере SednaXML
Slach
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
CodeFest
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2
Alex Tumanoff
Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчика
Alexei Smolyanov
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
Ontico

Типичный стек технологий для использования с Node.js

  • 1. Типичный стек технологий для использования с node.js Сергей Широков, Jensen Technologies, 2011
  • 2. Модули Модулей много Списки модулей есть, статистики использования — нет Люди, пытающиеся впервые написать что нибудь, видят просто список в алфавитном порядке Кроме модулей нужны другие компоненты
  • 3. Компоненты стека Фронтенд Поддержка и мониторинг процессов Управление выполнением (flow control) Фреймворк Шаблонизатор Хранилище данных
  • 5. Использование фронтендов Nginx — отличный фронтенд Единственный минус — не работает с WebSockets Варианты: HAProxy, фронтенд на node либо вообще без него
  • 7. Чем пользуются nodemon forever (Nodejutsu) haibu node-autorestart runit init Upstart Monit UNIX Node
  • 9. Упорядочивание кода Step( function readId() { fs.readFile(__filename, this); }, function getItem(err, id) { if (err) throw err; db.getFromDB(id, this); }, function showIt(err, item) { if (err) throw err; console.log(item.name); } ); fs.readFile(__filename, function(err, id) { if (err) throw err; db.getFromDB(id, function(err, item) { if (err) throw err; console.log(item.name); }); }) До После
  • 10. Step и async Step — библиотека от Tim Caswell, в разработке больше года, 316 watchers Async — библиотека от Caolan McMahon, полгода в разработке, 538 watchers (помимо них есть node-seq, node-promise, flow-js, nimble, streamline и множество других, в том числе самописных)
  • 11. Использование Step Step( function readFirst() { fs.readFile(filename, this); }, function readSecond(err, name) { if (err) throw err; fs.readFile(name, this); }, function showIt(err, text) { if (err) throw err; console.log(newText); } ); Step( function loadStuff() { fs.readFile(file1, this.parallel()); fs.readFile(file2, this.parallel()); }, function showStuff(err, first, second) { if (err) throw err; console.log(first); console.log(second); } ) Последовательное выполнение Параллельное выполнение
  • 12. Произвольное число задач Step( function readDir () { fs.readdir(__dirname, this); }, function readFiles (err, results) { if (err) throw err; var group = this.group(); results.forEach(function (filename) { if (/\.js$/.test(filename)) { fs.readFile(__dirname + &quot;/&quot; + filename, 'utf8', group()); } }); }, function showAll (err , files) { if (err) throw err; console.dir(files); } );
  • 13. Использование async async.map(['file1','file2','file3'], fs.readFile, function(err, results){ // results is now an array of stats for each file }); Параллельное чтение Последовательное чтение async.series([ function(callback){ fs.readFile('file1', callback) }, function(callback){ fs.readFile('file2', callback) }, function(callback){ fs.readFile('file3', callback) } ], function(err, results) { // результаты });
  • 14. Другие возможности async Фильтры, reduce Асинхронные циклы ( whilst , until ) Кеширование результатов асинхронных вызовов ( memoize )
  • 16. Connect — структура Функционал добавляется с помощью middleware Запрос и ответ проходят через все подключенные middleware (если один не оборвёт цепь или не вернёт ответ) Достаточно для простых сайтов / сервисов
  • 17. Доступные middleware router — позволяет назначать функции определенным URL vhost — виртуальные хосты и поддомены static — отдача статических файлов logger — ведение логов session — работа с сессией compiler — сборка CSS из SASS, JS из CoffeeScript и т.д. connect-gzip — сжатие ответов connect-i18n — определение языка пользователя по заголовкам Всего больше 50 модулей
  • 18. Express Надстройка над Connect View и redirection helpers Возможность подключать шаблонизатор прямо к фреймворку Генерация заготовки сайта из командной строки Разные конфигурации для dev / production
  • 21. Использование Jade Основан на HAML Гибкая настройка Логи ошибок Версии для разных языков, в т.ч. PHP !!! 5 html(lang=&quot;en&quot;) head title= pageTitle script(type='text/javascript') if (foo) { bar() } body h1 Jade - node template engine #container - if (youAreUsingJade) p You are amazing - else p Get on it!
  • 22. Использование EJS Embedded JavaScript Шаблонизация в стиле PHP Логи ошибок Фильтры <h1><?= title ?></h1> <ul> <% for(var i=0; I < supplies.length; i++) {%> <li><%= supplies[i] %></li> <% } %> </ul> <%= img_tag('test.jpg') %>
  • 25. Что предлагают хостинги Nodester : облачный CouchDB (Iris Couch) Duostack : MySQL, MongoDB Joyent : MySQL, Redis, CouchDB, MongoDB (непросто, но можно) Nodejutsu : MongoDB, Redis, CouchDB
  • 28. NPM, CoffeeScript, Fibers NPM используют 95% разработчиков — это фактически стандарт CoffeeScript используют более 30% Fibers — примерно 5%
  • 29. Использование с другими серверными технологиями
  • 30. Мой стек Фронтенд: Nginx (если не работаю с Websockets) Фреймворк: Express Шаблонизатор: Mu Поддержка: Runit + доп. скрипты для запуска Управление выполнением: Step Дополнительные скрипты для деплоя из Git и создания &quot;виртуальных хостов&quot;