Vue: публикация приложения на web-сервере Печать
Добавил(а) microsin   

Как известно, при разработке приложения Vue мы используем команду npm run dev [1]. Для компиляции приложения, готового к публикации на сервере, используется команда npm run build:

$ npm run build
> vue-app@0.0.0 build > vite build
vite v7.3.1 building client environment for production... ✓ 38 modules transformed. dist/index.html 0.72 kB │ gzip: 0.39 kB dist/assets/bg_image-vpgTpC8a.png 1,390.04 kB dist/assets/index-DLAiWXh0.css 4.03 kB │ gzip: 1.26 kB dist/assets/index-DyllOI6m.js 100.71 kB │ gzip: 36.84 kB

Для публикации Vue-приложения, собранного командой `npm run dev`, на сайте под управлением Joomla, необходимо понимать разницу между режимами разработки и production. Команда `npm run dev` обычно запускает сервер для разработки с "живой" перезагрузкой и не предназначена для финальной публикации на production-сервере (Debian) .

Вместо этого вам нужно собрать оптимизированную production-версию вашего приложения и правильно интегрировать её в Joomla. Вот пошаговая инструкция для публикации приложения Vue:

Шаг 1. Подготовка production-сборки Vue

На вашей локальной машине или непосредственно на сервере в директории с проектом Vue выполните команду для сборки production-версии. Обычно это:

npm run build

Эта команда создаст папку dist (или аналогичную, в зависимости от настроек), содержащую оптимизированные файлы: index.html, JavaScript и CSS файлы. В отличие от компиляции в режиме dev, здесь не будет сервера с горячей заменой модулей, а код будет минифицирован для максимальной производительности.

Шаг 2. Интеграция собранных файлов в Joomla

Существует несколько способов интеграции Vue-приложения в Joomla. Самый надежный — разместить его как отдельный компонент или плагин, либо внедрить в существующий шаблон.

Через шаблон Joomla:

1. Скопируйте содержимое папки dist (файлы .js, .css и возможно index.html) в директорию вашего шаблона Joomla, например: /templates/ваш_шаблон/js/ и /templates/ваш_шаблон/css/.

2. Подключите ваши скрипты и стили. В файле index.php вашего шаблона добавьте:

// Подключение CSS
use Joomla\CMS\Factory;
$doc = Factory::getDocument();
$doc->addStyleSheet($this->baseurl . '/templates/ваш_шаблон/css/имя_вашего_файла.css');
// Подключение JS (желательно перед закрывающим тегом body) $doc->addScript($this->baseurl . '/templates/ваш_шаблон/js/имя_вашего_файла.js');

3. В том месте шаблона, где должно быть ваше Vue-приложение, добавьте HTML-элемент, который Vue использует как точку монтирования (обычно это `< div id="app">< /div>`).

Через создание пользовательского HTML-модуля:

1. Загрузите содержимое папки dist на сервер в любую доступную директорию, например /media/com_vueapp/.

2. В панели администратора Joomla создайте новый модуль типа "Пользовательский HTML".

3. В поле "Содержимое" модуля вставьте точку монтирования: < div id="app">< /div>.

4. В настройках модуля, на вкладке "Дополнительные настройки", в поле "Пользовательный вывод" или аналогичном, добавьте теги < script> и < link> для подключения ваших CSS и JS файлов из /media/com_vueapp/.

5. Опубликуйте модуль в нужной позиции на сайте.

Шаг 3. Управление маршрутизацией (важно!)

Vue-приложения часто используют режим истории history для "красивых" URL (без `#`). Если ваше приложение использует этот режим, при прямом переходе по любому URL, кроме главной страницы Joomla, сервер Debian будет возвращать ошибку 404, так как не знает, что запрос нужно перенаправить на ваше Vue-приложение.

Решение: используйте режим `hash` в Vue Router (`createWebHashHistory()`). В этом случае URL будут содержать символ `#`, и Vue-роутер будет работать всегда, так как часть после `#` не отправляется на сервер.

Альтернатива (сложная): настроить веб-сервер (Apache/Nginx) на перенаправление всех запросов к определенному пути на ваш `index.html`. Это может конфликтовать с роутингом Joomla и требует глубокого понимания конфигурации сервера.

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

1. Создайте на сервере отдельную папку для приложения. Например myvueapp. Где находится эта папка, не имеет значения. От этого будет зависеть только ссылка для запуска приложения. Предположим, что папка myvueapp создана в корневом каталоге сервера. Тогда приложение будет доступно по ссылке https://домен/myvueapp/.

2. Скопируйте содежимое папки dist, которое было сгенерировано по команде npm run build, в папку myvueapp.

3. Откройте в браузере ссылку https://домен/myvueapp/. Вы должны увидеть ваше работающее приложение.

Конечно, скорее всего сначала ничего не заработает. Откройте консоль браузера клавишей F12, чтобы просмотреть лог ошибок. Ошибки чаще всего заключаются в том, что код не может найти какие-то файлы. После этого нужно вручную исправить файлы, где оказались неправильные ссылки.

Например, для публикации приложения [2] мне пришлось в файле index.html исправить атрибуты 'src=' и 'href=' путем замены путей к файлам с "/assets/*" на "assets/*".

Обычно при прямой публикации методом копирования содержимого папки dist проблема заключается в том, что ваше Vue-приложение ищет файлы в корне сайта (`/assets/...`), а не в подкаталоге `/myvueapp/`, куда вы их поместили. Сервер возвращает 404, так как по адресу `https://домен/assets/index-XXXX.css` файла нет — он лежит по адресу `https://домен/myvueapp/assets/index-XXXX.css`.

Решение: нужно перенастроить сборку Vue так, чтобы все пути стали относительными или учитывали подпапку `/myvueapp/`.

1. Создайте файл `.env` в корне вашего Vue-проекта (рядом с package.json) и добавьте в него строку:

VITE_BASE_URL=/myvueapp/

Если вы используете Vue CLI вместо Vite, переменная будет называться PUBLIC_URL или нужно настроить vue.config.js.

2. Измените конфигурацию сборки, чтобы она использовала этот путь.

Для Vite (стандартный инструмент для новых проектов Vue) откройте файл vite.config.js и добавьте свойство `base`:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
base: process.env.VITE_BASE_URL || '/' // < -- добавить эту строку })

Для Vue CLI (старый стандарт) создайте или откройте файл vue.config.js:

   module.exports = {
publicPath: process.env.NODE_ENV === 'production' ? '/weather/' : '/' }

3. Пересоберите проект:

npm run build

Папка dist обновится. Теперь пути в файлах будут выглядеть так:

< link rel="stylesheet" crossorigin href="/myvueapp/assets/index-XXXX.css">

4. Загрузите новое содержимое папки dist на сервер, полностью заменив содержимое вашей папки myvueapp.

[Альтернативное быстрое решение (без пересборки)]

Если по каким-то причинам вы не можете пересобрать проект, можно вручную поправить пути в уже загруженном index.html:

1. Откройте файл index.html в папке myvueapp на сервере через FTP или SSH.

2. Найдите все вхождения `href="/assets/` и замените их на `href="/myvueapp/assets/`.

3. Найдите все вхождения `src="/assets/` (если есть) и замените на `src="/myvueapp/assets/`.

4. Сохраните файл.

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

[Ссылки]

1. Vue 3, быстрый старт.
2. Простое приложение Vue, показывающее погоду (результат прохождения курса Stepik).