OpenSource-Hub

nuxt

フレームワーク

nuxt/nuxt

フルスタック Vue フレームワーク。型安全で高性能な Web アプリケーションを構築。

概要

Nuxt は Vue.js をベースにしたオープンソースフレームワークで、サーバーサイドレンダリング、静的サイト生成、ハイブリッドレンダリングなどの機能を提供します。自動ルーティング、データフェッチ、状態管理、ゼロコンフィグの TypeScript サポートを備えています。300 以上のモジュールで拡張可能で、プロダクションレベルのフルスタックアプリケーションに適しています。

README プレビュー

\n\n# Nuxt\n\n\n  \n  \n  \n  \n  \n  \n  \n  \n\n\nNuxt is a free and open-source framework with an intuitive and extendable way to create type-safe, performant and production-grade full-stack web applications and websites with Vue.js.\n\nIt provides a number of features that make it easy to build fast, SEO-friendly, and scalable web applications, including:\n- Server-side rendering, static site generation, hybrid rendering and edge-side rendering\n- Automatic routing with code-splitting and pre-fetching\n- Data fetching and state management\n- Search engine optimization and defining meta tags\n- Auto imports of components, composables and utils\n- TypeScript with zero configuration\n- Go full-stack with our server/ directory\n- Extensible with [300+ modules](https://nuxt.com/modules)\n- Deployment to a variety of [hosting platforms](https://nuxt.com/deploy)\n- ...[and much more](https://nuxt.com) 🚀\n\n### Table of Contents\n\n- 🚀 [Getting Started](#getting-started)\n- 💻 [Vue Development](#vue-development)\n- 📖 [Documentation](#documentation)\n- 🧩 [Modules](#modules)\n- ❤️ [Contribute](#contribute)\n- 🏠 [Local Development](#local-development)\n- 🛟 [Professional Support](#professional-support)\n- 🔗 [Follow Us](#follow-us)\n- ⚖️ [License](#license)\n\n---\n\n## 🚀 Getting Started\n\nUse the following command to create a new starter project. This will create a starter project with all the necessary files and dependencies:\n\n```bash\nnpm create nuxt@latest \n```\n\n> [!TIP]\n> Discover also [nuxt.new](https://nuxt.new): Open a Nuxt starter on CodeSandbox, StackBlitz or locally to get up and running in a few seconds.\n\n## 💻 Vue Development\n\nSimple, intuitive and powerful, Nuxt lets you write Vue components in a way that makes sense. Every repetitive task is automated, so you can focus on writing your full-stack Vue application with confidence.\n\nExample of an `app.vue`:\n\n```vue\n\nuseSeoMeta({\n  title: 'Meet Nuxt',\n  description: 'The Intuitive Vue Fra

FAQ (5)

トラブル対応
Nuxt 4.6 で useFetch<T>() がランタイム文字列の baseURL を受け取る場合に TS2769 を修正する方法

これは Nuxt 4.6.0 における TypeScript のジェネリック型推論のリグレッションです。useFetch<{ items: number[] }>() のように明示的なレスポンス型を指定すると、BaseURL ジェネリックがリテラル型 '' をデフォルトとしてしまうため、useRuntimeConfig() から取得した実行時の string が拒否されます。

回避策 1 — ベース URL を指定して fetch インスタンスを作成し、それを $fetch 経由で渡します:

const config = useRuntimeConfig()
const api = $fetch.create({ baseURL: config.public.apiBase })

useFetch<{ items: number[] }>('/x', { $fetch: api })
useLazyFetch<{ items: number[] }>('/x', { $fetch: api })

回避策 2 — 完全な URL を構築し、baseURL を省略します:

const config = useRuntimeConfig()
useFetch<{ items: number[] }>(`${config.public.apiBase}/x`)

同じ回避策は #build/fetch からインポートした $fetch にも適用されます。一時的な措置として、以前の動作が正常に機能していた Nuxt 4.5.2 へダウングレードすることもできます。

参照 Issue #36521
トラブル対応
Nuxt の `Serialize` が文字列インデックスシグネチャを持つオブジェクトから名前付きプロパティを失わせる問題を修正するには?

これは Nuxt 4.6.0 の SerializeObject における型レベルのバグです。内部では Omit<T, FilterKeys<T, NonJsonPrimitive>> が使用されており、T がインデックスシグネチャを持つ場合、keyof T が string | number になるため、マップ型の処理中に名前付きキーが削除されてしまいます。node_modules/nuxt/dist/app/types/serialize.d.ts 内の SerializeObject を、キーを再マッピングするマップ型に置き換えてください。

type SerializeObject<T extends object> = {
  [K in keyof T as T[K] extends NonJsonPrimitive ? never : K]: Serialize<T[K]>
}

これにより、docFormat や name などの名前付きプロパティと、インデックスシグネチャの両方が保持されます。変更は patch-package で永続化します。

npx patch-package nuxt

次に、patch-package を postinstall に追加します。

{ "scripts": { "postinstall": "patch-package" } }

Nuxt にパッチを当てない一時的な回避策として、レスポンスを明示的に修正した型にキャストする方法もあります。

type SerializeObjectFixed<T extends object> = {
  [K in keyof T as T[K] extends NonJsonPrimitive ? never : K]: Serialize<T[K]>
}

const wire = JSON.parse(JSON.stringify(doc)) as SerializeObjectFixed<Doc>

同様の問題は、Zod の .catchall()、z.looseObject()、.passthrough() の型でもよく発生します。リンク先の修正がリリースされたら Nuxt をアップグレードし、それまではパッチを使用してください。

参照 Issue #36500
トラブル対応
なぜ Nuxt 4.6.1 ではグローバルの $fetch が NuxtGlobalFetch ではなく nitropack の $Fetch として型付けされているのですか(routeTypedFetch が動作しません)?

Nuxt 4.6.1 では、@nuxt/kit が typescript.appTsConfig(または tsConfig)を defu を使って生成された tsconfig にマージするため、カスタムの include エントリが ./nuxt.d.ts の**前**に配置されます。インクルードされたファイルのいずれかが nuxt/app をインポートしている場合(テストヘルパーなど)、nitropack の declare global { var $fetch: $Fetch } が先に読み込まれるため、experimental.routeTypedFetch: true を指定していても、グローバルな $fetch は再び $Fetch<unknown, NitroFetchRequest> と型付けされます。**回避策:** ./nuxt.d.ts を include 配列の先頭のエントリとして配置してください。

export default defineNuxtConfig({
  experimental: { routeTypedFetch: true },
  typescript: {
    appTsConfig: {
      include: ['./nuxt.d.ts', '../test/**/*.ts'],
    },
  },
})

重複した ./nuxt.d.ts エントリは Nuxt によって重複排除され、グローバルな $fetch は再び NuxtGlobalFetch と型付けされます。nuxi prepare を実行した後、tsc -p .nuxt/tsconfig.app.json --noEmit で確認してください。

参照 Issue #36621
トラブル対応
Nuxt レイヤーがパッケージ名で拡張されると、なぜ scheduled tasks と Cloudflare cron triggers が重複してしまうのですか?

extends グラフ内で2つのパスから到達されるレイヤーは、パスごとに1回ずつ設定がマージされるため、宣言している配列がすべて二重になります。例えば nitro.cloudflare.wrangler.triggers.crons は ['0 0 * * *','0 0 * * *'] になり(Cloudflare のデプロイは duplicate cron found ... [code: 10100] で失敗し)、nitro.scheduledTasks のタスクリストは同時に2回実行されます。原因: @nuxt/kit の seenLayerDirs による重複排除ガードが existsSync チェックの後ろに配置されており、extends: ['@org/layer-a','@org/layer-b'] のようなパッケージ指定子は、重複排除が実行される前にそのチェックで失敗します(nuxt 4.5.2 / c12 3.3.4 で確認)。回避策: レイヤーをパッケージ名ではなく相対パスで記述します。例えば extends: ['./packages/a','./packages/b'] のようにします。パスでの記述は存在チェックを通過し、正しく重複排除されます。上流の修正はまだリリースされていません。

参照 Issue #36339
トラブル対応
なぜWindows上のNuxt開発モードでCSSが2回読み込まれ、カスケードレイヤーの順序が壊れるのですか(Nuxt 4.6.2)?

これは Nuxt 4.6.2 で導入された Windows 限定のリグレッションです(4.6.1 では動作します)。@nuxt/vite-builder の collectDevCss で、モジュールグラフの URL が toDevUrl() を通過するようになり、/ で始まらないすべての URL の先頭に /@id/ が付加されます。Windows では絶対パスがドライブレター(例: D:/)で始まるため、SSR のスタイルシートリンクは /_nuxt/@id/D:/…/lib.css のようになります。nuxt:dev-style-ssr プラグインは link[href="/_nuxt/<id>"] と link[href="/_nuxt/@fs/<id>"] しか削除しないため、/@id/ のリンクはハイドレーション後も削除されません。影響: すべてのグローバルスタイルシート(例: css: ['primeicons/primeicons.css'] やモジュールが追加した CSS)が開発環境で二重に読み込まれ、古いリンクが Vite によって注入された <style> タグより前に残るため、@layer の優先順位が nuxt.options.css の順序に従わなくなります(後のエントリのレイヤーが最も低い優先順位になる可能性があります)。回避策: パッチがリリースされるまで、Nuxt 4.6.1 にダウングレード/固定してください(pnpm add nuxt@4.6.1 を実行するか、package.json に override を追加します)。POSIX システム(Linux/macOS)は、絶対パスが / で始まるため影響を受けません。メンテナー向けの適切な修正: DevStyleSSRPlugin が削除するセレクタに /@id/ 形式(joinURL(buildAssetsURL, '@id', moduleId))を追加するか、collectDevCss が絶対パスに対して /@fs/ 形式を出力するようにします。

参照 Issue #36737