Overview
Experience Nuxt 3 features on existing Nuxt 2 projects.
Migrate from Nuxt 2 to Nuxt Bridge
Experience Nuxt 3 features on existing Nuxt 2 projects.
Bridge is a forward-compatibility layer that allows you to experience many of the new Nuxt 3 features by simply installing and enabling a Nuxt module.
Using Nuxt Bridge, you can make sure your project is (almost) ready for Nuxt 3 and have the best developer experience without needing a major rewrite or risk breaking changes.
Upgrade Nuxt 2
Make sure your dev server (nuxt dev
) isn't running, remove any package lock files (package-lock.json
and yarn.lock
), and install the latest nuxt-edge
:
- "nuxt": "^2.15.0"+ "nuxt-edge": "latest"
Then, reinstall your dependencies:
yarn install
Install Nuxt Bridge
Install @nuxt/bridge-edge
as a development dependency:
yarn add --dev @nuxt/bridge@npm:@nuxt/bridge-edge
Update your scripts
You will also need to update your scripts within your package.json
to reflect the fact that Nuxt will now produce a Nitro server as build output.
Nuxi
Nuxt 3 introduced the new Nuxt CLI command nuxi
. Update your scripts as follows to leverage the better support from Nuxt Bridge:
{ "scripts": {- "dev": "nuxt",+ "dev": "nuxi dev",- "build": "nuxt build",+ "build": "nuxi build",- "start": "nuxt start",+ "start": "nuxi preview" }}
Static target
If you have set target: 'static'
in your nuxt.config
then you need to ensure that you update your build script to be nuxi generate
.
{ "scripts": { "build": "nuxi generate" }}
Server target
For all other situations, you can use the nuxi build
command.
{ "scripts": { "build": "nuxi build", "start": "nuxi preview" }}
Update nuxt.config
Please make sure to avoid any CommonJS syntax such as module.exports
, require
or require.resolve
in your config file. It will soon be deprecated and unsupported.
You can use static import
, dynamic import()
and export default
instead. Using TypeScript by renaming to nuxt.config.ts
is also possible and recommended.
import { defineNuxtConfig } from '@nuxt/bridge'export default defineNuxtConfig({ // Your existing configuration})
Update tsconfig.json
If you are using TypeScript, you can edit your tsconfig.json
to benefit from auto-generated Nuxt types:
{+ "extends": "./.nuxt/tsconfig.json", "compilerOptions": { ... }}
Migrate Composition API
If you were using @vue/composition-api
or @nuxtjs/composition-api
, please read the composition api migration guide.
Migrate from CommonJS to ESM
Nuxt 3 natively supports TypeScript and ECMAScript Modules. Please check Native ES Modules for more info and upgrading.
Remove incompatible and obsolete modules
- Remove
@nuxt/content
(1.x). A rewrite for Nuxt 3 is planned (2.x) - Remove
nuxt-vite
: Bridge enables same functionality - Remove
@nuxt/typescript-build
: Bridge enables same functionality - Remove
@nuxt/typescript-runtime
andnuxt-ts
: Nuxt 2 has built-in runtime support - Remove
@nuxt/nitro
: Bridge injects same functionality - Remove
@vue/composition-api
from your dependencies (migration guide). - Remove
@nuxtjs/composition-api
from your dependencies (and from your modules innuxt.config
) (migration guide).
Exclude built Nitro folder from git
Add the folder .output
to the .gitignore
file.
Ensure everything goes well
✔️ Try with nuxi dev
and nuxi build
(or nuxi generate
) to see if everything goes well.
🐛 Is something wrong? Please let us know by creating an issue. Also, you can easily disable the bridge in the meantime:
import { defineNuxtConfig } from '@nuxt/bridge'export default defineNuxtConfig({ bridge: false // Temporarily disable bridge integration})
New plugins format (optional)
You can now migrate to the Nuxt 3 plugins API, which is slightly different in format from Nuxt 2.
Plugins now take only one argument (nuxtApp
). You can find out more in the docs.
export default defineNuxtPlugin(nuxtApp => { nuxtApp.provide('injected', () => 'my injected function') // now available on `nuxtApp.$injected`})
New useHead
(optional)
Nuxt Bridge provides a new Nuxt 3 meta API that can be accessed with a new useHead
composable.
<script setup>useHead({ title: 'My Nuxt App',})</script>
You will also need to enable this feature explicitly in your nuxt.config
:
import { defineNuxtConfig } from '@nuxt/bridge'export default defineNuxtConfig({ bridge: { meta: true }})
This useHead
composable uses @vueuse/head
under the hood (rather than vue-meta
) to manipulate your <head>
.
Accordingly, we recommend not to use both the native Nuxt 2 head()
properties as well as useHead
, as they may conflict.
For more information on how to use this composable, see the docs.
Feature Flags
You can optionally disable some features from bridge or opt-in to less stable ones. In normal circumstances, it is always best to stick with defaults!
You can check bridge/src/module.ts for latest defaults.
import { defineNuxtConfig } from '@nuxt/bridge'export default defineNuxtConfig({ bridge: { // -- Opt-in features -- // Use Vite as the bundler instead of webpack 4 // vite: true, // Enable Nuxt 3 compatible useHead // meta: true, // -- Default features -- // Use legacy server instead of Nitro // nitro: false, // Disable nuxt 3 compatible `nuxtApp` interface // app: false, // Disable Composition API support // capi: false, // ... or just disable legacy Composition API support // capi: { // legacy: false // }, // Do not transpile modules // transpile: false, // Disable <script setup> support // scriptSetup: false, // Disable composables auto importing // autoImports: false, // Do not warn about module incompatibilities // constraints: false }, vite: { // Config for Vite }})