Nuxt Bridge移行の知見まとめ
2023/09/24 更新
マイグレーションガイドを新しくしたので、基本はこれを見ればよい
Migration Guide
Nuxt Bridgeにしなくてもできる対応
defineNuxtMiddleware, defineNuxtPlugin
defineNuxtMiddleware
, defineNuxtPlugin
が Bridgeだとなくなっている。
https://nuxt.com/docs/bridge/bridge-composition-api を参考に修正する必要がある。
また、以下のコマンドで自動変換できるツールを作っている
npx @wattanx/nuxt-bridge-migration define-nuxt-middleware <files...>
npx @wattanx/nuxt-bridge-migration define-nuxt-plugin <files...>
Vue 2.7への移行
Nuxt Bridge にしないとできない対応
bridge.capi: true
の場合、@nuxtjs/composition-api
というimportはそのままで利用できる。
しかし、一部APIは変更がある。
useFetch
@nuxtjs/composition-apiのuseFetchの返り値である $fetch
, $fetchState
が bridgeではなくなっている。
import { useFetch } from '@nuxtjs/composition-api'
const {
- $fetchState,
- $fetch,
+ fetchState,
+ fetch,
} = useFetch(async () => {
...
})
useRoute
useRoute
の返り値がcomputedではなくなる
const route = useRoute();
- const query = route.value.query;
+ const query = route.query;
@nuxtjs/composition-api
の対応
Nuxt Bridge、Nuxt 3では、#imports
からuseRouter
やuseNuxtApp
といったcomposablesをimportできる。
なので、Nuxt Bridgeにあげる段階で@nuxtjs/composition-api
を#imports
に変えておくと、Nuxt 3になってからもimport先を変えなくて済む。
- import { useRouter } from '@nuxtjs/composition-api';
+ import { useRouter } from '#imports';
また、bridge.capi: true
にすると@nuxtjs/composition-api
をそのまま利用できます。
ただし、Bridge では@nuxtjs/composition-api
のaliasはnode_modules/@nuxt/bridge/dist/runtime/capi.legacy.mjs
になる。
bridge.capi: true
にしておくと、@nuxtjs/composition-api
を使いながら、徐々に#imports
に置き換えることができる。
<script setup lang="ts">
// useAsync, useFetchは`useLazyAsyncData`に置き換える
import { useLazyAsyncData } from '#imports';
// useContextだけそのまま以前のまま使う
import { useContext } from '@nuxtjs/composition-api';
</script>
nuxt
コマンドで動かした場合、.nuxt/tsconfig.json
が出力されないので自前で用意する
{
compilerOptions: {
paths: {
"#app": ["node_modules/@nuxt/bridge/dist/runtime/index"],
"#head": ["node_modules/@nuxt/bridge/dist/runtime/head"],
"#head/*": ["node_modules/@nuxt/bridge/dist/runtime/head/*"],
"#imports": [".nuxt/imports"],
"@nuxtjs/composition-api": [
"node_modules/@nuxt/bridge/dist/runtime/capi.legacy"
]
}
}
}
Nuxt Bridgeへ移行する段階で#imports
に変更するのは、場合によってはとんでもない変更差分になってしまう。
Nuxt 2系から#imports
にしておくと、Bridge移行、Nuxt 3への移行がちょっと楽になる。
(auto importを使わない場合の話だが)
nuxtjs/proxy
@nuxtjs/proxy はBridge, Nuxt 3に対応していない。
その代わり、@nuxtjs/proxy
の機能はnitro
の機能で代替できる
export default defineNuxtConfig({
- modules: ['@nuxtjs/proxy']
- proxy: {
- '/api': 'http://example.com',
- }
+ nitro: {
+ devProxy: {
+ '/api': 'http://example.com',
+ }
+ }
})
Nuxt Bridge を使った Nuxt 3 へのマイグレーション方法(2023/06/15 現在)
2023/04/29 時点における Nuxt Bridge を使った Nuxt 3 へのマイグレーション方法を考える。(仮説なので、必ずしもうまくいくとは限らない)
bridge: false
の状態で、Nuxt Bridge を導入する。
1. -
nuxt@2.17
に上げる
https://nuxt.com/docs/bridge/overview#upgrade-nuxt-2 -
Vue 2.7 に上げる。
-
nuxt@2.17
だと Vue 2.7 になるため。
-
-
nuxt
コマンドでビルドする。
bridge
オプションを有効化する。
2. -
bridge.capi: true
にして、@nuxtjs/composition-api
互換のcomposables が使えるようにする-
@nuxtjs/composition-api
とは微妙に違いがあるので気を付ける必要がある。 - https://zenn.dev/link/comments/075dcc7c4b2a30
-
@nuxtjs/composition-api
はbuildModules
からは削除するが、パッケージは残しておく。(import
でエラーが出るため)
-
-
bridge.meta: true
にする。-
head()
をコンポーネント側で使っている場合、Composition API かつuseHead
oruseMeta
に変更する必要がある。 - https://nuxt.com/docs/bridge/overview#new-usehead-optional
-
-
bridge.nitro: false
にする。 -
nuxt
コマンドでビルドする。-
bridge
オプションを有効化しても、まだnuxt
コマンドが利用できる。
-
3. Nuxt 3 互換のAPIに変更する
Nuxt Bridge では Nuxt 3 互換の useNuxtApp
や useLazyAsyncData
などが利用できる。
(@nuxtjs/composition-api
と共存はできるはずなので、少しずつ移行できる。)
-
useContext
->useNuxtApp
に変更する -
useAsync
,useFetch
->useLazyAsyncData
に変更する。 -
useMeta
->useHead
に変更する -
useStore
->const { $store } = useNuxtApp()
に変更する。
nuxi
コマンドに置き換える。
4. -
nitro: true
に変更して、nuxt
コマンドをnuxi
コマンドに変更する。-
dist
->.output
ディレクトリに変わる。
-
useState
にする
5. Vuex を Pinia または Nuxt 3 では store
ディレクトリのサポートがなくなる。
なので、Pinia に移行しておく。
また、Nuxt Bridge では useState
が使えるのでそちらでも良い
6. Nuxt 3, Vue 3 に移行する
エラーと対処法
エラー
Failed to load url #build/composition-globals.mjs (resolved id: #build/composition-globals.mjs) in pj/node_modules/@nuxt/bridge/dist/runtime/capi.legacy.mjs. Does the file exist?
対処法
export default defineConfig({
test: {
deps: {
inline: ['@nuxt/bridge'],
},
}
})
vi.mock('#build/composition-globals.mjs', () => ({
isFullStatic: false,
}));