vue3 + vite2 vue 打包后router-view空白

第一次使用 vite 打包项目,被这个问题搞了大半天,心态有点崩!不过解决完后还是非常开心!

1. 路由空白的原因分析

1.1 路由模式设置问题

  • Hash模式的工作原理如下:

    • 当用户点击页面上的导航菜单时,使用JavaScript代码来更改URL的hash。

    • 当URL的hash部分发生变化时,浏览器会自动触发hashchange事件。开发者可以通过监听 * hashchange事件来捕获URL变化的通知,并根据新的hash值执行相应的操作,如更新页面内容或进行状态管理。

    • 通过hashchange事件的监听,可以实现单页应用(Single Page Application,SPA)中不同页面视图的切换,而无需重新加载整个页面。这是因为只有URL的hash部分发生变化,浏览器并不会向服务器发送新的请求。

    • 对于hash模式下的URL,浏览器并不会向服务器请求相应的资源。因此,当首次加载网页时,只需请求一个HTML页面,并在该页面中引入JavaScript和CSS等资源。

  • History模式的工作原理如下:

    • 通过History API,可以在不导致页面重新加载的情况下,动态地修改浏览器的URL。这意味着,当用户访问新的路径时,浏览器不会向服务器请求新的页面,而只是通过JavaScript代码来更新页面内容。

    • 当用户在网站中浏览不同页面或执行特定操作时,通过调用History API中的方法(如pushState()或replaceState()),可以修改URL的路径部分,从而反映当前页面状态和导航历史。

    • 使用History模式的应用程序通常会预定义一组路由(routes),将URL的路径与特定的页面或视图关联起来。通过监听浏览器的popstate事件,可以捕获URL的变化,并根据新的路径值执行相应的操作。

    • 当用户通过浏览器的前进或后退按钮导航时,也会触发popstate事件。开发者可以在事件处理程序中获取新的路径值,并根据路径值来更新页面内容,以保持URL和应用程序状态同步。

    • 对于History模式下的URL,当用户直接访问特定路径时,浏览器会向服务器发送请求以获取相应的页面。因此,服务器需要进行相应的配置,以确保在各个路径下都返回正确的页面。

  • vue-router设置问题

const route = new createRouter({
  mode: "hash",
   // history:createWebHashHistory(import.meta.env.VITE_RES_URL),
   history: createWebHashHistory(import.meta.env.VITE_RES_URL),
   routes
})
export default route; 

1.2 base 设置问题

1.3 路由中组件的动态导入方式

参考链接

  • 错误方式
 let routes = [{
      path: '/index',
       component: import('@/components/index'),
       name: 'index'
  },]
  • 正确方式
 let routes = [{
      path: '/index',
       component: () => import('@/components/index'),
       name: 'index'
  },]

ps: import(‘@/components/index’) 与 () => import(‘@/components/index’) 加载方式有很大区别!

好的,下面是搭建后台管理系统的简单步骤: 1. 创建项目 使用 Vue CLI 创建项目,选择 vue3 preset,安装完成后进入项目目录。 ``` vue create my-project cd my-project ``` 2. 安装依赖包 安装 vitevue-router 和 element-plus。 ``` npm install vite vue-router@4 element-plus --save ``` 安装 pinia 和 echarts。 ``` npm install pinia echarts@5 --save ``` 3. 配置 vite 在根目录下创建 `vite.config.js` 文件,配置 alias 和 server。 ```js import path from 'path' import { defineConfig } from 'vite' export default defineConfig({ resolve: { alias: { '@': path.resolve(__dirname, 'src'), }, }, server: { port: 3000, open: true, }, }) ``` 4. 配置路由 在 `src` 目录下创建 `router` 文件夹,并创建 `index.js` 文件,配置路由。 ```js import { createRouter, createWebHistory } from 'vue-router' import Home from '@/views/Home.vue' const routes = [ { path: '/', name: 'Home', component: Home, }, ] const router = createRouter({ history: createWebHistory(), routes, }) export default router ``` 在 `src` 目录下的 `main.js` 中引入路由。 ```js import { createApp } from 'vue' import App from './App.vue' import router from './router' const app = createApp(App) app.use(router) app.mount('#app') ``` 5. 配置状态管理 在 `src` 目录下创建 `store` 文件夹,并创建 `index.js` 文件,配置状态管理。 ```js import { createPinia } from 'pinia' const store = createPinia() export default store ``` 在 `src` 目录下的 `main.js` 中引入状态管理。 ```js import { createApp } from 'vue' import App from './App.vue' import router from './router' import store from './store' const app = createApp(App) app.use(router) app.use(store) app.mount('#app') ``` 6. 配置 UI 框架 在 `src` 目录下的 `main.js` 中引入 element-plus。 ```js import { createApp } from 'vue' import App from './App.vue' import router from './router' import store from './store' import ElementPlus from 'element-plus' import 'element-plus/lib/theme-chalk/index.css' const app = createApp(App) app.use(router) app.use(store) app.use(ElementPlus) app.mount('#app') ``` 7. 配置 echarts 在 `src` 目录下的 `main.js` 中引入 echarts。 ```js import { createApp } from 'vue' import App from './App.vue' import router from './router' import store from './store' import ElementPlus from 'element-plus' import 'element-plus/lib/theme-chalk/index.css' import * as echarts from 'echarts' const app = createApp(App) app.use(router) app.use(store) app.use(ElementPlus) app.config.globalProperties.$echarts = echarts app.mount('#app') ``` 8. 创建页面 在 `src` 目录下创建 `views` 文件夹,并创建页面组件。 9. 创建布局 在 `src` 目录下创建 `layouts` 文件夹,并创建布局组件。 10. 配置路由和布局 在 `router/index.js` 中配置路由和布局。 ```js import { createRouter, createWebHistory } from 'vue-router' import Layout from '@/layouts/Layout.vue' import Home from '@/views/Home.vue' const routes = [ { path: '/', component: Layout, children: [ { path: '', name: 'Home', component: Home, }, ], }, ] const router = createRouter({ history: createWebHistory(), routes, }) export default router ``` 11. 运行项目 在项目根目录下运行 `npm run dev`,打开浏览器访问 `http://localhost:3000` 查看效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值