リリース·  

Nuxt 3.8

Nuxt 3.8がリリースされました。組み込みのDevTools、Nuxt Imageの自動インストール、新しいアプリマニフェストなどが追加されています。
Daniel Roe

ダニエル・ロー

@danielroe.dev

💻 CLIの改善

以前からお知らせしている通り、現在新しいNuxt CLIを使用しており、これは個別にバージョン管理されています。

nuxi module add <module-name> でモジュールをインストールできるようになりました。
Viteのwebsocketと同じポートを共有するようになり、開発中のDockerコンテナのサポートが向上しました。
Nuxt CLI v3.9.0 のリリースノートをご覧ください。

✨ 組み込みのNuxt DevTools

Nuxt DevTools v1.0.0がリリースされ、Nuxtの直接的な依存関係として出荷できるようになったと考えています。

Nuxt DevTools v1.0の発表をご覧ください。

📸 Nuxt Imageの自動インストール

<NuxtImg><NuxtPicture> は、ファーストクラスの組み込みコンポーネントです。

初回使用時に @nuxt/image を自動インストールするようになりました。#23717).

サイトで画像を使用している場合は、@nuxt/imageを使用することをお勧めします。これにより最適化が適用され、サイトのパフォーマンスが向上します。

📂 レイアウトスキャンの深さの改善

これは挙動の変更ですので、ご注意ください。

~/components と同様に、~/layouts 内のサブフォルダにあるレイアウトのスキャンをサポートするようになりました。

ファイルレイアウト名
~/layouts/desktop/default.vue'desktop-default'
~/layouts/desktop-base/base.vue'desktop-base'
~/layouts/desktop/index.vue'desktop'
名前付きレイアウトについて詳しくはこちらをご覧ください。

📊 アプリマニフェスト

組み込みのアプリマニフェストをサポートするようになりました (詳細はPR #21641を参照)。これにより、/_nuxt/builds/meta/<buildId>.json にマニフェストが生成されます。

nuxt generate でサイトが生成された場合、プリレンダリングされたルートのみペイロードをロードできるようになり、コンソールでの404エラーを防ぎます。

また、クライアントサイドルートルールも有効になります。現時点では redirect ルートルールのみがサポートされており、クライアントサイドのナビゲーション実行時にリダイレクトされるようになります。

export default defineNuxtConfig({
  routeRules: {
    '/about': { redirect: '/about-us' }
  }
})
アプリマニフェストは、/_nuxt/builds/latest.json を確認することで新しいデプロイメントを検出するなど、将来の機能強化も可能にします。
この動作を無効にしたい場合は、nuxt.config.ts ファイルで experimental.appManifestfalse に設定してください。

🤝 スコープとコンテキストの改善

プラグインで実行されるNuxtコンポーザブルに「スコープ」を定義するようになりました (詳細は#23667参照)。これにより、VueのonScopeDisposeライフサイクルメソッドを使用して、サイトからの移動前に同期的なクリーンアップを実行できます。

これにより、Cookieに関するエッジケースが修正され (詳細は#23697参照)、Piniaストアなどのメモリ管理も改善されます (詳細は#23650).
VueのEffect Scopesについて詳しくはこちらをご覧ください。

また、ネイティブの非同期コンテキストVue Composition APIでサポートするようになりました (詳細は#23526参照)。ご存じない方のために説明すると、NodeとBunでネイティブの非同期コンテキストをサポートしており、experimental.asyncContext を有効にすることで利用できます。

Nuxt instance unavailable の問題が発生した場合は、このオプションを有効にすることで解決する可能性があります。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    asyncContext: true
  }
})
クロスランタイムサポートが確立され次第、デフォルトで有効にする予定です。

defineNuxtLink ユーティリティを使用して、独自の <NuxtLink> コンポーネントを定義できます。

現在、組み込みの <NuxtLink> のオプションを、nuxt.config.ts ファイルで直接カスタマイズできます (詳細は#23724).

参照)。これにより、例えばサイト全体で末尾スラッシュの挙動を強制することができます。

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    defaults: {
      nuxtLink: {
        activeClass: 'nuxt-link-active',
        trailingSlash: 'append'
      }
    }
  }
})

⚡️ データフェッチングの改善

useAsyncDatauseFetch には、非常に重要な新機能が2つ追加されました。

  1. deep: false を設定することで、これらのコンポーザブルから返される data オブジェクトに対するディープリアクティビティを防止できるようになりました (詳細は#23600参照)。これにより、大きな配列やオブジェクトを返す場合のパフォーマンスが向上するはずです。オブジェクトは再フェッチ時に更新されますが、data 内のプロパティを深く変更してもリアクティブな効果はトリガーされません。
  2. getCachedData オプションを使用して、これらのコンポーザブルのカスタムキャッシュを処理できるようになりました (詳細は#20747)
pages/index.vue
<script setup>
const nuxtApp = useNuxtApp()
const { data } = await useAsyncData(() => { /* fetcher */ }, {
  // this will not refetch if the key exists in the payload
  getCachedData: key => nuxtApp.payload.static[key] ?? nuxtApp.payload.data[key]
})
</script>

また、これらのコンポーザブルにアプリ全体でいくつかのデフォルト値を設定することもサポートしています (詳細は#23725):

nuxt.config.ts
export default defineNuxtConfig({
  experimental: {
    defaults: {
      useAsyncData: {
        deep: false
      },
      useFetch: {
        retry: false,
        retryDelay: 100,
        retryStatusCodes: [500],
        timeout: 100
      }
    }
  }
})

🔢 レイヤーの改善

レイヤープラグイン (詳細は#22889GlobalComponents#23148参照) とミドルウェア (詳細は#22925GlobalComponents#23552参照) をレイヤーの順序でより慎重にロードするようになり、常に独自のプラグインとミドルウェアを最後にロードするようになりました。これにより、レイヤーが注入するユーティリティに依存できるようになるはずです。

そしておそらく最も重要な変更の1つは、リモートレイヤーを使用している場合、それらを node_modules/ フォルダ内にクローンするようになったことです (詳細は#109参照)。これにより、レイヤーがプロジェクトで依存関係を使用できるようになります。詳細については、c12 リリースノートをご覧ください。

これらのレイヤー解決の変更をカバーするテストスイートも追加しました。

😴 ナイトリーリリースチャネル

Nuxtの main ブランチへのコミットはすべて、リリース前のテストを容易にするために、新しいリリースとして自動的にデプロイされます。これを「edge release channel」から「nightly release channel」に名称変更し、edge deploymentsとの混同を避けるようにしました。そしておそらくMicrosoft Edgeとも (ただし、それで誰かが混乱したという話は聞いていません!)

  • nuxt3nuxt-nightly になりました。
  • nuxi-edgenuxi-nightly になりました。
  • @​nuxt/kit-edge@​nuxt/kit-nightly になりました。
  • ...など。
ナイトリーリリースチャネルについて詳しくはこちらをご覧ください。

⚗️ Nitro v2.7

Nitro v2.7がリリースされ、多くの改善とバグ修正が含まれています。

🔥 最も重要な点の1つは、Node 18以降でサポートされているネイティブの fetch を使用することで、本番環境でのバンドルサイズが40%削減されることです (詳細は#1724参照)。可能であれば、Nodeのバージョンを少なくとも18に更新することをお勧めします。
Nitro v2.7のリリースノートをご覧ください。

💪 型インポートの変更

これは、プロジェクトのコード変更が必要になる可能性があります。

Vueは、型インポートが明示的であることを要求します (これにより、Vueコンパイラはプロパティなどの型インポートを正しく最適化および解決できます)。詳細はコアVueの tsconfig.json.

参照。そのため、Nuxtプロジェクトでは verbatimModuleSyntax をデフォルトでオンにすることにしました。これにより、明示的な type インポートなしで型がインポートされた場合に型エラーが発生します。解決するには、インポートを更新する必要があります。

- import { someFunction, SomeOptions } from 'some-library'
+ import { someFunction } from 'some-library'
+ import type { SomeOptions } from 'some-library'

Nuxtエコシステム内のモジュールも更新が必要になる場合があります。それらのモジュールについては、issueをオープンしてください。モジュール作成者の方で何か問題に遭遇された場合は、喜んでお手伝いさせていただきます。私をタグ付けしていただければ確認いたします。

何らかの理由でこの変更をプロジェクトで元に戻す必要がある場合は、以下の設定を行うことができます。

nuxt.config.ts
export default defineNuxtConfig({
  typescript: {
    tsConfig: {
      compilerOptions: {
        verbatimModuleSyntax: false
      }
    }
  }
})

ただし、Vueが最良の結果を得るためにこのオプションを設定する必要があるため、一時的にのみ行うことをお勧めします。

✅ アップグレード

いつものように、アップグレードには以下を実行することをお勧めします。

npx nuxi upgrade

完全なリリースノート

Nuxt v3.8.0 の完全なリリースノートをご覧ください。

ここまで読んでいただきありがとうございます!新しいリリースを楽しんでいただけると幸いです。フィードバックや問題がありましたら、ぜひお知らせください。

ハッピーNuxting ✨