name: fec-nuxt-project-standard description: Use when creating or reviewing Nuxt 3 projects, file routes, pages, layouts, SSR/SSG/SPA behavior, Nuxt data fetching, route middleware, plugins, modules, server routes, or Nuxt-specific Vue 3 conventions. For generic Vue component architecture, apply the project's Vue conventions separately; Chinese triggers include Nuxt, Nuxt 3.
Nuxt 3 Project Specifications
For repositories using Nuxt 3 + Vue 3 + TypeScript.
Purpose
Standardize the engineering practices of SSR/SSG rendering mode, combined API, automatic import, data acquisition, routing middleware and module plug-ins in the Nuxt 3 project to ensure conventional development and type safety.
Procedure
- First identify whether the target belongs to Nuxt pages/layouts, rendering mode, data acquisition, route middleware, plugin/module or server route.
- Clarify SSR / SSG / SPA selection to avoid server-side executable code relying on
windowordocument. - For data acquisition, Nuxt’s
useFetch/useAsyncDatais used first, and the hydration consistency is checked. - Route authentication, redirection and permission issues are aligned with the route protection workflow.
- Common Vue component architecture issues are offloaded to the Vue project workflow.
Project structure
├── app.vue # Root component
├── nuxt.config.ts # Nuxt configuration
│
├── pages/ # File-based routing
│ ├── index.vue # /
│ ├── login.vue # /login
│ ├── dashboard/
│ │ ├── index.vue # /dashboard
│ │ └── users/
│ │ ├── index.vue # /dashboard/users
│ │ └── [id].vue # /dashboard/users/:id
│ └── [...slug].vue # Capture all
│
├── layouts/ # layout
│ ├── default.vue
│ └── auth.vue
│
├── components/ # Automatically import components
│ ├── Button/
│ │ └── Button.vue
│ └── AppHeader.vue
│
├── composables/ # Combined functions (automatically imported)
│ ├── useAuth.ts
│ └── useFetch.ts
│
├── server/ # Server API
│ ├── api/ # API routing
│ │ └── users/
│ │ └── index.get.ts
│ ├── middleware/ # Server-side middleware
│ └── utils/ # Server-side tools
│
├── plugins/ # Plug-in
│ └── i18n.client.ts
│
├── middleware/ # Routing middleware
│ └── auth.ts
│
├── public/ # Static resources
├── assets/ # Resources to be built
└── types/ # Type definition
Rendering mode
| Mode | Configuration | Description |
|---|---|---|
| SSR | Default | ssr: true |
| SSG | nuxt generate |
Pre-render all pages |
| SPA | ssr: false |
Pure client-side rendering |
// nuxt.config.ts
export default defineNuxtConfig({
ssr: true, // or false
});
Data acquisition
useFetch/useAsyncData: server + client, automatic deduplication$fetch: direct request, suitable for server or one-time calluseLazyAsyncData: does not block navigation, suitable for non-first screen- Avoid mixing synchronous/asynchronous logic at the top level of
setupcausing hydration mismatch
Routing and layout
- Automatically generate routes for files under
pages/ - Dynamic routing:
[id].vue,[...slug].vue - Layout:
layoutoption orlayouts/default.vuedefault - Nested routing:
pages/parent/child.vueneeds to be combined withNuxtPage
Middleware
- Automatically register files under
middleware/ - Page level:
definePageMeta({ middleware: ['auth'] }) - Global:
router.middlewareofnuxt.config.ts - Server-side middleware:
server/middleware/
Plug-ins and modules
- Plug-in:
plugins/*.ts, supports.client,.serversuffixes - Modules:
modules/ornode_modules, innuxt.configmodules: []
Constraints
- Server-accessible code should not rely on
windowordocument - Be careful about SSR serialization when using
useStateto share state - Use
NuxtImgfor images andNuxtLinkfor links - Avoid using
awaitat the top level ofsetupwhich will cause blocking. UseuseAsyncData/useFetchfirst
Expected Output
- Pages are organized according to
pages/conventional routing, and dynamic routing is correctly configured - The rendering mode (SSR/SSG/SPA) is correctly selected and the
nuxt.config.tsconfiguration is clear - Data acquisition uses
useFetch/useAsyncData, automatic deduplication and hydration - Composables and components are automatically imported correctly, and the server/client boundary is clear