Как работает Nuxt?
Это руководство поможет вам лучше понять внутреннее устройство Nuxt для разработки новых решений и интеграции модулей поверх Nuxt.
Интерфейс Nuxt
Когда вы запускаете Nuxt в режиме разработки с помощью nuxi dev
или создаете продакшен приложение с помощью nuxi build
, будет создан общий контекст, который внутренне называется nuxt
. Он содержит нормализованные опции, объединенные с файлом nuxt.config
, некоторое внутреннее состояние и мощную систему хуков на основе unjs/hookable, позволяющих различным компонентам взаимодействовать друг с другом. Можно считать, что это Ядро Сборщика.
Этот контекст глобально доступен для использования с композаблами Nuxt Kit. Поэтому в каждом процессе может быть запущен только один инстанс Nuxt.
Чтобы расширить интерфейс Nuxt и подключиться к различным этапам процесса сборки, мы можем использовать Nuxt-модули.
Для получения более подробной информации ознакомьтесь с исходным кодом.
Интерфейс NuxtApp
При рендере страницы в браузере или на сервере будет создан общий контекст, называемый nuxtApp
.
В этом контексте хранятся инстанс vue, runtime хуки, а также внутренние состояния, такие как ssrContext и payload для гидратации.
Можно считать, что это Runtime ядро.
Доступ к этому контексту можно получить с помощью композабла useNuxtApp()
в Nuxt-плагинах, а также с помощью <script setup>
и композаблов vue.
Глобальное использование возможно в браузере, но не на сервере, чтобы избежать совместного использования контекста между пользователями.
Поскольку useNuxtApp
выбрасывает исключение, если контекст в данный момент недоступен, если ваш композабл не всегда требует nuxtApp
, вы можете использовать вместо него tryUseNuxtApp
, оторый вернет null
вместо того, чтобы выбросить исключение.
Для расширения интерфейса nuxtApp
и подключения к различным этапам или контекстам доступа можно использовать Nuxt-плагины.
Дополнительную информацию об этом интерфейсе можно найти в Nuxt App.
nuxtApp
имеет следующие свойства:
const nuxtApp = {
vueApp, // глобальное приложение Vue: https://ru.vuejs.org/api/application.html#application-api
versions, // объект, содержащий версии Nuxt и Vue
// Они позволяют вызывать и добавлять runtime хуки NuxtApp
// https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/nuxt.ts#L18
hooks,
hook,
callHook,
// Доступно только на сервере
ssrContext: {
url,
req,
res,
runtimeConfig,
noSSR,
},
// Это будет преобразовано в строку и передано от сервера к клиенту
payload: {
serverRendered: true,
data: {},
state: {}
}
provide: (name: string, value: any) => void
}
Более подробную информацию можно найти в исходном коде.
Runtime контекст против контекста сборки
Nuxt собирает и компонует проект с помощью Node.js, но также имеет и runtime.
Хотя обе области могут быть расширены, runtime контекст изолирован от времени сборки. Поэтому они не должны иметь общего состояния, кода или контекста, отличного от runtime конфигурации!
nuxt.config
и Nuxt-модули могут использоваться для расширения контекста сборки, а Nuxt-плагины - для расширения runtime.
При сборке приложения для продакшена nuxi build
будет генерировать отдельную сборку в директории .output
, не зависящую от nuxt.config
и Nuxt-модулей.