Vue 3.5 is the version Nuxt 4 runs on, and three of its additions exist specifically to make server rendering less painful. Knowing them by name, and knowing which problem each solves, is a cheap way to sound current.
useId() produces identifiers that are stable across server and client. The correct fix for generated id, for and aria-* attributes, which were one of the classic hydration mismatches (hydration).useTemplateRef() replaces the "declare a ref whose name matches the attribute" convention with an explicit call, which is clearer and works with dynamic names.hydrate-on-visible / -idle / -interaction / -media-query / hydrate-after / hydrate-when / hydrate-never on Lazy* components (performance).data-allow-mismatch whitelists an expected mismatch on one element, with values text, children, class, style, attribute (no value allows all). The escape hatch for a deliberately client-formatted timestamp.const { count } = defineProps() keep reactivity, which removes a common source of subtle bugs in shipped components.| Package | One line |
|---|---|
@nuxt/ui | component library on Tailwind, v4; pulls in icons, fonts and color mode |
@nuxt/content | file-based content with a SQLite-backed query layer, v3 |
@nuxt/image | responsive images, modern formats, <NuxtImg> / <NuxtPicture> |
@nuxt/fonts | self-hosted web fonts with fallback metric overrides (the CLS fix) |
@nuxt/scripts | third-party scripts with load triggers and facades |
@nuxt/icon | icon component with server and client bundles |
@nuxt/eslint | project-aware flat ESLint config, including the Nuxt-specific rules |
@nuxt/test-utils | fixture E2E plus the Vitest nuxt environment |
@nuxt/devtools | in-app inspector: payload, components, hooks, timings |
@pinia/nuxt | state management; createPinia() per app instance on the server |
@nuxtjs/i18n | routing-aware internationalisation; cooperates through hooks |
nuxt-auth-utils | session helpers and providers for auth |
@nuxtjs/tailwindcss | Tailwind integration; with Tailwind v4 the CSS-first setup often replaces it |
nuxt-security | security headers and CSP |
@nuxtjs/color-mode | light and dark handling used by many UI layers |
npx nuxt upgrade --dedupe # upgrade Nuxt and flatten duplicate installs
npx nuxt module add <name> # install and register a module
npx nuxt typecheck # vue-tsc against the generated tsconfigs
npx nuxt analyze # client and server bundle treemaps
npx nuxt prepare # regenerate .nuxt types (what postinstall runs)
npx nuxt info # environment report to paste into a bug report
npx nuxt devtools enable # toggle DevTools for a project
The three Vue 3.5 APIs, in the shape a layer author uses them:
<script setup lang="ts">
const { label, hint } = defineProps<{ label: string, hint?: string }>()
// Stable across server and client: no hydration mismatch on the label/input association.
const id = useId()
const input = useTemplateRef<HTMLInputElement>('input')
defineExpose({ focus: () => input.value?.focus() })
</script>
<template>
<div class="field">
<label :for="id">{{ label }}</label>
<input :id="id" ref="input">
<!-- A deliberately client-formatted value: whitelist the mismatch instead of wrapping in ClientOnly -->
<p v-if="hint" data-allow-mismatch="text" class="hint">{{ hint }}</p>
</div>
</template>
"Vue 3.6 with Vapor mode is out" is the kind of statement an interviewer can disprove from their phone. Say what you know ("3.5 is what Nuxt 4 uses; 3.6 was in release candidates last I looked") and it reads as rigour rather than ignorance.
The current stable Vue version and whether 3.6 (Vapor mode) has shipped. Check the tags the week of the interview.
docs ↗useId() and confirm the server HTML and the client render agree.nuxt info on the playground and read every line. Knowing what it reports makes you faster at triaging consumer bug reports."Four. useId gives identifiers that agree between server and client, which removes a whole class of hydration mismatches in shipped form components. Lazy hydration strategies let a component render on the server but hydrate on visibility, idle or interaction, which moves hydration CPU off the critical path. data-allow-mismatch whitelists a mismatch you genuinely expect, such as a client-formatted timestamp, instead of reaching for <ClientOnly> and losing the server render. And reactive props destructure removes a common source of subtle bugs in library components. Vue 3.6 with Vapor mode was still in release candidates when I last checked."