17. Разработка, отладка, supervisor

Всем привет, на этом занятии наша основная цель улучшить нашу разработку на Node.JS. Первое средство которое мы для этого изучим, называется «supervisor». Доку по нему можем посмотреть здесь.

До этого момента, мы разработали «echo server»

Как вы помните в процессе разработки была некоторая сложность, можно сказать неудобство. Любые изменения в коде, требовали перезапуска сервера, это легко объяснимо, ведь Node.JS считывает файлы только один раз. Считав файл он получает соответствующий объект модуля и в дальнейшем использует его. А что делать в процессе разработки? Есть конечно вариант очистить внутренний кеш Node.JS, но наиболее часто используют другой подход, а именно специальный модуль, который отслеживает все файлы в директории и как только в ней что то меняется, перезапускает Node.JS. Один из таких модулей называется «supervisor». Этот модуль содержит в себе консольную утилиту, которая должна быть доступна по системному пути по этому я ставлю его глобально

screenshot_17_01

Поставилось, и теперь я запускаю вместо

«supervisor»

screenshot_17_02

Запустил, что это мне даст? Давайте посмотрим, сейчас я изменю файл, добавив в него, например, пустую строку и сохраню то что получилось.

screenshot_17_03

Мы видим — «crashing child» и старт новый. И так он будет перезапускатся при каждом изменении. А supervisor все время следит за файлами и как только он видит, что изменились файлы с расширениями, по умолчанию — «node» или «js», то он перезапускает ноду. Пожалуй стоит подредактировать конфигурацию запуска server.js в Webstorm с использованием  supervisor. Как попасть в окно настроек смотрим здесь. Запускаться у нас будет боле не node

screenshot_17_04

а supervisor.

Сейчас, пользователям Windows, повышенное внимание!

Наша задача это поменять в указанной строке путь так, чтоб он указывал к файлу «supervisor.cmd», который находится по пути — «C:\Users\<USER_NAME>\AppData\Roaming\npm\supervisor.cmd». <USER_NAME> — это соответственно имя вашего пользователя Windows. Но наш WebStorm не видит скрытые директории, а директория «AppData» — скрытая. поэтому, вам придется вручную ввести название этой папки или путя в целом. Смотрим

screenshot_17_05 screenshot_17_07 screenshot_17_08 screenshot_17_09 screenshot_17_10 screenshot_17_11

Далее Apply и OK. Запускаю

screenshot_17_12

Так, вроде работает. Ну ка добавлю строку, сохраню файл

screenshot_17_13

Перезапускается. Более того, если в директории нашего проекта есть другие директории и файлы в них изменены, то supervisor смотрит на все содержимое директорий, какие файлы изменились, как только какой нибудь из них будет изменен, включая поддиректории, то он перезапустит ноду, это очень удобно при разработке больших, многоуровневых проектов.

Какие подводные камни есть у supervisor? Они тоже присутствуют. Первый подводный камень о котором необходимо знать, это новые файла. Если я создам новый файл в директории проекта, например — «file.js», то никакой реакции от supervisor мы не дождемся. Если я сделаю изменения в новом файле — реакции ноль. Это потому что supervisor  наблюдает за каждым файлом индивидуально и он просто не знает о том что новый файл появился, но если я после того как изменил этот файл, внесу его через require в server.js то как раз изменения в server.js он отследит и все перезапустит ну а после запуска будет следить и за новым файлом тоже. Таким образом, если добавление нового файла влечет за собой изменения существующих, а как правило так оно и есть, то у нас все хорошо. Но в тех редких случаях когда не влечет, придется перезапускать supervisor вручную, автоматически новые файлы он не обнаружит.

Следующий подводный камень супервизора заключается в том, что если мы поставили в директорию проекта много модулей и у нас есть большая директория node_modules, а каждый модуль ставит свои зависимости, то общее количество файлов в поддиректории может стать очень большим и supervisor начнет есть очень много процессорного времени, особенно это заметно на ноутбуках, которые при этом начинают гораздо сильнее греться, вот чтобы такого не было, желательно, либо supervisor запускать с параметром «ignore» и указывать что нужно игнорировать node_modules, для примера попробуем проигнорировать наш file.js

screenshot_17_14

либо переместить эту node_modules, жирную, куда то на верх, потому что, действительно, зачем за ней смотреть, это внешние модули, они изменяются не так уж часто.

Итак, далее для разработки мы будем использовать supervisor.