Долгое вступление и установка UI библиотеки + tailwind
Хороший дизайн сайта это уже половина дела. Ведь, если подумать, только его работа и видна. Вся та работа, которая совершается на сервере для конечного пользователя не важна. Важно то, что в итоге этой работы было совершенно нечто полезное для него и при этом функционал сайта легко читался и был не вырвиглазным.
После прочтения данной статьи у тебя получится что-то вроде этого.
Десктопная версия
Мобильная версия
Я на своём опыте знаю, что дизайн это мастхев в наши дни. А для разработчика ещё важнее то, как этот дизайн делать и улучшать. И скажу я тебе мой дорогой читатель, заниматься этим на чистом JS и CSS это та ещё задачка.
Взять к примеру этот сайт. Он написан на чистом JS(ну окей, ещё и jQuery) и CSS. Поддерживать его тот ещё гемор, а добавить какой-нибудь новый компонент(типа приближение изображения, которое я до сих пор не сделал) вообще подвиг. Поэтому, в этом проекте (SearchResultParser) я буду использовать уже готовую UI библиотеку.
Я буду использовать MaterialUI + tailwindcss для более гибкой настройки стилей сайта, без необходимости залазить в CSS файлы. И будем использовать axios библиотеку для общения с сервером.
Итак, установим их:
TailewindCSS нужно ещё настроить для его работы. Это создаст настроечный файл для него:
В Frontend/tailwind.config.js вставьте следующий код.
В нём описано, к каким файлам применять данное расширение.
Также не забудь создать входной и выходной файл. В моём случае первый называется index.css, а другой zero.css. Первый в директории Frontend/src, другой в Frontend/static/css. Во входном файле достаточно вставить несколько директив:
И теперь, чтобы стили были применены необходимо запускать следующую команду каждый раз, когда изменяем файлы в которых используем tailwindcss, будь то html или js. Можно добавить —watch чтобы не перезапускать её каждый раз.
TailwindCSS установлен и настроен. Теперь настроим axios. Тут всё довольно просто в файле package.json добавь следующую строку:
Настройка маршрутов и представлений django
Скажу сразу, у меня не будет много маршрутов. Ибо, этот сайт это в первую очередь приложение, их ещё называют SAAS. У моего saas будут следующие маршруты/представления:
main: страница главного приложения, пользователь большую часть времени будет проводить здесь.
about: страница на которой я расскажу об этом проекте
contacts: страница с контактными данными, моими
Вот, собственно говоря, и всё, теперь добавим эти представления и маршруты к ним. Добавим маршруты, в Frontend/urls.py:
Напишем представления( в файле views.py), пока просто для галочки, чтобы django не ругался:
Это наша база. Больше, в этой статье, мы не вернёмся к django. Будем верстать, верстать и ещё раз верстать.
Верстка базового макета и его компонентов
Подготовка к работе, запуск сервера
Чтобы начать верстать и видеть результаты нашей работы, нужно будет запустить несколько команд в терминале. Во-первых, для того чтобы TailwindCSS мог сгенерировать для нас стили. Во-вторых, чтобы уже React успевал собирать компоненты.
Для генерации CSS стилей, tailwindcss:
Флаг -i для входного файла
Флаг -o для выходного файла
Также нужно указать аргумент —watch, чтобы не запускать данную команду каждый раз, когда начнём использовать новые стили. Для компиляции и генерации JS, React:
Здесь, мы запускаем ранее записанный скрипт в Frontend/package.json. Можно конечно и без скрипта, вот так:
Остаётся только запустить Django-сервер, открыть вкладку и начать писать код.
Работа с django шаблонами
Создадим базовый шаблон, base.html в Frontend/templates/Frontend. Откроем его в текстовом редакторе и вставим следующий код:
Сначала, мы загружаем значение глобальной переменной static, чтобы иметь доступ к CSS, JS, JPEG, PNG, SVG и прочим медиафайлам на нашем сервере.
Этот файл, как я называю их, базовики, эти шаблоны не рендерятся на прямую, их основная роль это быть скелетом/основанием/базой для других шаблонов. Например, этот сайт, на котором размещается эта статья, имеет следующие базовики:
base.html (Базовый интерфейс)
base_post.html (Основа для любых постов)
base_article.html (Основа для статей, как этой)
base_post_list.html (Основа для пагинаторов )
И чтобы шаблон, который унаследует базовика, мог его модернизировать и добавлять что-то свою нужно добавить специальные блоки. В данном базовике их 4:
head (Для меты тегов, стилей, и начальных скриптов)
header (Для модификации главного меню)
main (Для разного конента)
scripts (Только для скриптов)
Все эти блоки выглядят примерно так:
Теперь, когда мы разобрались с тем как данный шаблон устроен нужно сделать так, чтобы этот шаблон унаследовали следующие шаблоны:
about.html
contacts.html
app.html
Шаблон app.html:
Вот пример шаблона about.html
Шаблон для contacts.html идентичен выше написанному шаблону, с той лишь разницей, что у них отличаются тайтлы, канонический адрес и описание.
Одними шаблонами сыт не будешь, нужен React. Причём использовать его нужно окуратно. В чём дело? Ты мог заметить, что у меня есть специальные элементы с айдишниками header и footer и рядом с ними их аналоги, meta-header и meta-footer. Почему я так сделал? Почему бы не отрендерить всё в одном блоке через react ?
Причиной этого является то, как react и django рендерят страницы. Если react отдаёт рендеринг пользовательской машине CSR, то django занимается этим сам, на сервере SSR. Ну и что? Какая разница, кто что рендерит. Главное рендерит.
Разница всё-таки есть. И она особенно заметна для поисковиков. Поисковой робот, краулер, зайдёт на страницу отрендеренной django и сможет увидеть все ссылки и контент сайта. Но если всё тот же краулер зайдёт на страницу отрендеренной React-ом, он ничего не увидит, посчитает страницу либо бесполезной, либо не доделанной и уйдёт. То есть, для SEO это имеет критическое значение.
И поэтому у меня есть это meta-* элементы. Они отрисовываются django и доступны поисковикам. Реакт эти элементы подхватывает и обрабатывает. Закончили с HTML перейдём к JS и React коду.
Работа с React элементами
Создадим необходимые элементы и файлы. Нам их потребуется 4:
Header.js (Шапка и меню нашего сайта)
Footer.js (Футер сайта)
MobileAppBar.js (Шапка и меню только для мобильной версии)
LangSwitch.js (Переключатель языка)
Начнём с самого сложного элемента нашего сайта, header.js, это его шапка. Код достаточно объёмен, но по сути своей он берёт отрендереную django информацию и формирует из неё либо горизонтальные (Десктопная версия), либо вертикальные (Мобильная версия) кнопки. Вот и всё.
Ну и если это мобильная версия, он эти кнопки оборачивает в боковое меню. Потому что мне оно больше всего нравится. А вот и код:
В этом компоненте мы используем два других, это LangSwitch и MenuAppBar. В MobileAppBar.js:
В LangSwitch.js:
Компонент LangSwitch, не такой уж и большой. Большую часть пространства занимает настройка SVG изображений. Сейчас он, правда, не рабочий, то есть языки не переключает. Но это потому что мы ещё не настроили django для этого. Это будет в другой раз. Ну а пока имеем просто рабочий переключатель.
Осталось лишь рассмотреть компонент Footer в Footer.js:
Изначально, я планировал добавить туда много-много ссылок, но мне стало лень, да и зачем там ссылки? Только лишняя нагрузка на восприятие пользователя. Поэтому оставил лишь одну ссылку на себя любимого)
Ну и конечно не забываем подключить наши компоненты Header и Footer в index.js:
Верстка главной страницы и её компонентов
Процесс работы пользователя с приложением
Итак, мы переходим к самой тяжёлой части этой статьи. По крайней мере, она самая большая. Я даже думал разделить эту статью, но не сделал этого по причине потери целостности. Как вообще будет выглядеть процесс работы пользователя с приложением?
Пользователь открывает сайт.
Нажимает добавить, плюсик.
Выбирает необходимые движки.
Заполняет поля.
Настраивает парсер.
Запускает его в работу.
В качестве результата работы, пользователь получит ссылку на скачиваемый файл.
Django-шаблон приложения, app.html
А теперь к приложению и коду. Давай немного изменим шаблон app.html чтобы можно было легко с ним работать из реакта.
Из шаблона можно заметить что моё приложение разбито на несколько независимых частей. Это настройки(id=”app_settings”), таблица запросов и движков(id=”engines” + id=”queries”), утилиты(id=”app_utils”) и действия (id=”app_actions”).
Хочу отметить блок meta-engines. Здесь я написал вручную все движки которые собираюсь парсить, но в будущем этот блок будет заполняться django (джангом?). Просто в будущем я возможно захочу добавить другие движки или убрать старые и лучше делать это на сервере.
React компоненты приложения
Приложение разбито на 4 части + ещё два компонента:
AppSettings.js
AppUtils.js
AppActions.js
AppQueries.js
Waiter.js
Msg.js
Создай их в src/components и перейдём к их разбору.
Компонент AppSettings.js. Это просто группа переключателей с чекбоксами для настройки работы парсера. Нужно отметить, что выбранные данные сохраняются в так называемом атрибуте data. Дабы дальше можно было легко их достать из другого приложения, AppActions.
Компонент AppUtils.js. Он реализован при помощи связки, кнопка→нижний слайдер → модальное окно. И на каждом из этапов будут делаться запросы на сервер, чтобы получить необходимые пресеты.
Компонент AppActions.js. Состоит только из двух кнопок, сохранения пресета и запуск парсинга. Здесь же, мы собираем данные из других приложений, здесь же проверяем их на правильность и здесь же отправляем их на сервер.
Компонент AppQueries.js. Получение доступных к парсингу движков и создание таблицы движок-запрос. Изначально я планировал его сделать таким образом, чтобы пользователь добавлял движок, потом добавлял к нему столько запросов сколько бы ему хотелось. Но потом я понял что можно это всё реализовывать гораздо проще и через одну кнопку.
И ещё, тебе потребуется иконки для всех движков. Нужно будет скачать этот архив и распаковать его в папке Frontend/static/img
Компонент Waiter.js. Существует только для того, чтобы показывать пользователю, что сервер сейчас занят работай и нужно немного подождать. Он же управляет отображением сообщений об успехе или неудаче при работе сервера.
Компонент Msg.js. В этом файле идёт подготовка(отрисовка) определённого блока к тому, чтобы быть заполненным информацией о результатах работы сервера. Управляется через Waiter компонент.
Осталось только подключить все эти компоненты в index.js:
Другие страницы и разделы сайта.
Такие страницы как, about и contacts я не буду так же подробно освещать. Почему?
Это общие(я бы даже сказал, стандартные) страницы. И в основе своей они будут статичный, там не будет никакого реакта. Они никак не влияют на основной функционал сайта. И просто, смысл показывать что я там написал? Или что важнее, что рассказывать? То какой шрифт я использую, или какие отступы делаю?) Вот.
Выводы и заключение
В этой статье я рассказал и показал как можно сделать фронтенд часть сайта, используя React и Django + MaterialUI, чтобы не изобретать колёса заново. TailwindCSS, чтобы приобрести максимальную гибкость в стилизации элементов страницы (ну ладно, чтобы не лезть в css файлы :)).
Вообще, фронтенд для меня всегда был самой тяжёлой частью в разработке, ну не моё это. Сделать что-то функциональное и работающее это да, это я могу. Но сделать это красивым и стильным, тут я кончаюсь. Ты наверняка знаешь эту аналогию фронтенда и бэкенда.
Так вот, у меня наоборот. В любом случае, с самой тяжёлой частью мы покончили и дальше будет только легче. Добавим интерактивный туториал, поддержку нескольких языков, бэкенд в конце концов и аутентификацию пользователей.
Если ты пропустил всё что было выше и хочешь просто готовое-к-использованию решение, то ты можешь скачать его здесь. Это архив с настроенной структурой директорий и готовыми зависимостями. Всё что тебе остаётся сделать, так это скачать, создать виртуальное окружение, установить все необходимые python и npm пакеты.
В этой статье ты узнаешь как создать Django приложение и настроить его для работы с React JS чтобы получилось полноценное фулстак приложение. Так же в статье приведено видео-туториал и скачиваемые …
В этой статье ты узнаешь как добавить туториал для новоприбывших пользователей используя React, с возможностью указывать к каким элементам относятся подсказки и количество этих подсказок, последовательно
В этой статье я опишу процесс интеграции allauth к django проекту. Весь фронтендом на react. Я настрою регистрацию и авторизацию пользователей через пароль, плюс подтверждение почты и возможностью восстановления пароля. …
Как развернуть django-сайт на хостинге (или VPS) от reg.ru. Так же, как создать и настроить БД(в том числе и используя кластер в рег облаке). Настроим переадресацию на HTTPS, будет показано …
Использованные термины
Django шаблон ⟶ Это текстовый документ, который размечен специальным ситнаксисом для вставки кода в него.
Django модель ⟶ Это менеджер баз данных во фреймворке Django. Реализованно в виде класов и наследования в Python
TailwindCSS фреймворк ⟶ Это CSS-фреймворк с открытым исходным кодом, созданный Адамом Уэтеном и поддерживаемый Tailwind Labs. Особенность этой библиотеки в том, что, она не предопределяет CSS-классы отдельных элементов. Вместо этого она предоставляет служебные классы, которые можно объединять для стилизации каждого элемента
Реакт ⟶ Это библиотека JavaScript, разработанная Facebook для создания пользовательских интерфейсов, в частности, для одностраничных приложений. React позволяет разработчикам создавать компоненты, которые могут эффективно обновлять и рендерить при изменении данных.
Реакт компонент ⟶ Это независимый, переиспользуемый фрагмент кода, который отвечает за определённый участок пользовательского интерфейса (UI). Компоненты могут быть созданы как классовые, так и функциональные.
Релевантные вопросы
Какие существуют основные принципы ООП?
Базовые принципы ООП включают в себя абстракцию — отделение концепции от ее экземпляра, полиморфизм — реализация задач одной и той же идеи разными способами, наследование — способность объекта или класса базироваться на другом объекте или классе.
Как отключить эффект ряби глобально?
Эффект ряби исходит исключительно от компонента BaseButton. Вы можете отключить эффект ряби глобально, указав соответствующее значение в своей теме.
Как отключить переходы глобально?
Material UI использует тот же помощник темы для создания всех своих переходов. Поэтому вы можете отключить все переходы, переопределив помощника в своей теме.
Когда следует использовать встроенный стиль, а когда CSS?
Используйте встроенные стили для динамических свойств стилей. Альтернатива CSS обеспечивает больше преимуществ, таких как автоматическое добавление префиксов, улучшенная отладка, медиа-запросы, ключевые кадры.