Новый Composition API

Nuxt Bridge реализует композаблы, совместимые с Nuxt 3.

Если заранее перейти с @nuxtjs/composition-api на API, совместимое с Nuxt 3, объём правок при полном переходе на Nuxt 3 останется небольшим.

ssrRef и shallowSsrRef

Эти две функции были заменены на новый композабл, работающий похожим образом внутри: useState.

Главное отличие: нужно явно задать ключ состояния (раньше его для ssrRef и shallowSsrRef подставлял Nuxt), а вызывать useState можно только внутри плагина Nuxt 3 с defineNuxtPlugin или в setup компонента. В «голом» глобальном контексте его использовать нельзя — иначе состояние может смешаться между запросами.

- import { ssrRef } from '@nuxtjs/composition-api'

- const ref1 = ssrRef('initialData')
- const ref2 = ssrRef(() => 'factory function')
+ const ref1 = useState('ref1-key', () => 'initialData')
+ const ref2 = useState('ref2-key', () => 'factory function')
  // доступ к состоянию
  console.log(ref1.value)

Поскольку состояние задаётся ключом, вы можете получить доступ к одному и тому же состоянию из нескольких мест, если используете один и тот же ключ.

Подробнее о композабле — в документации.

ssrPromise

Эта функция удалена: если вы её использовали, понадобится своя замена. Если сценарий с ssrPromise важен — опишите его в обсуждении на GitHub.

onGlobalSetup

Эта функция удалена, но те же задачи решаются через useNuxtApp или useState внутри defineNuxtPlugin. Произвольный код можно выполнять и в setup() корневого layout-компонента.

- import { onGlobalSetup } from '@nuxtjs/composition-api'

- export default () => {
-   onGlobalSetup(() => {
+ export default defineNuxtPlugin((nuxtApp) => {
+   nuxtApp.hook('vue:setup', () => {
      // ...
    })
- }
+ })

useStore

Для доступа к экземпляру хранилища Vuex вы можете использовать: useNuxtApp().$store.

- import { useStore } from '@nuxtjs/composition-api'
+ const { $store } = useNuxtApp()

useContext и withContext

Вы можете получить доступ к внедренным хелперам с помощью: useNuxtApp.

- import { useContext } from '@nuxtjs/composition-api'
+ const { $axios } = useNuxtApp()
useNuxtApp() также предоставляет ключ nuxt2Context, содержащий все те же свойства, к которым вы обычно обращаетесь из контекста Nuxt 2, но рекомендуется не использовать его непосредственно, так как он не будет существовать в Nuxt 3. Вместо этого попробуйте найти другой способ получить доступ к тому, что вам нужно. (Если такого способа нет, пожалуйста, создайте запрос на новую функцию или обсуждение.)

wrapProperty

Этот хелпер больше не предоставляется, но вы можете заменить его следующим кодом:

import { computed, getCurrentInstance } from 'vue'

const wrapProperty = (property: string, makeComputed = true) => () => {
  const vm = getCurrentInstance().proxy
  return makeComputed ? computed(() => vm[property]) : vm[property]
}

useAsync и useFetch

Эти два композабла можно заменить на useLazyAsyncData и useLazyFetch (см. useLazyAsyncData и useLazyFetch). Как и в @nuxtjs/composition-api, они не блокируют клиентскую навигацию — отсюда префикс lazy в имени.

Обратите внимание, что API полностью отличается, несмотря на схожее звучание имен. Важно, что вы не должны пытаться изменять значение других переменных вне композабла (как вы, возможно, делали раньше с useFetch).
useLazyFetch должен быть настроен для Nitro.

Миграция на новые композаблы с useAsync:

<script setup>
- import { useAsync } from '@nuxtjs/composition-api'
- const posts = useAsync(() => $fetch('/api/posts'))
+ const { data: posts } = useLazyAsyncData('posts', () => $fetch('/api/posts'))
+ // или проще:
+ const { data: posts } = useLazyFetch('/api/posts')
</script>

Миграция на новые композаблы с useFetch:

<script setup>
- import { useFetch } from '@nuxtjs/composition-api'
- const posts = ref([])
- const { fetch } = useFetch(() => { posts.value = await $fetch('/api/posts') })
+ const { data: posts, refresh } = useLazyAsyncData('posts', () => $fetch('/api/posts'))
+ // или проще:
+ const { data: posts, refresh } = useLazyFetch('/api/posts')
  function updatePosts() {
-   return fetch()
+   return refresh()
  }
</script>

useMeta

Для работы с vue-meta в Nuxt Bridge (но не в Nuxt 3) можно использовать useNuxt2Meta — он даёт тот же способ задавать мета-теги, что и vue-meta.

<script setup>
- import { useMeta } from '@nuxtjs/composition-api'
  useNuxt2Meta({
    title: 'Моё приложение Nuxt',
  })
</script>

Вы также можете передавать вычисляемые свойства (computed) или ref, и метаданные будут обновляться реактивно:

<script setup>
const title = ref('мой заголовок')
useNuxt2Meta({
  title,
})
title.value = 'новый заголовок'
</script>
Будьте осторожны и не используйте одновременно useNuxt2Meta() и Options API head() в одном и том же компоненте, поскольку поведение может быть непредсказуемым.

Nuxt Bridge также предоставляет реализацию мета-тегов, совместимую с Nuxt 3, которую можно получить с помощью композабла useHead.

<script setup>
- import { useMeta } from '@nuxtjs/composition-api'
  useHead({
    title: 'Моё приложение Nuxt',
  })
</script>

Вам также необходимо явно включить его в вашем nuxt.config:

import { defineNuxtConfig } from '@nuxt/bridge'

export default defineNuxtConfig({
  bridge: {
    meta: true,
  },
})

Композабл useHead внутри опирается на @unhead/vue, а не на vue-meta, и управляет содержимым <head>. Не смешивайте нативный head() Nuxt 2 с useHead — возможны конфликты.

Подробнее о метаданных см. useSeoMeta и смежные разделы API.

Явные импорты

Nuxt предоставляет доступ к каждому автоматическому импорту с помощью псевдонима #imports, который можно использовать для явного импорта при необходимости:

<script setup lang="ts">
import { computed, ref } from '#imports'

const count = ref(1)
const double = computed(() => count.value * 2)
</script>

Отключение автоматического импорта

Если вы хотите отключить автоматический импорт композаблов и утилит, вы можете установить imports.autoImport в false в файле nuxt.config.

nuxt.config.ts
export default defineNuxtConfig({
  imports: {
    autoImport: false,
  },
})

Это полностью отключит автоимпорт, но всё ещё можно использовать явные импорты из #imports.