javascript

Релиз второй версии плагина Nodejs для Sublime Text

  • понедельник, 4 декабря 2017 г. в 03:12:03
https://habrahabr.ru/post/343750/
  • Python
  • Node.JS
  • JavaScript


Добрый день, друзья! В ноябре 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
  • Запускать текущий файл в терминале