Nuxt.js Versions Save

The Intuitive Vue Framework.

v3.9.1

3 months ago

3.9.1 is a regularly scheduled patch release.

✅ Upgrading

As usual, our recommendation for upgrading is to run:

nuxi upgrade --force

This will refresh your lockfile as well, and ensures that you pull in updates from other dependencies that Nuxt relies on, particularly in the vue and unjs ecosystems.

👉 Changelog

compare changes

🔥 Performance

  • nuxt: Avoid multiple iterations in useRequestHeaders (#24853)
  • kit,schema,nuxt: Refactor startsWith to array access (#24744)
  • nuxt: Use single iteration when normalising routes (#24946)
  • nuxt: Remove some line breaks when rendering html (#24888)

🩹 Fixes

  • nuxt: Catch error in NuxtErrorBoundary with ssr: false (#24896)
  • kit: Show correct error when module can't be loaded (#24957)
  • nuxt: Deeply watch island props (#24986)
  • nuxt: Don't show transition on initial page load (#24935)
  • nuxt: Clone cookie to detect changes within object (#25007)
  • nuxt: Do not warn about missing layouts on error page (#25008)
  • nuxt: Ignore plugins typed as any in inferred injections (#25010)
  • nuxt: Reuse intermediate setup state in <ClientOnly> (#25009)
  • nuxt: Skip scanning layout/middleware without name (#25015)
  • nuxt: Wrap universal router currentRoute in Ref (#25026)
  • nuxt: Stop loading indicator if page keys are the same (#24931)

💅 Refactors

  • nuxt: Remove old reference to nuxt-config-schema (#25067)

📖 Documentation

  • Switch features/future docs (f5676fba5)
  • Corrected json syntax in 7.esm.md (#24937)
  • Specify yarn pnp opt-out for install (#24923)
  • Capitalise hash for vue-router docs link (#24948)
  • Add badge for callOnce utility (792cf6713)
  • Warn about hydration issue with URL fragment (#24961)
  • Mention readValidatedBody and getValidatedQuery (#24990)
  • Add missing imports for nitro examples (#25003)
  • Add an example of provide with object syntax plugins (#24993)
  • Update EOL date for Nuxt 2 (afbc4080b)
  • Add callout for getValidatedRouterParams (#25057)
  • Warn about ref unwrapping when providing refs from plugin (#25054)

🏡 Chore

  • Add bullet for adding tests in pr template (2bda817ea)

✅ Tests

  • Add missing payload checks (#24899)
  • Start listening for requests earlier (#24985)

❤️ Contributors

  • Pooya Parsa (@pi0)
  • Julien Huang (@huang-julien)
  • Michael Brevard (@GalacticHypernova)
  • Luke Nelson (@luc122c)
  • Alex Liu (@Mini-ghost)
  • Daniel Roe (@danielroe)
  • Alireza Jahandideh (@Youhan)
  • Mateusz Kulpa (@mateuszkulpa)
  • Bernhard Berger (@bernhardberger)
  • Peter (@tada5hi)
  • Sébastien Chopin (@Atinux)
  • heygsc (@heygsc)
  • Clément Ollivier (@clemcode)
  • Soheil Nazari (@s0h311)
  • Alexander Lichter (@manniL)

v3.9.0

4 months ago

3.9.0 is the next minor release.

👀 Highlights

A very merry Christmas to you and yours from all Nuxters involved in this release! 🎁🎄

We have lots of features packed into v3.9.0 and can't wait for you to try them out.

⚡️ Vite 5

This release comes with Vite 5 and Rollup 4 support. Module authors may need to check to ensure that any vite plugins you're creating are compatible with these latest releases.

This comes with a whole host of great improvements and bug fixes - check out the Vite changelog for more info.

✨ Vue 3.4 ready

This release is tested with the latest Vue 3.4 release candidate, and has the necessary configuration to take advantage of new features in Vue 3.4, including debugging hydration errors in production (just set debug: true) in your Nuxt config.

👉 To take advantage, just update your vue version once v3.4 is released, or try out the release candidate today:

{
  "dependencies": {
    "nuxt": "3.9.0",
    "vue": "3.4.0-rc.1",
    "vue-router": "latest"
  }
}

🏝️ Interactive Server Components

This is a highly-experimental update, but it's now possible to play around with interactive components within Nuxt server components. You'll need to enable this new feature additionally to component islands:

export default defineNuxtConfig({
  experimental: {
    componentIslands: {
      selectiveClient: true
    }
  }
})

Now, within a server component, you can specify components to hydrate by using the nuxt-client directive:

<NuxtLink :to="/" nuxt-client />

We're pretty excited about this one - so do let us know how you're using it! 🙏

🔥 Automatic Server Optimisations

We now use Vite's new AST-aware 'define' to perform more accurate replacements on server-side code, meaning code like this will no longer throw an error:

<script setup lang="ts">
if (document) {
  console.log(document.querySelector('div'))
}
</script>

This hasn't been possible until now because we haven't wanted to run the risk of accidentally replacing normal words like document within non-JS parts of your apps. But Vite's new define functionality is powered by esbuild and is syntax-aware, so we feel confident in enabling this functionality. Nevertheless, you can opt out if you need to:

export default defineNuxtConfig({
  hooks: {
    'vite:extendConfig' (config) {
      delete config.define!.document
    }
  }
})

🚦 Granular Loading API

We now have a new hook-based system for <NuxtLoadingIndicator>, including a useLoadingIndicator composable that lets you control/stop/start the loading state. You can also hook into page:loading:start and page:loading:end if you prefer.

You can read more in the docs and in the original PR (#24010).

🏁 Run single events in callOnce

Sometimes you only want to run code once, no matter how many times you load a page - and you don't want to run it again on the client if it ran on the server.

For this, we have a new utility: callOnce (#24787).

<script setup>
const websiteConfig = useState('config')

await callOnce(async () => {
  console.log('This will only be logged once')
  websiteConfig.value = await $fetch('https://my-cms.com/api/website-config')
})
</script>

Note that this utility is context-aware so it must be called in component setup function or Nuxt plugin, as with other Nuxt composables.

Read more in the docs.

🚨 Error Types

For a while now, errors returned by useAsyncData and useFetch have been typed pretty generically as Error. We've significantly improved the type possibilities for them to make them more accurate in terms of what you'll actually receive. (We normalise errors with the h3 createError utility under the hood, so they can be serialised from server to client, for example.)

We've tried to implement the type change in a backwards compatible way, but you might notice that you need to update the generic if you're manually configuring the generics for these composables. See (#24396) for more information, and do let us know if you experience any issues.

🔥 Schema Performance

We've taken some time in this release to make some minor performance improvements, so you should notice some things are a bit faster. This is an ongoing project and we have ideas for improving initial load time of the Nuxt dev server.

✅ Upgrading

As usual, our recommendation for upgrading is to run:

nuxi upgrade --force

This will refresh your lockfile as well, and ensures that you pull in updates from other dependencies that Nuxt relies on, particularly in the unjs ecosystem.

👉 Changelog

compare changes

🚀 Enhancements

  • nuxt: Warn when page uses a layout without <NuxtLayout> (#24116)
  • kit: Support prepend option for addComponentsDir (#24309)
  • kit: Allow customising logger options (#24243)
  • nuxt: Allow readonly option for useCookie (#24503)
  • nuxt: Add path to error.data when throwing 404 errors (#24674)
  • kit: Load /module or /nuxt module subpath if it exists (#24707)
  • nuxt: Layers support for spa loading template (#24709)
  • nuxt: Expose refresh on islands and server components (#24261)
  • nuxt: Add dedupe option for data fetching composables (#24564)
  • vite: Replace browser globals with undefined on server (#24711)
  • nuxt: Allow plugins to specify dependencies (#24127)
  • kit: Add new addServerScanDir composable (#24001)
  • nuxt: Transform setup within defineComponent options (#24515)
  • nuxt: Allow customising fallback layout (#24777)
  • nuxt: useRequestHeader utility (#24781)
  • nuxt: Move loading api behind hooks (#24010)
  • nuxt: Add callOnce util to allow running code only once (#24787)
  • nuxt: Allow client components within NuxtIsland (#22649)
  • schema: Default to bundler module resolution (#22821)
  • kit,nuxt,vite,webpack: Add toArray util (#24857)

🔥 Performance

  • vite: Avoid duplicate resolve operation (#24736)
  • nuxt: Avoid duplicate iterations over layers (#24730)
  • kit: Avoid duplicate join operation (#24717)
  • vite: Simplify manifest property acccess (#24715)
  • nuxt: Don't dedupe fewer than two middleware/plugins (#24718)
  • schema: Avoid duplicate get operations (#24734)
  • schema: Use parallel promises (#24771)
  • nuxt: Avoid duplicate useRuntimeConfig call (#24843)
  • vite: Avoid duplicate JSON.stringify operation (#24848)

🩹 Fixes

  • nuxt: Avoid recursive ssr errors (#24399)
  • nuxt: Improve path resolve for import.d.ts (#24413)
  • nuxt: Remove experimental reactivityTransform (vue 3.4) (#24477)
  • nuxt: Ignore manifest when prerendering (#24504)
  • nuxt: Don't strip literals from template in <DevOnly> (#24511)
  • vite: Use isBuiltin polyfill for greater node support (#24512)
  • nuxt: Island components with number prefix (#24469)
  • nuxt: Use consistent annotations for tree-shaking (#24514)
  • nuxt: Skip prerendering all pages in hash mode (#24517)
  • nuxt: Skip router middleware/redirections for islands (#24421)
  • nuxt: Remove trailing slash before checking if prerendered (#24516)
  • nuxt: Skip check for <NuxtLayout> usage in islands (#24529)
  • vite,webpack: Don't add type checker/analyzer when testing (#24608)
  • nuxt: Do not try auto-install outside of a Nuxt context (#24605)
  • nuxt: Merge and apply layer hooks (#24639)
  • nuxt: Only add/remove trailing slash for http protocols (#23296)
  • nuxt: Ensure error in useAsyncData has correct type (#24396)
  • nuxt: Add appManifest middleware after modules run (#24786)
  • nuxt: Revert async transform of setup within defineComponent (#24784)
  • nuxt: Eager load island components map (#24584)
  • nuxt: Register override hooks separately (#24833)
  • nuxt: Add __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ (#24836)
  • kit: Auto-detect mode from filePath for addComponent (#24835)
  • schema: Revert bundler module resolution due to lack of support (22ce98d61)
  • kit: Don't add local ~/modules dirs to modulesDir (#24457)

💅 Refactors

  • nuxt: Use defineComponent to infer prop types for router-link stub (dc0e8347b)
  • nuxt: Opt-in to future jiti.import for schema (#24526)
  • nuxt: Remove process.* usage in nuxt vue app (#24749)
  • schema: Introduce future and features namespace (#24880)

📖 Documentation

  • Fix typo (#24395)
  • Update code to show how to enable typedPages (#24436)
  • Add defineNuxtConfig to deployment example (#24451)
  • Update link to more info about key/keepalive (1b1cc4f4e)
  • Update Nuxt 2 EOL date in roadmap (#24602)
  • Prefer ~ to @ alias in examples (#24574)
  • Fix typo (6a1c05401)
  • Warn about using differently names env variables (#24612)
  • commands: Add tunnel option (50d46f068)
  • Add file name to code block (#24620)
  • Remove linking to nuxt-themes org (6f44e9470)
  • Update yarn -o option to --open (#24644)
  • Add alt text for roadmap img tags (1f1049858)
  • Add missing props for <NuxtPage> (#24675)
  • Add more info about custom serialize/revive (#24680)
  • Fix grammar (#24737)
  • Add documentation on getCachedData option (#24697)
  • Fix addServerScanDir example (7cd02e290)
  • Add panda css to styling guide (#24178)
  • Highlight the possibility of middleware to return nothing (#24241)
  • Setting middleware at build time (#23480)
  • Remove deprecated loadNuxt options (#24201)
  • Improvements on data-fetching (6d50b4744)
  • Add documentation for nuxi module (#24790)
  • Update return for useFetch and useAsyncData #24407 (#24775, #24407)
  • Add docs for runtime test environment (#24658)
  • Update example test snapshots to remove escapes (5de779a7d)
  • Add addComponentsDir example to modules author guide (#24876)

🏡 Chore

  • Update variable in release scripts (258b8a706)
  • Import types from '#app' (#24418)
  • Update markdownlintignore (1abb5479c)
  • Update vitest dependencies (#24659)
  • Pin rollup to v4 (#24814)
  • nuxt: Add return type for entry (#24821)
  • Use dev:prepare instead of build:stub (802b3e28c)

✅ Tests

  • Re-enable accidentally disabled unit tests 🙈 (b443de230)
  • Add basic benchmark tests (#24846)
  • Update vitest coverage exclusions (a46b0c876)

🤖 CI

  • Don't skip releases based on commit body (#24554)
  • Label pull requests based on their target branch (#24468)
  • Update options for GitHub app token generation (#24565)
  • Notify nuxt/bridge when composables change (#24752)
  • Don't run benchmark on main commits by default (064615e8c)
  • Temporarily disable codspeed (a39d311d3)

❤️ Contributors

  • Daniel Roe (@danielroe)
  • Damian Głowala (@DamianGlowala)
  • Isaac Qadri (@pmnzt)
  • Michael Brevard (@GalacticHypernova)
  • Bobbie Goede (@BobbieGoede)
  • Becem (@becem-gharbi)
  • Julien Huang (@huang-julien)
  • Sébastien Chopin (@Atinux)
  • Harlan Wilton (@harlan-zw)
  • Victor Akintunde (@akintoluvic)
  • Nathanaël Labreuil (@IonianPlayboy)
  • Ryota Watanabe (@wattanx)
  • Michael Cole (@MichaelJCole)
  • Kekeocha Justin Chetachukwu (@justinkekeocha)
  • Ewen Quimerc'h (@EwenQuim)
  • Abraham (@anubra266)
  • Luke Nelson (@luc122c)
  • Eugen Guriev (@theguriev)
  • Chris Bailey (@chris-bailey)
  • Alper Doğan (@doganalper)
  • Jamie Trip (@Jamie4224)
  • Alexander Lichter (@manniL)
  • Idorenyin Udoh (@idorenyinudoh)
  • Phojie Rengel (@phojie)
  • GJSSSS (@gjssss)
  • Xxhls (@xxhls)
  • Marco Solazzi (@dwightjack)
  • Lehoczky Zoltán (@Lehoczky)
  • RoiLeo (@RoiLeo)
  • Daniel Acuña (@DaniAcu)
  • Sadegh Barati (@sadeghbarati)
  • Anthony Fu (@antfu)
  • Kostis Maninakis (@maninak)
  • Pooya Parsa (@pi0)
  • MaxMonteil (@MaxMonteil)

v3.8.2

5 months ago

3.8.2 is a patch release focusing on bug fixes

👀 Highlights

3.8.2 is a patch release and we've deferred some exciting features in our next release (3.9.0, expected in December) but it does bring a significant Nitro minor release: v2.8.0. It's well worth checking out the release notes.

👉 Note that as Nitro has updated to rollup v4, but as Nuxt's vite dependency is still on rollup v3 until v3.9, you may experience type mismatches in modules or your projects if you are dependent on particular rollup plugins or plugin types.

✅ Upgrading

As usual, our recommendation for upgrading is to run:

nuxi upgrade --force

This will refresh your lockfile as well, and ensures that you pull in updates from other dependencies that Nuxt relies on, particularly in the unjs ecosystem.

👉 Changelog

compare changes

🩹 Fixes

  • vite: Skip warming up node builtins (#24162)
  • vite: Provide default values for transformAssetUrls (#24173)
  • nuxt: Wrap caught asyncData error in createError (#24093)
  • nuxt: Include plugin templates in plugins.d.ts if they will be written (#23943)
  • nuxt: Handle multi-line slots in islands (#24212)
  • nuxt: Fix replace regex used for slots in islands SSR (#24255)
  • vite: Use rollup replace plugin for typeof optimisations (#23903)
  • nuxt: Provide route component names to KeepAlive cache (#24024)
  • schema: Use scule types for runtimeConfig type hints (#23696)
  • nuxt: Deeply unwrap headers/query for useFetch key (#24307)
  • nuxt: Split component name case in each segment (#24318)
  • nuxt: Do not compute useFetch key from headers (#23462, #24333)
  • nuxt: Set framework info for nitro (#24340)
  • schema: Add type for ignoreOptions (#24337)
  • nuxt: Log errors rendering islands (#24356)
  • nuxt: Respect custom timeout in useFetch (#24364)
  • nuxt: Use max length + iterations for useCookie timeout (#24253)
  • nuxt: Handle errors when booting app with app:error (#24376)

📖 Documentation

  • Remove unused import from example (#24168)
  • Create a page explaining import.meta (#24186)
  • Remove link to .nuxtrc in nuxt/starter (56147b4a8)
  • Correct spelling from "opiniated" to "opinionated" (#24248)
  • Mention new defineNuxtPlugin syntax in bridge migration (#23036)
  • Mention nuxt3-vuex-module in migration guide (#24260)
  • Fix links to other auto-imports pages (#24269)
  • Remove only (#24295)
  • Update link to deno deploy provider docs (88ee7b7ea)
  • Typos and wording tweaks for getting started section (#24319)
  • Update .gitignore in directory structure (#24338)
  • Add hint about app.config placement with custom srcDir (#24252)
  • Typos and wording tweaks for guide section (#24323)
  • Remove path for <ContentDoc> in example (#24244)
  • Mention changing directory in installation guide (#23680)
  • Use @nuxt/kit-nightly in example (bdedc3207)
  • Update nuxi-edge to nuxi-nightly (#24347)
  • Minor wording & formatting tweaks (#24349)
  • Add AWS Amplify Hosting to hosting providers (#24371)
  • Fix typo (#24375)
  • Simplify to deployments page (13b93237e)
  • Update to /deploy url (751dad7d7)
  • Improve readme (07ab072bc)

🏡 Chore

  • Extract @nuxt/test-utils to separate repo (#24146)
  • Remove stray router.options file (7fbcaf290)
  • Fix repository fields in package.json (54529c17d)
  • Add homepage and repo directory to package.jsons (#24189)
  • Update to use @nuxt/eslint-config (#24209)
  • Revert coverage provider version (b90b631df)

✅ Tests

  • Add route-provider e2e test (#24195)
  • nuxt: Add additional unit tests for composables (#24289)

❤️ Contributors

  • Anthony Fu (@antfu)
  • Sébastien Chopin (@Atinux)
  • Christian Gil (@ChrisGV04)
  • Clément Ollivier (@clemcode)
  • Luke Nelson (@luc122c)
  • Siegerts (@siegerts)
  • Julien Huang (@huang-julien)
  • Joe Hawes (@morehawes)
  • Alexander Lichter (@manniL)
  • Daniel Roe (@danielroe)
  • Damian Głowala (@DamianGlowala)
  • Pooya Parsa (@pi0)
  • Boby Tiwari (@Boby900)
  • Sita (@Pitabread8)
  • Nils Wiesinger (@warflash)
  • Webfansplz (@webfansplz)
  • Aaron_Zhou (@Clarkkkk)
  • 56 (@Nationalcat)
  • Adrien Zaganelli (@adrienZ)
  • Alonge Akintomide (@tomidealonge)
  • Nasser BOUKEHIL (@nasrob)
  • Passionate-bram (@passionate-bram)
  • Maxime Pauvert (@maximepvrt)
  • Dario Ferderber (@darioferderber)
  • Brendan Mulholland (@bmulholland)

v3.8.1

5 months ago

3.8.1 is a patch release focused on bug fixes and performance improvements.

👉 Changelog

compare changes

🔥 Performance

  • nuxt: Set pages on nuxt app and deduplicate calls (#24032)
  • nuxt: Remove pure annotations plugin (#24033)
  • nuxt: Use granular imports for auto-importing composables (#23951)

🩹 Fixes

  • nuxt: Ensure we add prerender hints to correct event (#23799)
  • nuxt: Close payload object (#23817)
  • schema: Accept single string for extends (#23795)
  • nuxt: Resolve internal target: blank links with base (#23751)
  • nuxt,schema: Use std-env to detect whether app is being tested (#23830)
  • nuxt: Use .json extension for server components (#23802)
  • nuxt: Handle relative baseURL in nitro runtime config (#23841)
  • nuxt: Improve watcher logs slightly (#23857)
  • nuxt: Resolve @unhead/vue in template code (#23858)
  • kit: Resolve module tsconfig paths relative to dirs (#23860)
  • nuxt,schema,vite,webpack: Analyze w/o overriding config (#23856)
  • nuxt: Don't use local fetch with an external baseURL (#23884)
  • nuxt: Only skip refetching errors when hydrating (#23889)
  • webpack: Use lodash cloneDeep again (#23888)
  • nuxt: Init $fetch at entry start (#23906)
  • nuxt: Render a div when client-only hydrates w/o element (#23899)
  • vite: Remove postcss-url and duplicate postcss-import (#23861)
  • nuxt: Use route key for loading indicator/view transition (#23868)
  • nuxt: Unset useCookie value when it expires (#23549)
  • vite: Use h3 cors handler for vite routes only (#23995)
  • schema: Correctly set default cssnano config (#23980)
  • nuxt: Use payload url for isPrerendered, not current route (#24031)
  • vite: Don't warm up css deps and normalise urls correctly (#23975)
  • kit: Fix addServerImportsDir implementation (#24000)
  • nuxt: Preserve hyphens in component/layout kebab names (#23902)
  • nuxt: Do not register loading indicator hooks on server (#24052)
  • nuxt: Reload nitro when spa loading template updates (#24036)
  • nuxt: Resolve imports from virtual files (#24022)
  • vite: Include more of warmup within try/catch (#24072)
  • nuxt: Use shared isChangingPage util in scrollBehavior (#24091)
  • nuxt: Account for delay ≤ 0 in useCookie (#24043)
  • nuxt: Handle async children in ClientFallback (#24086)
  • vite: Normalise entry id for typeCheck plugin (#24114)

💅 Refactors

  • nuxt: Use useRequestEvent() internally (#23916)

📖 Documentation

  • Add example of auto-importing components from npm package (#23792)
  • Update minimum required Node version (#23821)
  • getting-started: Add schema for server (6d0f45469)
  • Fix typo in pnpm install command (#23851)
  • Add missing comma (#23870)
  • Add missing nitro hooks (#23865)
  • Fix typo in layout description (#23862)
  • Fix typo in runtime-config page (#23882)
  • Fix typo (#23912)
  • Fix typos (#23921)
  • Rename 3.nuxt.config.md to 3.nuxt-config.md (#23819)
  • composables: Avoid double read-more in useAppConfig (5fea17288)
  • Skip View Transitions API route middleware on server (#23935)
  • Clarify that bridge supports definePageMeta (#23944)
  • Fix small typo in nuxt.config.ts documentation (#23961)
  • Update link to composables doc (#23989)
  • Add a more helpful comment (#23999)
  • Fix useFetch key generation logic (#24082)
  • Fix typo (#24099)
  • Fix imported addPrerenderRoutes name (#24102)
  • Improve router docs on nuxt-injected options (#24126)

🏡 Chore

✅ Tests

  • nuxt: Test remote islands for NuxtIsland (#23801)
  • Update basic fixture config for vite 5 (#23859)
  • Await before asserting console logs (#24051)

🤖 CI

  • Add doc deploy webhook trigger (#23828)
  • Run nuxt 2 edge release on node 18 (5b96049d9)

❤️ Contributors

  • Fabian B (@madebyfabian)
  • Mehdi Lahlou (@medfreeman)
  • Webfansplz (@Webfansplz)
  • Damian Głowala (@DamianGlowala)
  • Andrey Yolkin (@AndreyYolkin)
  • Vasilis Souvatzis (@vasisouv)
  • Daniel Roe (@danielroe)
  • Marco Solazzi (@dwightjack)
  • NiJia Lin (@louis70109)
  • Hugo Torzuoli (@HZooly)
  • Mathieu ALBIN (@jaegar-wolf)
  • Julien Huang (@huang-julien)
  • Jaap Roes (@jaap3)
  • Ryota Watanabe (@wattanx)
  • Sébastien Chopin (@Atinux)
  • Hossein-moghadam (@hosseinmoghaddam)
  • Bastien Rossi (@bastienrossi)
  • Ordago (@ordago)
  • Jeffrey GONZALES (@jgonz3)
  • Anthony Fu (@antfu)
  • Leonard Mihalcea (@LeVoMihalcea)
  • Paulo Pertierra (@paulo-pertierra)
  • Conner (@connerblanton)
  • KeJun (@KeJunMao)
  • Bjorn Lu (@bluwy)
  • Salman Khattak (@khattaksd)
  • Luke Nelson (@luc122c)
  • Jianqi Pan (@Jannchie)
  • Matej Černý (@CernyMatej)

v2.17.2

6 months ago

👉 Changelog

compare changes

🩹 Fixes

  • types: Prevent overwriting vue types in template (#22802)
  • types: Don't pin webpack types to exact version (#23531)
  • Remove md4 patch now that webpack has it in core (#23703)

🤖 CI

  • Add script to update changelog for 2.x releases (#23031)
  • Revert to codecov-action v3 (e66e44803)
  • Remove node version from matrix (#23706)
  • Use node 18 for ci jobs (#23701)

❤️ Contributors

  • Daniel Roe (@danielroe)
  • Rafał Chłodnicki (@rchl)

v3.8.0

6 months ago

👀 Highlights

We have a lot of exciting features in v3.8, and can't wait for you to try it out.

💻 Nuxi improvements

Just to remind you, we're now using the new Nuxt CLI which is now versioned separately. There are some exciting improvements there to follow, so do check out the latest releases. (For example, we now share the same port with the Vite websocket, meaning better support for docker containers in development.)

🚨 Built-in Nuxt DevTools

Nuxt DevTools v1.0.0 is out and we now think it's ready to be shipped as a direct dependency of Nuxt.

👉 You can check out the release notes for more information - and stay tuned for an article detailing our roadmap for the future.

📸 Nuxt Image auto-install

We've now made <NuxtImg> and <NuxtPicture> first-class built-in components, documenting them and auto-installing @nuxt/image the first time that they are used (#23717).

https://github.com/nuxt/nuxt/assets/28706372/597c9307-5741-4d9c-8eab-aad5bfef2ef2

We would definitely advise using @nuxt/image if you're using images in your site; it can apply optimisations to make your site more performant.

📂 Deeper layout scanning

🚨 This is a behaviour change so do take care with this one: 🚨

We now support scanning layouts within subfolders in ~/layouts in the same way as we do with ~/components.

File Layout name
~/layouts/desktop/default.vue 'desktop-default'
~/layouts/desktop-base/base.vue 'desktop-base'
~/layouts/desktop/index.vue 'desktop'

See #20190 for more information

📊 App Manifest

We now support a built-in app manifest (see #21641), which generates a manifest at /_nuxt/builds/meta/<buildId>.json.

Initially this enables loading payloads only for prerendered routes, if a site is static (preventing 404s). It also enables client-side route rules. To begin with, only redirect route rules will have an effect; they will now redirect when performing client-side navigation. (More coming soon...!)

The app manifest also enables future enhancements including detection of outdated deployments by checking /_nuxt/builds/latest.json.

You can switch off this behaviour if you need to (but do let us know if you have any issues):

export default defineNuxtConfig({
  experimental: {
    appManifest: false
  }
})

🤝 Scope and context improvements

We now define a 'scope' for Nuxt composables executed in plugins (#23667), which allows running synchronous cleanup before navigating away from your site, using the Vue onScopeDispose lifecycle method. This should fix an edge case with cookies (#23697) and also improves memory management, for example in Pinia stores (#23650). You can read more about Vue effect scopes.

We also now support native async context for the Vue composition API (#23526). In case you're unaware, we support native async context on Node and Bun, enabled with experimental.asyncContext. This can help address issues with missing a Nuxt instance. But it didn't previously affect missing Vue instances.

If you experience issues with 'Nuxt instance unavailable', enabling this option may solve your issues, and once we have cross-runtime support we are likely to enable it by default.

export default defineNuxtConfig({
  experimental: {
    asyncContext: true
  }
})

We've supported defining your own NuxtLink components with the defineNuxtLink utility. We now support customising the options for the built-in <NuxtLink>, directly in your nuxt.config file (#23724). This can enable you to enforce trailing slash behaviour across your entire site, for example.

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

⚡️ Data fetching improvements: deep and caching

We have two very significant new features for useAsyncData and useFetch:

  1. You can now set deep: false to prevent deep reactivity on the data object returned from these composables (#23600). It should be a performance improvement if you are returning large arrays or objects. The object will still update when refetched; it just won't trigger reactive effects if you change a property deep within the data.
  2. You can now use the getCachedData option to handle custom caching for these composables (#20747)
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]
})

We also support configuring some default values for these composables in an app-wide way (#23725):

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

🔢 Layer improvements

We now more carefully load layer plugins (#22889 and #23148) and middleware (#22925 and #23552) in the order of the layers, always loading your own plugins and middleware last. This should mean you can rely on utilities that layers may inject.

We've also added a test suite to cover these layer resolution changes.

And probably one of the most significant changes - if you are using remote layers we now clone these within your node_modules/ folder (#109) so layers can use dependencies with your project. See c12 release notes for full details.

😴 Nightly release channel

Every commit to the main branch of Nuxt is automatically deployed to a new release, for easier testing before releases. We've renamed this from the 'edge release channel' to the 'nightly release channel' to avoid confusion with edge deployments. And probably also with Microsoft Edge (though I haven't heard that anyone was confused with that one!)

➡️ nuxt3 is now nuxt-nightly ➡️ nuxi-edge is now nuxi-nightly ➡️ @​nuxt/kit-edge is now @​nuxt/kit-nightly

... and so on.

You can read more about how it works.

⚗️ Nitro v2.7

Nitro v2.7 has been released with lots of improvements and bug fixes - do check out the full changelog.

🔥 One of the most significant is that we now save ~40% of bundle size in production by using native fetch (which is supported in Node 18+) (#1724). So if possible, we'd recommend you update your Node version to at least 18.

💪 Type import changes

🚨 This is likely to need code changes in your project 🚨

Vue requires that type imports be explicit (so that the Vue compiler can correctly optimise and resolve type imports for props and so on). See core Vue tsconfig.json.

We've therefore taken the decision to turn on verbatimModuleSyntax by default in Nuxt projects, which will throw a type error if types are imported without an explicit type import. To resolve it you will need to update your imports:

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

You may also encounter modules in the Nuxt ecosystem that need to be updated; please open an issue for those modules. I'm also very happy to help if you're encountering any problems with this, if you're a module author. Just tag me and I'll take a look.

If for whatever reason you need to undo this change in your project you can set the following configuration:

export default defineNuxtConfig({
  typescript: {
    tsConfig: {
      compilerOptions: {
        verbatimModuleSyntax: false
      }
    }
  }
})

However, we'd recommend only doing that temporarily, as Vue does need this option to be set for best results.

✅ Upgrading

As usual, our recommendation for upgrading is to run:

nuxi upgrade

👉 Changelog

compare changes

🚀 Enhancements

  • kit: Add addServerImports and addServerImportsDir (#23288)
  • nuxt: Warn when nesting nuxt links when SSR on dev (#23286)
  • nuxt: Add prerenderRoutes ssr composable (#22863)
  • nuxt: Enable appManifest by default (#23448)
  • nuxt: Native async-context in vue's withAsyncContext (#23526)
  • nuxt: Auto-install optional features on StackBlitz (#23607)
  • kit,nuxt,vite,webpack: Support -nightly extension (#23508)
  • nuxt: Add @nuxt/devtools as dependency and enable (#23576)
  • nuxt: Support deep: false for data composables (#23600)
  • nuxt: Custom cache support for data fetching composables (#20747)
  • nuxt: Scan and register layouts in nested folders (#20190)
  • nuxt: Prompt to autoinstall @nuxt/image when it is used (#23717)
  • nuxt: Allow configuring default <NuxtLink> options (#23724)
  • nuxt: Allow customising defaults for data composables (#23725)

🔥 Performance

  • vite: Don't print server compressed size after vite build (#23359)
  • nuxt: Verbatim module syntax + restrict type discovery (#23447)

🩹 Fixes

  • nuxt: Initialise asyncData errors with null (#23428)
  • nuxt: Apply scoped styles to islands (#23386)
  • nuxt: Rename stub to avoid shadowing vue-router (#23440)
  • nuxt: Stringify cookie values before broadcasting them (#23449)
  • kit: Don't force config.autoImport in addServerImports (#23472)
  • nuxt: Ignore prefix if clearNuxtState called w/o keys (#23483)
  • nuxt: Decrement hydration count when rendering no route (#23476)
  • nuxt: Compute fetch cache key with headers (#23462)
  • nuxt: Mock hookable methods on nuxt 2 (#23502)
  • kit: Revert accidental change to addPrerenderRoutes name (#23509)
  • nuxt: Use test/dev as manifest buildId when appropriate (#23512)
  • nuxt: Don't print warnings for unresolved ids (#23604)
  • nuxt: Use import alias when checking if plugin is wrapped (#23617)
  • nuxt: Tree shake all occurrences of <DevOnly> (#23466)
  • nuxt: Give priority to later middleware when deduping (#23552)
  • nuxt: Clear cookie BroadcastChannel when scope is disposed (#23664)
  • nuxt: Provide global scope for nuxt plugin context (#23667)
  • nuxt: Resolve type error in options of useFetch (#23693)
  • webpack: Remove lodash-es + simplify postcss resolution (#23692)
  • nuxt: Skip hydration mismatches with client components (#19231)
  • nuxt: Write cookie values before navigating away (#23697)
  • nuxt: Refetch both undefined/null values in useAsyncData (#23351)
  • nuxt: Don't mark redirected routes as prerendered (#23707)
  • nuxt: Respect custom export in component transform (#23715)
  • nuxt: Don't use prerenderedAt to override app manifest (#23781)
  • nuxt: Restore prerenderedAt behaviour pending next patch (108b1bdf7)

📖 Documentation

  • Mention listhen options on nuxi dev page (#23415)
  • Add examples for index.ts files on server routes (#23390)
  • Improve data fetching section (#23420)
  • Remove duplicated arrows (#23436)
  • Extend description of handler for useAsyncData (#23389)
  • Clarify bridge needs nitro to use runtimeConfig (#23454)
  • Fix typo in README (#23500)
  • Clarify that bridge.typescript option must be set. (#23503)
  • Use html instead of xml for highlight (45c1e7f51)
  • Fix component library example in docs (#23596)
  • Typo in modules (#23602)
  • Reword local module info (#23557)
  • Add server concept (#23372)
  • Improve nuxt kit section (#22375)
  • Update additional mentions to nightly release channel (c63f9a95d)
  • Rename /edge-channel page to /nightly-release-channel (#23648)
  • Add section about computed url for data fetching (#23605)
  • Fix typo (#23656)
  • Remove extraneous brace (b9cb08cda)
  • Fix other issues with routeRules example (818dc626c)
  • Fix typo (#23716)
  • Update types for useFetch/useAsyncData (#23730)
  • Add info about <NuxtImg> and <NuxtPicture> (#23741)
  • Update to new website (#23743)
  • Remove redundant trailing slashes from links (#23744)
  • Fix broken link (#23750)

🏡 Chore

  • Fix various typos and update to US English (#23580)
  • Add description field for packages (#23734)
  • Bump nuxt devtools to 1.0 (#23752)
  • Allow markdownlint upgrades (3d779fcf3)
  • Remove huntr + encourage GitHub vulnerability reporting (#23754)
  • Refresh lockfile (#23755)
  • Update to nitropack 2.7.0 (#23780)
  • Upgrade to c12 1.5 with configurable layers (#23782)

✅ Tests

  • nuxt: Add test suite for app resolution behaviour (#23520)
  • Update prerender test (8d62c2add)

🤖 CI

  • Retry failing links 6 times (ad2a900fd)
  • Only dedupe dependencies if they affect bundle size (#23736)

❤️ Contributors

  • Daniel Roe (@danielroe)
  • Pooya Parsa (@pi0)
  • Anthony Fu (@antfu)
  • Jianqi Pan (@Jannchie)
  • Damian Głowala (@DamianGlowala)
  • Sébastien Chopin (@Atinux)
  • Alexander Lichter (@manniL)
  • @boc-the-git
  • Aleksandar Trpkovski (@Suv4o)
  • Dario Ferderber (@darioferderber)
  • Warflash (@warflash)
  • Julien Huang (@huang-julien)
  • Sacha Stafyniak (@stafyniaksacha)
  • Alex Liu (@Mini-ghost)
  • Orocane (@S1RANN)
  • Italo (@DarkGhostHunter)
  • @maritaria
  • Andrey Yolkin (@Andrey Yolkin)
  • Aaron_Zhou (@Clarkkkk)
  • Estéban (@Barbapapazes)
  • @sheriffderek
  • Eugen Istoc (@genu)
  • Mostafa Said (@i-Said-Code)
  • Ezra Adeyinka (@adeyinkaezra123)
  • Ryota Watanabe (@wattanx)
  • Hendrik Heil (@hendrikheil)
  • @0xflotus
  • Albert Brand (@AlbertBrand)
  • Arsen Goian (@arsengoian)
  • Maxim (@MaxKostenko)
  • Filip Weidemann (@filipweidemann)
  • Toni Engelhardt (@toniengelhardt)

v3.7.4

7 months ago

3.7.4 is a regularly scheduled patch release.

✅ Upgrading

As usual, our recommendation for upgrading is to run:

nuxi upgrade

👉 Changelog

compare changes

🩹 Fixes

  • nuxt: Use original escapes/quotes in page re-exports (#23191)
  • schema: Default devServer host to undefined (#23206)
  • nuxt: Correct islandsTransform slot regex (#23226)
  • nuxt: Handle vite preload-helper id with extension (#23230)
  • nuxt: Load layer middlewares before project middlewares (#22925)
  • nuxt: Don't incl overridden layer pages as nested children (#23238)
  • vite: Explicitly set vite manifest path (#23276)
  • nuxt: Experimental build manifest + client route rules (#21641)
  • nuxt: Generate empty file when shim is disabled (#23333)
  • nuxt: Apply right types to modules and their runtime files (#23240)
  • nuxt: Add import protection for nuxt/* exports (#23357)
  • nuxt: Detect nested pages with /index segments (#23404)
  • schema: Ignore pnpm store directory (3510cedc3)

💅 Refactors

  • nuxt: Use built-in consola prompts (#23205)
  • kit,nuxt,schema: Use consola and improve test dx (#23302)

📖 Documentation

  • Add documentation on nuxt2 command (#23211)
  • Clarify nuxi start command usage (#23215)
  • Close code-block in migration guide (#23224)
  • Typo on callHook method (#23231)
  • nuxt: Remove hanging word in modules docs (#23242)
  • Update latest node.js version to 20.x (#23252)
  • Add more files to srcDir JSDoc (#23250)
  • Add steps for contributing to docs locally (#23270)
  • Add support details and update roadmap (#21867, #21893)
  • Add nuxtApp.runWithContext (#23258)
  • Update 'scheduled' status name (#23307)
  • Fix links to configuration options (#23324)
  • Update link to devtools.nuxt.com (#23350)
  • Add explicit await to clarify sendRedirect is async (#23345)
  • Remove version from npm links to redirect to latest (#23371)
  • Add tryUseNuxt to kit context utils list (#23373)

🏡 Chore

  • Add .devcontainer (#22810)
  • Remove previous e2e crawler script (5d36e5c93)

🤖 CI

  • Add lychee link checker (#23254)
  • Rename linkChecker job to link-checker (#23319)
  • Don't run link checker on pushes to main (e0ddcfa9e)

❤️ Contributors

  • Damian Głowala (@DamianGlowala)
  • Tech Genius (@TechGenius7777)
  • Daniel Roe (@danielroe)
  • Percy Ma (@kecrily)
  • Josh Deltener (@hecktarzuli)
  • Arash (@arashsheyda)
  • Abdul Al-Hasany (@abdul-alhasany)
  • Muhammad Mahmoud (@MuhammadM1998)
  • Pooya Parsa (@pi0)
  • Alex Riviere (@fimion)
  • Default-kaas (@default-kaas)
  • Michel EDIGHOFFER (@edimitchel)
  • Arkadiusz Sygulski (@Aareksio)
  • Joaquín Sánchez (@userquin)
  • Josh Jancourtz (@jcolpal)
  • 翠 / Green (@sapphi-red)
  • Jeremy Graziani (@AcelisWeaven)
  • Julien Huang (@huang-julien)
  • Andrey Yolkin (@AndreyYolkin)
  • Petro Silenius (@PetroSilenius)
  • Ryota Watanabe (@wattanx)

v3.7.3

7 months ago

3.7.3 is a hotfix release to address a regression introduced in 3.7.2.

👉 Changelog

compare changes

🩹 Fixes

  • nuxt: Ensure plugins retain original order (#23174)
  • nuxt: Allow importing server components from #components (#23188)

💅 Refactors

  • nuxt: Don't wrap server placeholders/client fallbacks (#21980)

📖 Documentation

  • Added missing leading slash (#23169)
  • Update internal issue decision making flowchart link (#23162)

❤️ Contributors

  • Daniel Roe (@danielroe)
  • Julien Huang (@huang-julien)
  • Daniel Rivers (@DanielRivers)
  • Tech Genius (@TechGenius7777)

v3.7.2

7 months ago

3.7.2 is a regularly scheduled patch release.

✅ Upgrading

As usual, our recommendation for upgrading is to run:

nuxi upgrade

👉 Changelog

compare changes

🩹 Fixes

  • nuxt: Scroll to top by default on dynamic routes (#22403)
  • nuxt: Don't joinURL with remote sources on NuxtIsland (#23093)
  • nuxt: Exclude data-v attrs from server component props (#23095)
  • nuxt: Handle optional params within a path segment (#23070)
  • nuxt: Include method when creating useFetch auto key (#23086)
  • vite: Add css to manifest without cssCodeSplit (#23049)
  • nuxt: Find parent routes by exact path match (#23040)
  • nuxt: Load spaLoadingTemplate if file exists (#23048)
  • nuxt: Handle unset spa-loading fallback (#23120)
  • kit: Improve generated tsconfig.json defaults (#23121)
  • vite: Remove dev styles injected via absolute path (#23126)
  • nuxt: Default scanned layer components to priority 0 (#23127)
  • nuxt: Allow granularly overriding pages in layers (#23134)
  • nuxt: Respect layer order for other layer plugins (#23148)
  • nuxt: Allow changing dirs within modules (#23133)
  • nuxt: Allow overriding components + only warn if clash (#23156)

📖 Documentation

  • Remove 'caching' section from data fetching (fe29948fe)
  • Fix broken links on experimental features (#23052)
  • Fix typo (#23060)
  • Add name param to PageMeta interface description (#23107)
  • Fix typo for experimental.componentIslands (#23138)
  • Change NuxtLabs UI to Nuxt UI (#23150)
  • Fix typo in nuxi init command (#23155)

🏡 Chore

🤖 CI

  • Test on node 20.5 rather than 20.6 (#23041)
  • Update fixtures to node 18 (#23122)
  • Unpin node 20 actions runners (#23135)

❤️ Contributors

  • Daniel Roe (@danielroe)
  • ML (@ijkml)
  • Tech Genius (@TechGenius7777)
  • Manthankumar Satani (@itsmnthn)
  • David Gonzalez (@davidglezz)
  • Maxime Pauvert (@maximepvrt)
  • Dmitry Istomin (@tirojal)
  • Maxim (@MaxKostenko)
  • Julien Huang (@huang-julien)
  • Sma11X (@Sma11X)
  • Michel EDIGHOFFER (@edimitchel)

v3.7.1

7 months ago

3.7.1 is a regularly scheduled patch release.

✅ Upgrading

As usual, our recommendation for upgrading is to run:

nuxi upgrade --force

This will refresh your lockfile as well, and ensures that you pull in updates from other dependencies that Nuxt relies on, particularly in the unjs ecosystem.

👉 Changelog

compare changes

🔥 Performance

  • nuxt: Prevent head dom from rendering twice (#22974)
  • nuxt: Decrease default bundle size (#22999)

🩹 Fixes

  • nuxt: Exclude resolved vite virtual modules prefix (#22834)
  • nuxt: Ensure typed layout prop persists through build (#22855)
  • nuxt: Render server components when ssr: false (#22869)
  • kit: Respect priority when registering components dirs (#22882)
  • kit: Allow passing a string to addLayout (#22902)
  • nuxt: Ensure middleware is processed when returning true (#22905)
  • nuxt: Unpause dom updates on error (#22945)
  • nuxt: Disallow write: false for type templates (#22972)
  • vite: Don't set explicit conditions in shouldExternalize (#22991)
  • nuxt: Render inlined ssr styles before stylesheets (#22986)
  • nuxt: Improve types within plugin templates (#22998)
  • nuxt: Load layer plugins before project plugins (#22889)
  • nuxt: Use destr in more places over JSON.parse (#22997)
  • nuxt: Resolve head instance from Nuxt app (#22973)
  • nuxt: Always use increment for id with client side islands (#22975)

📖 Documentation

  • Add info about dynamic nested routes (#22862)
  • Update nuxt bridge migration guide (#22815)
  • Rename nuxt-community to nuxt-modules (9991da634)
  • Add banner for readme (e92d99db3)
  • Simplify readme (681f92915)
  • Text center on banner (ea5142176)
  • Clarify that 'it' is <NuxtPage> (#22912)
  • Update examples of dynamic pageKey (#22920)
  • Fix types in 'server utilities' example (#22978)
  • Describe env object for nuxt plugins (#22963)
  • Docs/3.api/3.utils/define-page-meta.md (#23006)
  • Accessing custom props for NuxtLayout (#22989)
  • Add information about server component context (#22964)

🏡 Chore

  • Fix variable name in release scripts (adb6ec674)
  • Track nuxi-edge rather than nuxi-ng (9610cf03d)

🤖 CI

  • Create 2.x release branch as well (cdf9b5547)
  • Use GITHUB_REF_NAME to get branch for release (d49ea58de)
  • Use changelogen utility to get current branch (7431e2258)

❤️ Contributors

  • Julien Huang (@huang-julien)
  • Saman (@bounoable)
  • Harlan Wilton (@harlan-zw)
  • Kekeocha Justin Chetachukwu (@justinkekeocha)
  • Daniel Roe (@danielroe)
  • Xjccc (@xjccc)
  • Joaquín Sánchez (@userquin)
  • Andrey Yolkin (AndreyYolkin)
  • OrlS15 (@OrlS15)
  • Alex Liu (@Mini-ghost)
  • Jonas Thelemann (@dargmuesli)
  • Sébastien Chopin (@Atinux)
  • Ryota Watanabe (@wattanx)
  • Heb (@Hebilicious)
  • Maik Kowol (@94726)