Как фронтить под PHP фреймворки: личный опыт frontend-разработчика

Всем привет! Меня зовут Андрей, я frontend-разработчик компании Creative. Сегодня хочу разобрать вместе с вами довольно необычную тему и рассказать о своём личном опыте работы со стеками Laravel+Vue в рамках одного проекта. Но сначала – небольшая предыстория.

Как фронтить под PHP фреймворки: личный опыт frontend-разработчика

До момента, как к нам попал проект с такими стеками, я никогда не использовал Vue внутри blade-шаблонов. Поэтому, можно сказать, что это был мой первый опыт подобной работы. Проект был связан с разработкой интернет-магазина, и такая связка стеков нужна была для реализации SSR.

SSR или Server-Side Rendering – это технология рендеринга на стороне сервера, которая позволяет получать доступ ко всем необходимым данным для построения страницы на сервере.

Статья будет разбита на 4 части:

1. Проблема реактивности Vue.

2. Почему переиспользование компонентов нельзя делать через их разрушение.

3. Проблемы вложенных компонентов.

4. Настройка mix файла (сборщик Laravel).

Проблема реактивности Vue

Думаю, первое, о чём стоит сказать, – это вставка каких-либо данных из Vue в blade. Это не так-то просто, потому что blade не может сходу реагировать на изменения, переданные ему простым js из коробки. И поэтому мы с вами вынуждены делать всё через привычные

document.getElementById(‘id’).innerText=”text”

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

Иллюстрация 1
Иллюстрация 1

Ещё в рамках этого пункта хотелось бы разобрать момент с открытием сайдбара. Он у нас находится на одном уровне с main-layout’ом сайта, что существенно усложняет работу. Ниже я привёл пример его открытия и закрытия (илл.2):

Иллюстрация 2
Иллюстрация 2

Сразу оговорюсь: вам может показаться, что мы сделали решение слишком сложным, и да, можно было использовать toggle. Возможно, это было бы правильным решением, но я решил пойти через add и remove, т.к. нельзя открыть и закрыть сайдбар, используя одну и ту же кнопку. Это происходит, потому что он открывается из хедера, а закрывается сам из себя или вложенных в него компонентов. И тут мы переходим к следующей проблеме.

Почему переиспользование компонентов нельзя делать через их разрушение

На практике, когда мы пишем код на чистом Vue, у нас во множестве мест есть конструкция v-if. Она позволяет ремувить наш компонент из DOM-дерева и потом, при необходимости, по-новой его туда монтировать. Удаляется всё самостоятельно.

Но в нашем случае у нас будет целый ряд проблем – начиная с того, что Vue не может понять, когда ему нужно разрушать компонент, заканчивая невозможностью снова смонтировать компонент.

Сейчас объясню, как это обойти, и о чём я вообще говорю :)

Ниже вы можете увидеть пример того, как мы добавляем компонент в DOM-дерево. Сам вызов добавления происходит таким образом (илл.3):

Иллюстрация 3
Иллюстрация 3

Но для того чтобы нам его вставить, нужно в blade-шаблоне добавить блок, в который этот элемент будет вставлять простым div (илл.4):

Иллюстрация 4
Иллюстрация 4

И тут ещё одна проблема, Хьюстон! При разрушении элемента разрушается и его родитель, в который он встроен. И при попытке создать ещё раз элемент, мы получим ошибку, которая сообщит об его отсутствии.

Как мы можем это обойти? Например, вот таким довольно простым способом (илл. 5):

Иллюстрация 5
Иллюстрация 5

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

Казалось бы «ЧТОО?», но всё именно так.

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

  • рендер компонента в момент создания контента и в зависимости от разрешения экрана.

  • навешивание класса open в зависимости от того, открытое состояние или нет.

Проблемы вложенных компонентов

Если вложенный компонент используется без своего непосредственного Vue-родителя в другом месте, он является одновременно самостоятельным и вложенным. Чтобы избежать проблем, описанных в предыдущем пункте, рекомендую воспользоваться уже знакомым порядком действий и для родителя вызвать компонент посредством смены класса.

Настройка mix файла (сборщик Laravel)

Напоследок хочу рассказать вам о том, как webpack.mix.js работает с Vue-файлами. А работает он интересно! При создании компонента нам всегда нужно создавать файл, который включается в себя этот Vue-компонент (илл. 6):

Иллюстрация 6
Иллюстрация 6

Т.к. blade не понимает, что мы хотим в него инклюдить, нам нужно вставлять уже преобразованный файл (илл. 7):

Иллюстрация 7
Иллюстрация 7

Я намеренно не разбирал момент с ajax-запросами и перерисовкой шаблонов в real time, потому что хотел рассказать именно о Vue и его взаимодействии. Поэтому, если у вас есть вопросы по поводу стека и всех вытекающих проблем, буду рад ответить на них в комментариях! На этом у меня всё, с наступающими праздниками всех фронтеров!

2 комментария

Можно ссылку на бэк?)

Комментарий недоступен