vite+mpa子页面路由刷新丢失问题

387 阅读1分钟

项目目录

├─ web
│  ├─ src
│  │  ├─ pages
│  │  │  ├─ admin
│  │  │  │  ├─ App.vue
│  │  │  │  ├─ main.js
│  │  │  │  └─ views
│  │  │  ├─ index
│  │  │  │  ├─ App.vue
│  │  │  │  ├─ main.js
│  │  │  │  └─ views
│  ├─ admin.html
│  ├─ index.html
│  ├─ package.json
│  └─ vite.config.js
└─ README.md

问题描述

index 路由为 createWebHistory('/')
admin 路由为 createWebHistory('/admin')

跳转到子页面/admin/是正常的,但刷新路由丢失。
跳转到子页面/admin/xxx,刷新路由就会丢失。配置了路由守卫触发跳转/404,开发环境下通过浏览器network发现请求回来的是index.html

原因分析:

history模式就是vite开发服务器把浏览器的url当成后端路由,/subPage/它能找到/subPage/index.html。

所以/subPage/的主页没错。/subPage/list找不到这个资源,vite开发服务器已经内部处理好了返回/index.html。

这个其实是不正确的index.html,导致路由丢失。换成hash模式是没问题的,如/subPage/#/list。浏览器不会把#后面的当作后端路由,不会去发送请求,资源由前端处理。

引用自:blog.csdn.net/usernotdefi…


解决方案:vite-plugin-mpa-plus

// 此处只展示相关联代码
import path from 'path'
import mpaPlugin from 'vite-plugin-mpa-plus'
const resolve = path.resolve
const pages = [
  {
    entry: resolve(__dirname, './src/pages/index/main.js'),
    filename: resolve(__dirname, './index.html'),
    template: resolve(__dirname, './index.html'),
  },
  {
    entry: resolve(__dirname, './src/pages/admin/main.js'),
    filename: resolve(__dirname, './admin.html'),
    template: resolve(__dirname, './admin.html'),
  },
]
export default defineConfig({
  //...
  plugins: [
    mpaPlugin({
      pages,
      historyApiFallback: {
        rewrites: [{ from: /\/admin/, to: '/admin.html' }],
      },
    }),
  ],
  build: {
    //...
    rollupOptions: {
      input: {
        index: path.resolve(__dirname, 'index.html'),
        admin: path.resolve(__dirname, 'admin.html'),
      },
  },
})