Co-authored-by: pooya parsa <pyapar@gmail.com>
7.5 KiB
Bridge
Experience Nuxt 3 features on existing Nuxt 2 projects.
::alert
If you're starting a fresh Nuxt 3 project, please skip this section and go to Nuxt 3 Installation.
Learn more in Introduction.
::
::alert{type=warning}
Nuxt Bridge provides identical features to Nuxt 3 (docs) but there are some limitations, notably that useAsyncData
and useFetch
composables are not available. Please read the rest of this page for details.
::
Bridge is a forward-compatibility layer that allows you to experience many of 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
Remove any package lock files (package-lock.json
and yarn.lock
) and use the latest nuxt-edge
:
- "nuxt": "^2.15.0"
+ "nuxt-edge": "latest"
Then, reinstall your dependencies:
::code-group
yarn install
npm install
::
::alert Once the installation is complete, make sure both development and production builds are working as expected before proceeding. ::
Install Nuxt Bridge
Install @nuxt/bridge-edge
as a development dependency:
::code-group
yarn add --dev @nuxt/bridge@npm:@nuxt/bridge-edge
npm install -D @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": "node .output/server/index.mjs"
}
}
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": "node .output/server/index.mjs"
}
}
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 previously using @vue/composition-api
or @nuxtjs/composition-api
, please read the composition api migration guide.
Avoid CommonJS syntax
Nuxt 3 natively supports TypeScript and ECMAScript Modules.
Update the imports
::code-group
const lib = require('lib')
import lib from 'lib'
// or using code-splitting
const lib = await import('lib').then(e => e.default || e)
::
Update the exports
::code-group
module.exports = ...
export default ...
// or using named export
export const hello = ...
::
Avoid using specific CJS syntax
Avoid the usage of __dirname
and __filename
as much as possible.
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 nuxt dev
and nuxt build
(or nuxt 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.
import { defineNuxtPlugin } from '#app'
export default defineNuxtPlugin(nuxtApp => {
nuxtApp.provide('injected', () => 'my injected function')
// now available on `nuxtApp.$injected`
})
New useMeta
(optional)
Nuxt Bridge provides a new Nuxt 3 meta API that can be accessed with a new useMeta
composable.
<script setup>
import { useMeta } from '#app'
useMeta({
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 useMeta
composable uses @vueuse/head
under the hood (rather than vue-meta
) to manipulate your <head>
.
Accordingly, it is recommended not to use both the native Nuxt 2 head()
properties as well as useMeta
, 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 useMeta
// 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,
// 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
}
})