До свидания, экспресс-генератор и здравствуйте, экспресс-сэр!

На своем пути к разработке я всегда нажимал кнопку лени. Lazy — это то же самое, что и Dudeism. Плывите по течению и расслабляйтесь, пока ваш начальник не начнет орать на вас из-за чертовых крайних сроков.

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

Не бойся, мой храбрый товарищ. Здесь, в Chaos Company Unlimited, мы прикроем вашу спину.

Представляю вам краткую версию этого туториала (tl;dr):
https://www.npmjs.com/package/express-sire

Идите туда, используйте его и ускорьте скелет своих проектов Node.js. Оставляйте отзывы, комментарии и гнев на странице GitHub (или нет, будьте сами себе хозяином МУАХАХАХА).

Длинный рассказ также называется:

Волшебник, революционер и рисовальщик

Когда я был ребенком… шучу.

На дворе 2009 год, и товарищ по имени Райан сыт по горло тем, как обращаются с JavaScript. Множество хулиганов из своих высокораздутых ООП-замков, кидающих камни и говорящих: Ява? — Сценаристы, пожалуйста. Отбросы. Заслуживают смерти, не меньше

Они поют на всех углах с небольшим чувством гордости. Уже нет. Волшебник в Google создает мощный движок. В далеком будущем это имя двигателя будет крестить автомобили.

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

Он быстро хватает документы на двигатель и начинает развивать свою революцию. Со временем, к его удивлению, к его делу присоединятся миллионы, и он будет отвечать за создание огромного батальона. Батальон узла. К черту Node.js. По мнению многих историков, величайший батальон всех времен.

В таверне, через несколько часов, у нового дизайнера черных искусств будет время проявить себя. Он присоединится к армии Райана и поможет этому наивному крестовому походу, он будет отвечать за приличную часть побед и славы батальона Райана.

И его имя:
TJ Holowaychuk. (Пауза, мне приходится каждый раз гуглить, чтобы правильно подобрать это имя).

Убили, прокляли и бросили потом свой батальон, но не в этом дело…

Node — это среда выполнения, на которой работает все. И на этом пока все... (Дено и Бан смотрят)

Вернуться к TJ

TJ создал тысячи пакетов(небольшое преувеличение для увеличения повествования), таких как express.js, commander.js, стилус, koa и так далее.

Парень был настолько плодовит, что люди задавались вопросом, не является ли он командой, а не личностью. Он начинал как дизайнер с уровня новичка, чтобы стать единственным в своем роде разработчиком.

Это живое доказательство того, что при самоотверженности можно достичь всего. (Чушь. Вы не можете. Но давайте придадим этому тексту обнадеживающую атмосферу).

Наш приятель создал и наш любимый экспресс-генератор. Что это делает?
(Видите? Я сказал, что вы не можете получить доступ ко всему). Он создает веб-сервер с экспресс-платформой. Легкий и простой сервер создается быстро.

Экспресс-генератор генерирует файлы для вас. Генерирует веб-сервер для вас. Он генерирует весь шаблонный код, поэтому вам не нужно вводить и создавать файлы и настраивать все с нуля.

Отсюда можно подумать о логике. Бизнес. Собственно код. Вместо того, чтобы настраивать вещи. Это достаточно просто, чтобы не заставлять вас писать определенным образом или просматривать гигантскую документацию, чтобы вы могли научиться генерировать «правильный путь». (Предназначена критика)

Это хорошо, потому что express хорошо и просто. Поэтому он генерирует больше простых. Это хорошо для начинающих и хорошо для опытных разработчиков.

Что случилось потом? Почему вы создали экспресс-сир?

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

Я посмотрел на решения там. Как настоящему разработчику JavaScript, мне это не понравилось. Нет. Они не хуже моих. Они, вероятно, намного сложнее, чем то, что я сделал, и поэтому мне нравится то, что я сделал, даже больше.

Я посмотрел на йомен и экспресс-услуги здесь, и ничего не соответствовало моим критериям, а именно:

  • Будь простым.
  • До настоящего времени.
  • Простой
  • Глупый
  • Я сказал просто?
  • О, работа, как блок лего, тоже обязательна.

Вы бы выбрали, что вы хотите установить. Если ты хочешь так, ладно. Если ты так хотел, то ладно. Я хочу это с тем и этим. Ладно, понял.
Вот и вся идея. Предоставить «генератор кнопок, который позволит вам выбирать, какие вкусные ингредиенты вы хотите».

И достаточно просто и глупо, как экспресс-генератор. Итак, я отправился туда за мудростью. О, мальчик. Становится интересно…

Шаги в построении

Дело в том, что express-generator устаревает. И code стареет. Он получает наследие. Поскольку он не так успешен, как должен, 9 000 еженедельных загрузок против 21 000 000 (экспресс), он не придерживался текущей практики.

Он по-прежнему использует шаблоны и чистый/необработанный/старый SSR. В эпоху SPA, SSG, современной SSR и микро-интерфейсов старый способ с шаблонами больше не используется.

По-прежнему используется CJS (CommonJS). Нода и пакеты переезжают в ESM. Это неприятный и болезненный процесс, но тем не менее он идет, и ничто не может его предотвратить. Язык JavaScript развивается (к лучшему или к худшему), и каждый год внедряются новые методы.

Он не предлагает блок лего. Это минималистский, и я люблю этот простой инструмент. Но я жадный и ленивый и хочу, чтобы все делал компьютер, чтобы я мог получить признание.

Со всем этим я пошел и создал мутированную версию этого минимального инструмента.

Я хотел создать так же, как экспресс-генератор. Он создает шаблоны, делегируя некоторые «параметры» механизму шаблонов, в данном случае EJS.

EJS – это простой язык шаблонов, который позволяет создавать HTML-разметку с помощью простого JavaScript. (источник)

Файл шаблона (app.js.ejs) внутри модуля экспресс-генератора будет выглядеть так:

Хотя EJS используется для создания файлов HTML, стратегия здесь заключается в использовании тех же шаблонов, но для создания файла .js. Элегантное и отличное решение в то время. В настоящее время это кажется выключенным.

EJS использует метод render для рендеринга, анализа и всего остального, и это большая библиотека. Он использует много регулярных выражений и функций, а также if и else, и это сложный способ создания файлов. Особенно в мире Шаблонных литералов.

Примечание. Я не говорю, что EJS — это плохо. Это далеко не так. Я говорю, что для нашей задачи это перебор.

Ничего из вышеперечисленного нам не понадобилось. Встроенная функция JavaScript увлекла бы нас и доставила сообщение. Идея состоит в том, чтобы создать файл из этого мощного волшебства (шаблонных литералов), и у других тоже была такая же концепция (здесь, здесь и здесь).

Теперь, когда литералы шаблонов являются выбором, нам нужно определить, как лучше всего «разобрать» строковый шаблон в реальный объект JavaScript. Были придуманы некоторые стратегии.

Первый подход. Требуется файл:

Второй подход. Комбинируя его с регулярным выражением:

Третий и последний. Использование оценки:

Вы можете догадаться. Я выбираю эвал. «Подождите, вы сказали eval?» Ага. Эвал.
«Но..Но.. Эвал — это Э-В-И-Л». Товарищ, избегайте обобщений и читайте ответ выше.

Я внесу ясность:

Хотя запускать JS-код таким образом может быть опасно, если шаблоны — это файлы, которые находятся под вашим контролем и написаны вами. Думаю, это можно сделать.

Так я и поступил. Кроме того, я нашел потрясающее объяснение от Сафии Абдаллы. Она написала короткий, но интересный текст о том, как литералы шаблонов работают под капотом. Не буду спойлерить, так как легко читается и вникает в суть.

https://dev.to/captainsafia/how-do-template-literals-in-javascript-work-under-the-hood-4g2b

Хорошо. Готовы шаблоны. Что еще?

Нам нужно предоставить пользователям интерфейс, чтобы они могли устанавливать или предоставлять команды внутри терминала. Для этого я попытался сохранить минимально возможное количество зависимостей, не изобретая велосипед. Всегда один и тот же подход: меньше работы и простота, дающие большие результаты.

Я просмотрел несколько руководств в Интернете и прочитал кодовую базу экспресс-генератора.

https://www.twilio.com/blog/how-to-build-a-cli-with-node-js

https://medium.com/henriquekuwai/criando-sua-cli-com-node-js-d6dee7d03110 (португальский)

https://www.sitepoint.com/javascript-command-line-interface-cli-node-js/

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

Я сам работал с этими прекрасными библиотеками (как вы можете видеть в package.json)

  • Мел: чтобы были красивые цвета.
  • Inquirer: задавать вопросы пользователю.
  • Фиглет: иметь крутую ASCII-надпись
  • Минимист: для разбора входных аргументов cli.

Я также пытался сделать так, чтобы в пакете не было новых функций JavaScript, чтобы пользователи Node из версии 10 могли принять его и использовать, но это не сработало, как ожидалось, и мне пришлось вернуться к поддержке Node v12.

Пакет также устанавливает вещи, которые я считаю необходимыми, но совершенно необязательными, например:

Я принял несколько решений, связанных с добавлением Prettier в качестве установки по умолчанию. Потому что меня раздражает, что люди до сих пор спорят о вещах, которые я считаю сбросом велосипедов, и форматирование кода — одна из них.

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

Видеть? Я же сказал, что прикрою твою спину. Не бойся дружище. Мы здесь друг для друга.

Ваше здоровье.

Дополнительная (внешняя) литература:

Эффективные многоразовые шаблоны приложений и формирование шаблонов
Начинайте новые проекты быстрее: 10 инструментов веб-разработки для создания шаблонов