PokéProject: от статического HTML до React и Nuxt.
Это история моего пути разработки с PokéProject. Надеюсь, это не полная история, и в будущем еще предстоит рассказать еще много чего. Это не рассказ об идеальном жизненном цикле разработки, и я уверен, что если бы я снова начал этот проект с нуля, было бы сделано изрядное количество альтернативных вариантов.
Готовый? Поехали.
Идея 💡✨
Первоначальная идея PokéProject заключалась в том, чтобы использовать классические игры про покемонов моего детства в качестве вдохновения для кодовых имен в моих проектах на работе, как своего рода ностальгическую инъекцию веселья в повседневную рутину.
Кодовые имена проектов - довольно важная вещь в MMT Digital - каждая проектная команда выбирает себе кодовое имя в качестве связующего звена во время первого спринта - и часто доходят до того, что поддерживают это с помощью сувениров ограниченного выпуска, таких как фирменные кружки, футболки или аналогичные предметы. Одна из этих стартовых встреч по проекту вдохновила меня на идею, и с тех пор она обрела форму.
Технический подход 🤔
Я в первую очередь Front End разработчик и предпочитаю JavaScript. Для самой первой версии PokéProject я решил, что все, что мне нужно, это статический HTML, CSS и простой ванильный JavaScript. Никаких фреймворков, никаких шаблонов Bootstrap и, конечно же, ничего, что могло бы отвлечь меня от основной цели проекта - генерации кодовых имен.
Плато прогресса 📉
Этот простой, свободный от фреймворков подход сослужил мне хорошую службу вначале и даже дал мне достаточно времени, чтобы писать код и писать о моем коде в блоге, но в конце концов я перестал каждый раз добиваться достаточного прогресса, так что регулярное документирование этого пути казалось целесообразным. Всего я успел написать 8 постов, прежде чем дошел до этого.
После этого начального этапа иметь что-то достаточно существенное, о чем можно было бы писать в том, что, по сути, составляло несколько часов разработки каждый день, становилось слишком хлопотно, и я перестал писать об этом, даже когда разработка продолжалась.
Необходимость восстановления
По сути, это была первая фаза разработки - создание и запуск прототипа приложения. Второй этап - это когда мы развиваем идею и начинаем крупномасштабную реконструкцию, чтобы сделать вещи более крупными и лучшими.
Когда я говорю большие и лучшие вещи, я говорю о нескольких ключевых функциях, которых, как мне казалось, не хватало в PokéProject, и которые ограничивали его шансы на успех. В первую очередь это были:
- Интеграция с социальными сетями.
- Ремонтопригодность и долгосрочная масштабируемость исходного кода.
- Ограничения моего решения для маршрутизации URL-адресов и сложность его развертывания и обслуживания.
- Размер загрузки веб-сайта и его источников данных.
Сосредоточившись больше на прототипе и избегая незнакомых фреймворков, становилось все более очевидным, что я трачу гораздо больше времени на разработку решений, которые уже были решены другими, а не на разработку собственных уникальных функций приложения.
Статический HTML
Статический HTML в конечном итоге быстрее, чем что-либо, динамически генерируемое на стороне сервера. Сервер разработки PokéProject использует NGINX для обслуживания статического HTML, он быстрый и масштабируемый. Предыдущий опыт подсказывает мне, что проблем с нагрузкой или потреблением ресурсов не возникнет - если мы получим достаточно трафика, чтобы вызвать проблемы, это не будет NGINX, который откажет первым.
Настройка, на которую я пошел, была очень малобюджетной - весь мой «веб-сайт» представлял собой один файл index.html, который NGINX был настроен для обслуживания по умолчанию, когда файл, на который имеется прямая ссылка, не существует на сервере. Независимо от запрошенного URL-адреса будет возвращено то же содержимое файла index.html, и клиентский JavaScript оценит свойство window.location, чтобы определить, какой контент отображать на экране. Малобюджетный, полностью индивидуальный подход к маршрутизации URL-адресов - простой, но эффективный. Или изначально работал.
Проблемы со статическим HTML
Проблемы со статическим HTML действительно начали проявляться, когда я захотел продвинуть PokéProject в социальную сферу и упростить совместное использование контента на таких платформах, как Twitter и Facebook. При добавлении ссылок на эти платформы они запрашивают данные о связанной странице и используют их для предварительного просмотра ссылки. Проблема в том, что мои статические HTML-страницы - это, по сути, один и тот же HTML-файл, обслуживаемый в ответ на любой URL-запрос, и содержимое оценивается и отображается на стороне клиента на основе содержимого, что далеко не идеально для этих предварительных просмотров веб-сайтов на основе сервера. Мне действительно нужен был другой, подходящий HTML-код для обслуживания каждого URL-запроса - по сути, мне нужен был рендеринг на стороне сервера.
Вариант 1. Более статический HTML
Один из вариантов, который был открыт для меня, заключался в идее предварительного рендеринга моего статического HTML, создания одноразовой задачи для автоматического создания целой загрузки HTML-файлов с разным содержимым.
В определенной степени я уже делал что-то подобное - для первой версии интеграции карт Twitter мне нужно было создать актуальные версии рендеринга холста в формате JPG, поэтому я создал сценарий для одноразового создания карты 721 Pokémon. было необходимо для его поддержки, но создание потенциально тысяч копий статических HTML-файлов в соответствующих структурах URL-адресов казалось неправильным, не в последнюю очередь потому, что время, необходимое для их обновления на сервере для каждого выпуска, было непомерно высоким.
Другой альтернативный вариант, который я выбрал, заключался в дальнейшем исследовании идеи построения PokéProject в надлежащей структуре, в идеале с поддержкой серверного или «универсального» рендеринга.
Частично мое решение здесь было основано на том факте, что я хотел использовать фреймворк. В целом неразумное бизнес-решение - делать ставку на то, чего вы не понимаете, когда есть вполне жизнеспособная альтернатива, но я все равно сделал это, главным образом потому, что раньше я не использовал React, и я хотел это изменить.
✨Принятие React✨
React - это библиотека рендеринга представлений на основе компонентов, а теория и размышления, заложенные в ее концепцию, делают ее действительно привлекательной для использования библиотекой.
Как только я начал, было действительно легко преобразовать мой индивидуальный, автономный код JavaScript в компоненты React, и когда они у меня появились, стало поразительно легко использовать, повторно использовать и смешивать эти компоненты вместе, чтобы начать изучение множества новых направлений для моего применение.
Проблемы с React
Проблема заключалась в том, что мое готовое приложение React не поддерживало рендеринг на стороне сервера, что было своего рода основной причиной его внедрения.
React очень популярен, и в результате доступно множество руководств для начинающих и проектов начальной загрузки. И я имею в виду массу. Есть даже веб-сайт, посвященный тому, чтобы помочь вам найти устройство с необходимыми функциями. Я выбрал первый, который нашел доступным, и в итоге остался без универсальной поддержки рендеринга, в которой я действительно нуждался в первую очередь.
Нет проблем, - подумал я и выбрал другой. Большая часть структуры была той же, и я провел вечер, портируя код, только чтобы обнаружить, что этот шаблон использует React и Redux. Redux - это совсем другое дело - они даже советуют не брать их сразу сразу на своем сайте. Прыгнул вперед во времени и потратил еще несколько дней, пытаясь понять, как это работает, а у меня до сих пор нет приложения React с содержимым, отображаемым на стороне сервера, поэтому я в отчаянии вернулся к исследование стартовых шаблонов React для одного, который: а) достаточно простой для понимания без большого количества чтения документации и б) поддерживает рендеринг на стороне сервера, горячую перезагрузку модуля и все остальное, что, по моему мнению, должно быть в проекте.
К этому моменту я потратил почти столько же времени, пытаясь понять React и получив шаблон, который просто работает, сколько я потратил на разработку ядра приложения. Я хочу работать над функциональностью своего приложения, а не над скучными вещами, такими как настройка и настройка - в этом весь смысл принятия фреймворка, абстрагируясь от унылых, обыденных деталей разработки.
Признавая поражение
Я попробовал React, потому что он предлагал компоновать мой исходный код, давал мне надежную библиотеку маршрутизации URL-адресов, заставлял меня лучше организовывать исходный код и предлагал рендеринг на стороне сервера, но все, что я действительно сделал, это реализовал React, как я понимал, это было более общий термин для целого ряда библиотек, ни одна из которых не казалась мне достаточно интуитивно понятной для понимания.
Поиск Vue.js
Vue.js был технологией в моем периферийном зрении какое-то время, и я действительно начал снова смотреть на нее после моих неудач с React. Возможно, неправильно любить технологию, основанную исключительно на бренде веб-сайта, но это тоже есть. При рассмотрении технологии я не начинаю с документации, я начинаю с примеров кода, и меня быстро перенаправили в проект Nuxt, потому что он рекламировал рендеринг на стороне сервера.
✨Принятие Nuxt✨
Мой опыт работы с Nuxt был значительно лучше, чем с React. С самого начала примеры приложений, доступные на GitHub, просто работали и были достаточно простыми, чтобы я мог разобраться без дальнейшего чтения и по-прежнему предлагать все необходимые мне функции. Почему-то он стал более интуитивно понятным, чем когда-либо был React.
В буквальном смысле я смог найти, загрузить, установить и иметь рабочий локальный сервер разработки и производства, работающий как доказательство концепции с API на основе Express, разделением кода веб-пакета, горячей перезагрузкой модуля и всем остальным менее чем за час. Учитывая, что я не смог достичь того же результата за две недели разработки с помощью React, я довольно быстро подсел на Nuxt.
Возможно, это потому, что сообщество намного меньше, или, возможно, Nuxt в конечном итоге менее гибок, чем React, но кажется, что есть один способ, и только один способ решить проблему - и я доволен этим. У Nuxt есть примеры для каждой функции, которая мне нужна, и я не чувствую необходимости подвергать сомнению подход или архитектуру, потому что они работают. Кажется, что он скрывает от меня больше технических деталей веб-сайта и автоматически генерирует основные части приложения, но это не было проблемой - это означает, что я могу больше сосредоточиться на своем приложении и заставить свои уникальные вещи работать , и забудьте обо всем остальном.
С тех пор я полностью заменил PokéProject версией на основе Nuxt и очень рад тому, что готовит будущее.
Первоначально опубликовано на www.psyked.co.uk 10 апреля 2017 г.