Добрый день, друзья! В ноябре 2016 года я начал играться с плагином Nodejs для Sublime Text. Плагин был маленьким и имел под катом несколько давних и хорошо известных багов.
В те дни я игрался с Nodejs и моим любимым редактором для кода был Sublime Text. По давно проторенной дорожке, я пошел на packagecontrol.io и поискал плагины для Nodejs. Нашелся вот этот. Поставив и поработав, я был очень разочарован, когда обнаружил, что некоторые заявленные фичи плагина не работают, или работают не так как заявлено…
В таких ситуациях, я обычно, иду на страничку проекта на GitHub и изучаю проект на предмет последней активности, чтобы убедиться, что проект не заброшен. Я обнаружил, что последний коммит был в 2013 году. Печалька, подумал я, учитывая, что это был единственный плагин для работы с Nodejs в Sublime Text.
Тогда я подумал… Это две частички технологии, которые мне нравятся, и я всегда хотел контрибьютить в Open Source.
План был прост, фиксить баги, с которыми я столкнусь. С течением времени, я понял, что фикс багов начал доставлять проблемы, из-за монолитной архитектуры плагина, отсутствия тестов и инструментов для отладки.
Как я упомянул ранее, я страдал от отсутствия тестов и инструментов для отладки. Фикс одного баг�� мог вызвать череду других багов. Более того, фикс багов на одних платформах, мог вызвать или оставить баги на других платформах. Тогда, было решено сделать жизнь проще и счастливее. =)
Много чего было отрефакторено, переделано и переосмыслено. Все изменения логически можно поделить на две группы: взаимодействие пользователя с плагином и комфорт разработчика.
Изложу все в виде списка с маленьким пояснениями зачем, как и возможно почему это было сделано.
С помощью всего вышеперечисленного, теперь мы можем фиксить баги или добавлять новый функционал, наслаждаясь процессом.
Итак, мы добрались до самой интересной части — взаимодействие пользователя с плагином. Как и в предыдущей части я перечислю список изменений и причины для этого.
В предыдущих версиях плагина, команда 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.
Далее, вы можете подключиться в отладчику, используя шаги выводимые плагином:
В те дни я игрался с 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
- Запускать текущий файл в терминале
