先日パブリックベータに移行したNuxt 3では、コードの軽量化、高速化やTypeScriptサポートなど様々な変更や新機能が盛り込まれているようです。
今回はそんなNuxt 3の新機能、変更点について紹介します。
公式サイトで挙げられている特徴(対応予定を含む)は下記の通りです。
Nuxtの新しいサーバエンジンとしてNitoro Engineが登場しました。これにより、大幅な軽量化(公式曰く、最大75倍)と高速化が実現されているようです。
さらに、Nitro EngineによりNuxt内部でのAPIの作成が行えるようになりました。これについては後ほど紹介します。
Nuxt 2でもパッケージを追加することで対応させることができましたが、Nuxt 3からは標準で使用できるようになりました。
Nuxt 2でTypeScriptを使う場合、tsconfig等を自分でセットアップする必要がありましたが、Nuxt 3からはNuxt CLIでアプリケーションを作成すると、TypeScriptがそのまま利用できます。
公式サイトにおけるNuxt 3のディレクトリ階層は下記のようになっています。
Nuxt 3では下記の3つのメソッドが追加されました。これらのメソッドはsetup関数内か、Lifecycle Hooks内で動作します。
非同期に解決されるデータにアクセスできます。基本的にはNuxt内部で作成したAPIを呼ぶために使用されます。
const { data: Ref<DataT>, pending: Ref<boolean>, refresh: (force?: boolean) => Promise<void>, error?: any } = useAsyncData( key: string, fn: () => Object, options?: { lazy: boolean, server: boolean } )
引数の内容は下記の通りです。
戻り値の内容は下記のとおりです。
使用例は下記のとおりです。
let counter = 0 export default () => { counter++ return JSON.stringify(counter) }
<script setup> const { data } = await useAsyncData('count', () => $fetch('/api/count')) </script> <template> Page visits: {{ data }} </template>
ページ、コンポーネント、プラグインでは、useFetchを使用して任意のURLからデータをフェッチできます。基本的には外部APIを呼ぶために使用されます。
const { data: Ref<DataT>, pending: Ref<boolean>, refresh: (force?: boolean) => Promise<void>, error?: any } = useFetch(url: string, options?)
引数の内容は下記の通りです。
戻り値の内容はuseAsyncDataを同じです。
使用例は下記のとおりです。
<script setup> const { data } = await useFetch('/api/count') </script> <template> Page visits: {{ data.count }} </template>
Nuxtでは、コンポーネント間でリアクティブでSSRに適した共有ステートを作成するためのuseStateコンポーザブルを提供しています。
これにより、Vuexを使わなくてもStateの管理ができるようになります。
useState<T>(key: string, init?: () => T): Ref<T>
使用例は下記のとおりです。
export const useCounter = () => useState<number>('counter', () => 0) export const useColor = () => useState<string>('color', () => 'pink')
<script setup> const color = useColor() // Same as useState('color') </script> <template> <p>Current color: {{ color }}</p> </template>
Nuxt 3(ベータ版)での新機能や変更点を紹介しました。軽量化や速度改善に加えて、TypeScriptに対応されたのが良い点だとおもいます。