One of Nuxt core feature is the file-system router. Every Vue file created inside the pages/ directory creates a corresponding URL (or route) that displays the content of the file. Nuxt leverages code-splitting on each page by using dynamic imports to ship the minimum of JavaScript for the requested route.
Nuxt routing is based on vue-router and generates the routes from every component created in the pages/
directory, based on their filename.
This file system routing uses naming conventions to create dynamic and nested routes:
pages/
--| about.vue
--| posts/
----| [id].vue
The <NuxtLink>
component links pages between them. It renders a <a>
tag with the href
attribute set to the route of the page. Once the application is hydrated, pages transitions are performed in JavaScript by updating the browser URL. This prevents full-page refreshes and allow for animated transitions.
When a <NuxtLink>
enters the viewport on the client side, Nuxt will automatically prefetch components and payload (generated pages) of the linked pages ahead of time, resulting in faster navigation.
<template> <header> <nav> <ul> <li><NuxtLink to="/about">About</NuxtLink></li> <li><NuxtLink to="/posts/1">Post 1</NuxtLink></li> <li><NuxtLink to="/posts/2">Post 2</NuxtLink></li> </ul> </nav> </header></template>
The useRoute()
composable can be used in a <script setup>
block or a setup()
method of a Vue component to access the current route details.
<script setup>const route = useRoute()// When accessing /posts/1, route.params.id will be 1console.log(route.params.id)</script>
Nuxt provides a customizable route middleware framework you can use throughout your application, ideal for extracting code that you want to run before navigating to a particular route.
There are three kinds of route middleware:
middleware/
directory and will be automatically loaded via asynchronous import when used on a page. (Note: The route middleware name is normalized to kebab-case, so someMiddleware
becomes some-middleware
.)middleware/
directory (with a .global
suffix) and will be automatically run on every route change.Example of an auth
middleware protecting the /dashboard
page:
export default defineNuxtRouteMiddleware((to, from) => { // isAuthenticated() is an example method verifying if an user is authenticated if (isAuthenticated() === false) { return navigateTo('/login') }})
Nuxt offers route validation via the validate
property in definePageMeta
in each page you wish to validate.
The validate
property accepts the route
as an argument. You can return a boolean value to determine whether or not this is a valid route to be rendered with this page. If you return false and another match can't be found, this will mean a 404. You can also directly return an object with statusCode
/statusMessage
to respond immediately with an error (other matches will not be checked).
If you have a more complex use case, then you can use anonymous route middleware instead.
<script setup>definePageMeta({ validate: async (route) => { const nuxtApp = useNuxtApp() // Check if the id is made up of digits return /^\d+$/.test(params.id) }})</script>