Vue 3 has a concept called pages that let’s you define different HTML pages acting as entry points to your app.
You define these in vue.config.js
in the root of your project. Here is a sample:
module.exports = { pages: { 'index': { entry: './src/main.ts', template: 'public/index.html', title: 'Home', chunks: [ 'chunk-vendors', 'chunk-common', 'index' ] }, 'about': { entry: './src/main-about.ts', template: 'public/about/index.html', title: 'About', chunks: [ 'chunk-vendors', 'chunk-common', 'about' ] } } }
You’d expect these pages to then be accessed via /
and /about
URLs. This works in development. However, when you deploy to Firebase Hosting, your /about
URL does not work.
The reason is Firebase has no concept of Vue. It’s just an HTTP server looking for a file, and this file doesn’t exist.
If you look in your deploy folder for firebase generated when you do a build, you’ll see it did create an about.html file. All you need to do is map your URL to this file.
Firebase provides configuration via firebase.json, also in your root folder. Here is a sample configuration:
{
"hosting": {
"public": "dist",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "about",
"destination": "/about.html"
},
{
"source": "**",
"destination": "/index.html"
}
]
}
}
In the rewrite section, we direct /about to /about.html. We also added another rewrite to direct everything else to the main index.html. This avoids pesky 404 errors.