Изоморфный код (или универсальный рендеринг) — это подход, при котором один и тот же код выполняется как на сервере, так и на клиенте. В контексте Quasar Framework изоморфизм реализуется через серверный рендеринг (SSR) и интеграцию с Vue.js, что позволяет создавать приложения с быстрым первым рендером и улучшенной SEO-оптимизацией.
Единая логика для клиента и сервера Компоненты и
методы, которые не зависят от среды выполнения, могут использоваться и
на сервере, и на клиенте. Например, вычисляемые свойства, методы
обработки данных и общие сервисы состояния (store) остаются
идентичными.
Разделение контекста выполнения Не весь код
может быть изоморфным. Например, обращение к window,
document или локальному хранилищу
(localStorage) возможно только на клиенте. В Quasar
применяется проверка контекста через process.env.SERVER и
process.env.CLIENT, либо через композиционные функции Vue
(onServerPrefetch, onMounted).
Серверный рендеринг (SSR) Quasar предоставляет готовый шаблон для SSR-приложений. Сервер отвечает HTML-страницей, которая уже содержит готовый DOM, что ускоряет время до первого отображения и позволяет поисковым ботам индексировать контент.
Инициализация проекта с SSR При создании проекта через CLI выбирается режим SSR:
quasar create my-ssr-app
cd my-ssr-app
quasar mode add ssr
Это создаёт структуру директорий, включающую src-ssr и
конфигурацию для серверного запуска.
Файл entry-server и entry-client
entry-server.js отвечает за сборку серверного кода и
рендеринг компонентов на сервере.entry-client.js монтирует приложение на клиенте,
гидратируя серверный HTML.Управление состоянием через Vuex или Pinia Для изоморфного кода важно правильно инициализировать store. В SSR каждый запрос должен создавать новый экземпляр состояния, чтобы исключить утечку данных между пользователями.
export function createStore () {
return new Vuex.Store({
state: { counter: 0 },
mutations: { increment (state) { state.counter++ } }
})
}Изоморфные приложения требуют аккуратного обращения с асинхронными данными:
onServerPrefetch — используется для загрузки данных на сервере до рендеринга компонента.
import { onServerPrefetch, ref } from 'vue'
export default {
setup() {
const posts = ref([])
onServerPrefetch(async () => {
const res = await fetch('https://api.example.com/posts')
posts.value = await res.json()
})
return { posts }
}
}onMounted — аналогично используется на клиенте, например, для работы с DOM или сторонними библиотеками.
Quasar использует Vue Router для изоморфных маршрутов:
export function createRouter() {
return new VueRouter({
mode: 'history',
routes: [
{ path: '/', component: () => import('pages/Index.vue') },
{ path: '/about', component: () => import('pages/About.vue') }
]
})
}
router.isReady() и router.push()
позволяют серверу дождаться полной загрузки маршрута перед
рендерингом.Не все библиотеки поддерживают SSR. Рекомендуется:
window или document
перед использованием.if (process.env.CLIENT) для
клиентских библиотек.Для улучшения производительности SSR в Quasar применяются:
Изоморфный подход в Quasar обеспечивает высокую производительность, масштабируемость и удобство разработки сложных веб-приложений, сохраняя единый код на клиенте и сервере.