File-based routing for Vue applications using Vite.
Install vite-plugin-vue-routes
with your favorite package manager:
$ npm i vite-plugin-vue-routes -D
# or
$ yarn add vite-plugin-vue-routes -D
# or
$ pnpm i vite-plugin-vue-routes -D
# or
$ bun add vite-plugin-vue-routes -D
Configure Vite by creating a vite.config.ts
file in the root directory of your project, as shown below:
// vite.config.ts
import { resolve } from 'path';
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import vueRoutes from 'vite-plugin-vue-routes';
export default defineConfig({
plugins: [
vue(),
vueRoutes(), // Default: { routesDir: '<rootDir>/src/routes' }
],
resolve: {
alias: {
'~': resolve(__dirname, 'src'),
'@': resolve(__dirname, 'src'),
},
},
});
Create a Vue application by defining src/App.vue
:
<template>
<RouterView />
</template>
// src/main.ts
import { createApp } from 'vue';
import router from '~/plugins/router';
import App from './App.vue';
const app = createApp(App);
app.use(router);
app.mount('#root');
Create the router plugin by defining src/plugins/router.ts
:
// src/plugins/router.ts
import { createWebHistory, createRouter } from 'vue-router';
import routes from 'virtual:vue-routes';
const router = createRouter({
history: createWebHistory(),
routes,
scrollBehavior(to, from, savedPosition) {
if (savedPosition) return savedPosition;
return { top: 0 };
},
});
router.beforeEach((to, from) => {
// ...
return true;
});
export default router;
// vite-env.d.ts
/// <reference types="vite-plugin-vue-routes/client" />
Define a page by creating files in the src/routes
directory:
src/routes/path/to/+page.vue
The file naming convention for the routes is as follows:
src/routes/hello-world/+page.vue -> /hello-world
src/routes/products/+page.vue -> /products
src/routes/products/[id]/+page.vue -> /products/:id
src/routes/posts/[[title]]/+page.vue -> /posts/:title?
src/routes/blog/[...info]/+page.vue -> /blog/:info*
src/routes/(group)/foo/+page.vue -> /foo
src/routes/(group)/bar/+page.vue -> /bar
src/routes/(home)/+page.vue -> /
Define a layout by creating files in the src/routes
directory:
src/routes/path/to/+layout.vue
<!-- src/routes/path/to/+layout.vue -->
<template>
<RouterView />
</template>
src/routes/+layout.vue -> /+
src/routes/(dashboard)/+layout.vue -> /+
src/routes/(marketing)/+layout.vue -> /+
src/routes/users/[username]/+layout.vue -> /users/:username/+
Define an error page by creating files in the src/routes
directory:
src/routes/+error.vue
<!-- src/routes/+error.vue -->
<template>
<div>Error</div>
</template>
src/routes/+error.vue -> /:slug(.*)*
// vite.config.ts
import { resolve } from 'path';
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import vueRoutes from 'vite-plugin-vue-routes';
import prefetchChunk from 'vite-plugin-prefetch-chunk';
export default defineConfig({
plugins: [
vue(),
vueRoutes(),
prefetchChunk(), // Integrate with this plugin
],
resolve: {
alias: {
'~': resolve(__dirname, 'src'),
'@': resolve(__dirname, 'src'),
},
},
});
To learn more about vite-plugin-vue-routes
, check its documentation.
See ./examples
.