Как правильно подружить Vue и php?

Есть базовый MVC-движок на PHP (все запросы апач забрасывает на index.php), который занимается маршрутизацией и обработкой данных. В тех случаях, когда нужно вернуть страницу, хочу прикрутить возможность использования vue-шаблонов. Суть проблемы такова, что маршрутизация у меня возложена именно на PHP, а vue выступает сугубо в роли небольших компонентов на разных страницах, а я просто понятия не имею, как правильно оформлять сборку vue при таком подходе.

Понятное дело, что мне хочется просто цеплять какой-то js файл к странице (.php) через "script", но я так и не понял, как его нынче собирают. Да, есть самый простой метод в лоб через CDN, но это уж как-то совсем просто. Попытался поломать голову с VITE, но, честно говоря, я более мусорной документации в жизни не видел, а хоть каких-то гайдов от экспертов я не нашёл. Я в курсе про Laravel, но сейчас я просто учусь и хочу самостоятельно понять, как подобные штуки можно реализовывать.
  • Вопрос задан
  • 823 просмотра
Решения вопроса 1
delphinpro
@delphinpro Куратор тега PHP
frontend developer
а vue выступает сугубо в роли небольших компонентов на разных страницах

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

В main можно писать весь фронт сайта, или модульно импортировать.
Туда же подключается вью и компоненты ваших виджетов

import Vue from 'vue';
import Calculator from './calc/Calculator.vue';


На странице, где нужно вставить компонент пишем нечто вроде

<div class="calc"></div>

Сюда будет рендериться компонент в рантайме. Например так (в том же main.js)

document.querySelectorAll('.calc').forEach(el => {
    new Vue({
        el    : el,
        render: h => h(Calculator, {
            props: {
               /// Пропсы, если надо
            },
        }),
    });
});


То есть каждый виджет в этом случае будет независимым vue приложением.

Если нужно передавать в компоненты какие-то данные, то можно научить компонент самому их запрашивать. Но тут придется отдельные роуты создавать. Или прямо на страницу в head выплевывать их в виде json

<script>window.calcData = <?= json_encode($calcData) ?>;</script>


а в компоненте по mounted их доставать

mounted() {
  const d = window.calcData;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы