На этом занятии наша основная цель – улучшить нашу разработку на Node.js. Первое средство, которое мы для этого изучим, называется supervisor. До этого момента мы разработали эхо-сервер.
var http = require('http'); var url = require('url'); var server = http.createServer(); server.on('request', function(req, res) { var urlParsed = url.parse(req.url, true); if (req.method == 'GET' && urlParsed.pathname == '/echo' && urlParsed.query.message) { res.end(urlParsed.query.message ); return; } res.statusCode = 404; res.end('Not Found'); }); server.listen(1337);
В процессе разработки была некоторая сложность. Любые изменения в коде требовали перезапуска сервера. Это легко объяснить, ведь Node.js считывает файлы только один раз. Считав файл, он получает соответствующий объект модуля и в дальнейшем использует его. А что делать в процессе разработки?
Есть, конечно, вариант очистить внутренний cache Node.js, но наиболее часто используют другой подход, а именно специальный модуль, который отслеживает все файлы с директории. Как только в ней что-то меняется, перезапускает Node.js. один из таких модулей называется supervisor. Этот модуль содержит в себе console утилиту, которая должна быть доступна по системному пути.
Поэтому установим его глобально:
npm i –g supervisor
Теперь я запускаю вместо node server.js -> supervisor server.js
Что это нам дает? Сейчас я изменю файл, например, добавлю в него пустую строку и сохраню то, что получилось.
var http = require('http'); var url = require('url'); var server = http.createServer(); server.on('request', function(req, res) { var urlParsed = url.parse(req.url, true); if (req.method == 'GET' && urlParsed.pathname == '/echo' && urlParsed.query.message) { res.end(urlParsed.query.message ); return; } res.statusCode = 404; res.end('Not Found'); }); server.listen(1337);
Вы заметили? Crashing child и старт новый. Давайте еще раз. Уберем строку, сохраним.
WebStorm сохраняет при одном нажатии кнопки Save, либо если он теряет фокус. То есть, как только я переключусь на окно браузера, он тут же сохранит то, что я редактировал.
Supervisor все время следит за файлами, и как только он видит, что изменились файлы с расширениями по умолчанию node либо js, то перезапускает Node.
Более того, если в этой директории есть другие файлы, и они изменены, то тоже supervisor смотрит над всем содержимым директории, наблюдает, какие файлы изменились. Как только какой-нибудь из них будет изменен, включая путь директории, то он запустит Node. Это очень удобно при разработке больших многоуровневых проектов.
Какие подводные камни есть у supervisor? Они тоже присутствуют.
Первый подводный камень, о котором необходимо знать, это новые файлы. Создадим файл file.js. Сохраним.
Никакой реакции не происходит. Это потому что supervisor, во всяком случае, текущая его версия, наблюдает за каждым файлом индивидуально. Она просто не знает, что появился новый файл. Но, если мы после того, как изменили файл, внесем его через require-сервер, то как раз изменения в сервере оно отследит и все перезапустит. Ну, а после перезапуска будет следить и за новым файлом js тоже. Таким образом, если добавление нового файла влечет за собой изменения существующих, а, как правило, оно так и есть, то у нас все хорошо. Но в тех редких случаях, когда нет, то придется иметь в виду, что нужно перезапускать supervisor вручную. Автоматически новые файлы он не обнаружит.
Следующий подводный камень supervisor заключается в то, что если мы поставили много модулей, и у нас есть большая директория node.modules, а каждый модуль ставит свои зависимости, то общее количество файлов в поддиректории может стать очень большим, и supervisor начнет есть очень много процессорного времени. Особенно это заметно на ноутбуках, которые при этом начинают гораздо сильнее греться. Чтобы такого не было, желательно supervisor либо запускать с параметром ignor и указывать в нем что нужно игнорировать node.modules, либо переместить эту node.modules куда-то наверх, потому что это внешние модули. Они изменяются не так уж часто.
Итак, далее для разработки мы будем использовать supervisor.
Код урока находится в нашем репозитроии.
Материалы взяты из следующего скринкаста
We are looking forward to meeting you on our website soshace.com