Добрый день, друзья! В ноябре 2016 года я начал играться с плагином Nodejs для Sublime Text. Плагин был маленьким и имел под катом несколько давних и хорошо известных багов.

В те дни я игрался с Nodejs и моим любимым редактором для кода был Sublime Text. По давно проторенной дорожке, я пошел на packagecontrol.io и поискал плагины для Nodejs. Нашелся вот этот. Поставив и поработав, я был очень разочарован, когда обнаружил, что некоторые заявленные фичи плагина не работают, или работают не так как заявлено…

В таких ситуациях, я обычно, иду на страничку проекта на GitHub и изучаю проект на предмет последней активности, чтобы убедиться, что проект не заброшен. Я обнаружил, что последний коммит был в 2013 году. Печалька, подумал я, учитывая, что это был единственный плагин для работы с Nodejs в Sublime Text.

Тогда я подумал… Это две частички технологии, которые мне нравятся, и я всегда хотел контрибьютить в Open Source.

План был прост, фиксить баги, с которыми я столкнусь. С течением времени, я понял, что фикс багов начал доставлять проблемы, из-за монолитной архитектуры плагина, отсутствия тестов и инструментов для отладки.

Планы меняются


Как я упомянул ранее, я страдал от отсутствия тестов и инструментов для отладки. Фикс одного баг�� мог вызвать череду других багов. Более того, фикс багов на одних платформах, мог вызвать или оставить баги на других платформах. Тогда, было решено сделать жизнь проще и счастливее. =)

Что было сделано


Много чего было отрефакторено, переделано и переосмыслено. Все изменения логически можно поделить на две группы: взаимодействие пользователя с плагином и комфорт разработчика.

Комфорт разработчика


Изложу все в виде списка с маленьким пояснениями зачем, как и возможно почему это было сделано.

  • Все кодовая база плагина в ранних версиях была расположена в одном файле Nodejs.py. Логически здесь просится деление монолитного файла на логические модули и перенос всего этого добра в папку lib. Теперь у нас есть следующие логические модули:
    • nodejs_base.py — базовые классы для команд — в терминах Sublime Text
    • nodejs_command_thread.py — классы для запуска ОС специфичных процессов
    • nodejs_commands.py — классы составляющие ядро плагина
    • nodejs_constants.py — несколько констант типа PLUGIN_PATH и т.п.
    • nodejs_debug.py — отладочные функции
    • nodejs_nvm.py — класс для определения и работы с NVM
  • Добавлен функционал для отладки. На протяжении всего кода вы можете вызвать функцию debug, чтобы вывести какую-либо отладочную информацию в консоль Sublime Text. Данные будут выведены если в директории плагина есть файл с именем .debug_plugin. Соответственно для выключения отладочной информации нужно, просто удалить файл.
  • Добавлена возможность тестирования, благодаря прекрасной работе, проделанной Randy3k. Этот великолепный плагин позволяет писать приемочные тесты для плагинов Sublime Text. В основе своей он представляет из себя модуль unittesting из стандартной библиотеки Python, вследствие чего можно писать простые юнит-тесты для ключевого функционала Вашего проекта.
  • Модуль вышеупомянутого Randy3k также имеет функционал и побочный код для запуска тестов в сервисах CI (continuous integration), таких как Travis CI и Appveyor. Благодаря этому, теперь можно протестировать функционал плагина на всех платформах.
  • Плагин теперь зависит от модулей: shellenv и newterm, что означает, что после установки плагина Вам придется перезагрузить Sublime Text, если конечно они уже не были установлены с другими плагинами.

С помощью всего вышеперечисленного, теперь мы можем фиксить баги или добавлять новый функционал, наслаждаясь процессом.

Взаимодействия пользователя с плагином


Итак, мы добрались до самой интересной части — взаимодействие пользователя с плагином. Как и в предыдущей части я перечислю список изменений и причины для этого.

  • К радости или к сожалению, но плагин теперь поддерживает работу только в третьей версии Sublime Text. Основанием для этого послужило долгожданный, не бета, релиз третьего Sublime Text, а также задействование в коде функционала специфичного для Python 3 и выше.
  • Наверное самая надоедливая проблема (только при мне было 3-4 бага на ГитХабе) — неправильная работа автокомплита. Временами автокомплит заменял часть до точки: os.chdir(),
    chdir() заменял часть os. Времени автокомплит дублировал часть до точки: http.createServer()
    дублировал часть http, получалось http.http.createServer(). Проблема была решена внесением изменений в tools/docs_builder.js, путем добавления названия модулей стандартной библиотеки Nodejs как отдельных элементов автокомплита.
  • Теперь при загрузке плагина, он определяет установлен ли NVM, и если это так он использует версию Nodejs из NVM.
  • Также при загрузке плагина, он генерит автокомплиты для текущей используемой версии Nodejs в вашем проекте.
  • Теперь при загрузке плагина, он автоматически устанавливает зависимости для инструментов внутри плагина: doc_builder.js и uglify_js.js. Раньше надо был послу установки вручную запускать npm install
  • Плагин в ядре, теперь распознает разные версии Nodejs. На момент рефактора 6 ветку Nodejs и 8 ветку, также известные как LTS и current stable.
  • Настройки плагина теперь открываются в стиле Sublime Text 3, используя команду edit_settings. Слева настройки по умолчанию, справа настройки пользователя.
  • Команды плагина теперь активны (могут быть запущены) для буферов/файлов, имеющих тип source.js
  • Такс. Какой самый важный инструмент любого разработчика? Вы правы! Это — отладчик.

Отладчик


В предыдущих версиях плагина, команда Nodejs Debug (+ arguments) запускала текущий файл с параметром debug переданных node. Это было бесполезно. Начиная с версии Nodejs 6.3.0, поддерживается отладка, используя отладчик Chrome DevTools. Более подробно об этом можно прочитать в блоге Пола Айриша.

Теперь, когда вы запускаете команду Nodejs Debug (+ arguments) текущий файл будет запущен с параме��ром --inspect=localhost:60123 --debug-brk для 6-ой версии Nodejs и с параметром --inspect-brk=localhost:60123 для 8 версии. Как вы можете заметить отладчик запускается на порту 60123 не конфликтующим с портом по умолчанию — 9229.

Далее, вы можете подключиться в отладчику, используя шаги выводимые плагином:
Debugger is successfully started at localhost:60123.

1. Now you can open Google Chrome and navigate to chrome://inspect.
2. Then click Open dedicated DevTools for Node.
3. After click Add connection and add connection to localhost:60123

Что должно быть сделано


  • Воссоздать функционал консольного отладчика Nodejs используя модуль — sublime-pexpect, который я недавно добавил на packagecontrol.io
  • Следить за процессами запускаемыми плагином и убивать только их в _kill_node_processes(). Для этих целей необходимо использовать другой модуль sublime-psutil, который в скором времени тоже появится на packagecontrol.io
  • Запускать текущий файл в терминале