Plugins and Middleware
Learn how to migrate from Nuxt 2 to Nuxt 3 plugins and middleware.
Plugins
Plugins now have a different format, and take only one argument (nuxtApp).
export default (ctx, inject) => {
inject('injected', () => 'my injected function')
})
export default defineNuxtPlugin(nuxtApp => {
// now available on `nuxtApp.$injected`
nuxtApp.provide('injected', () => 'my injected function')
// You can alternatively use this format, which comes with automatic type support
return {
provide: {
injected: () => 'my injected function'
}
}
})
Migration
- Migrate your plugins to use the
defineNuxtPluginhelper function. - Remove any entries in your
nuxt.configplugins array that are located in yourplugins/folder. All files in this directory at the top level (and any index files in any subdirectories) will be automatically registered. Instead of settingmodetoclientorserver, you can indicate this in the file name. For example,~/plugins/my-plugin.client.tswill only be loaded on client-side.
Route Middleware
Route middleware has a different format.
export default function ({ store, redirect }) {
// If the user is not authenticated
if (!store.state.authenticated) {
return redirect('/login')
}
}
export default defineNuxtRouteMiddleware((to, from) => {
const auth = useState('auth')
if (!auth.value.authenticated) {
return navigateTo('/login')
}
})
Much like Nuxt 2, route middleware placed in your ~/middleware folder is automatically registered. You can then specify it by name in a component. However, this is done with definePageMeta rather than as a component option.
navigateTo is one of a number of route helper functions.
Migration
- Migrate your route middleware to use the
defineNuxtRouteMiddlewarehelper function. - Any global middleware (such as in your
nuxt.config) can be placed in your~/middlewarefolder with a.globalextension, for example~/middleware/auth.global.ts.