前端路由那些事

简介: 谈到路由,一般分为前端路由和后端路由两种,后端路由指的当用户通过浏览器切换不同URL时,都会向服务器发起资源请求,服务器通过后端路由匹配之后根据不同URL返回不同页面,而前端路由则将浏览器与服务器交互(页面跳转的URL规则匹配)的任务交给前端来做

微信截图_20220512121205.png


谈到路由,一般分为前端路由和后端路由两种,后端路由指的当用户通过浏览器切换不同URL时,都会向服务器发起资源请求,服务器通过后端路由匹配之后根据不同URL返回不同页面,而前端路由则将浏览器与服务器交互(页面跳转的URL规则匹配)的任务交给前端来做


1.前端路由模式


目前单页应用(SPA)成为目前前端应用的主流,而大型单页应用的一个大特征是,由前端路由来控制页面的跳转,通过url的切换,在不请求服务器的前提,更新页面视图,这里以vue-router为例分析,前端路由模式主要包括两种:hash模式和history模式


1.1 hash 模式


hash模式即是通过 hash 值(类似锚点)的变化,浏览器不用向服务器发起请求,也就无需刷新页面。而浏览器是怎么监听变化的呢?就是通过url中hash 值的变化,此时还好触发 hashchange 事件,通过此事件的触发我们就可以清晰知道hash发生了什么变化


假设你浏览器访问的url地址是 http://127.0.0.1/#/test 那么通过 location.hash 获取的hash值为 #/test


导致路由的变化无非是三种情况:刷新页面、浏览器返回操作、新链接跳转,下面是具体流程图👇


微信截图_20220512121256.png


那hash模式下监听路由变化实现的原理是怎么样的呢?


window.addEventListener('hashchange', this.onHashChange.bind(this))
window.addEventListener('load', this.onHashChange.bind(this))
function onHashChange(){
// todo 匹配 hash 做 dom 更新操作
}


有兴趣的童鞋可以研究vue-router关于hash类的具体源码实现 点我到达火箭


1.2 history 模式


自HTML5新标准出台,pushState和replaceState是HTML5的新接口,通过这两个 API 可以改变 url 地址且不会发送请求,前端路由从此了多了另外一种模式History,而且通过这种模式不再需要在URL添加#符号,也能让URL显得更加优美


我们先看看window.history对象里面有什么


微信截图_20220512121309.png


History.pushState


在不刷新浏览器的情况下,创建新的浏览记录并插入浏览记录队列中,当刷新页面,页面内容不变但地址发生了变化,该API可传入三个参数,分别是


  • 状态对象(stateObject): 可以通过pushState方法可以将stateObject(对象)内容传递到新页面中
  • 标题(title):可不传
  • 地址(url):新的历史记录条目的地址(url不支持跨域);


window.history.pushState({data: "test"}, "", 'http://127.0.0.1/test');


History.replaceState:


的使用与 history.pushState() 类似,区别在于pushState会增加一条新的历史记录,而replaceState则会替换当前的历史记录,把当前的历史记录改成目标地址


window.history.replaceState({data: "test"}, "", 'http://127.0.0.1/test');


popstate


当用户发起返回操作或者执行history.go()或history.forward()等操作时,才会触发popstate


window.addEventListener('popstate', e => {
    //todo 
 });


讲完history模式涉及到接口,树酱聊聊配置history模式需要注意的事项,这种模式相比hash模式还需要配置后端,如果后台没有正确的配置,当用户在浏览器直接刷新   http://127.0.0.1/#/test 就会返回 404,那如何解决这个问题呢 🤔️


你需要在Nginx配置文件添加重定向 附上 history vue-router官方文档


location / {
  try_files $uri $uri/ /index.html;
}


Vue-router History模式下的流程图如下所示


微信截图_20220512121335.png


有兴趣Vue-router关于history类的具体源码实现 点我到达火箭


2.路由应用


聊聊vue-router的一些应用场景


2.1 路由拦截


路由拦截可以用来作为前端鉴权入口,比如判断是否是已登录状态


mport Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
const router = new Router({
 routes: [
 {
  path: '/home',''
  component: () => import('@/components/Home')
  }
 },{
  path: '/login',
  name: 'login',
  component: (resolve) => {
  component: () => import('@/components/Login')
  }
 }}]
})
// 判断是否需要登录权限 以及是否登录
router.beforeEach((to, from, next) => {
 if (to.matched.some(res => res.meta.requireAuth)) { // 判断路由是否需要登录权限
 if (localStorage.getItem('item')) { //判断是否有token
  next()
 } else {// 没登录则跳转到登录界面
  next({
  path: '/login',
  query: {redirect: to.fullPath}
  })
 }
 } else {
 next()
 }
})


2.2 路由懒加载


懒加载,顾名思义就是等需要再加载,在SPA应用中,如果不通过懒加载加载组件的方式,会导致webpack打包出来的文件体制过大,进而影响用户体验


export default new Router({                                
  routes: [
    {
      path: '/home',                                            
      name: 'home',
      component: () => import('@/components/Home') # 懒加载引入组件
    }
  ]
});


2.3 路由模块化管理


你是否还在烦恼如何按不同模块不同功能管理不同路由,这里要推荐使用 require.context()


不同功能模块区分,再通过require.context 导出所有路由


微信截图_20220512121353.png


require.context() 它允许传入一个目录进行搜索,一个标志表示是否也应该搜索子目录,以及一个正则表达式来匹配文件,当你构建项目时,webpack会处理require.context的内容


require.context()可传入三个参数分别是:


  • directory :读取文件的路径
  • useSubdirectories :是否遍历文件的子目录
  • regExp: 匹配文件的正则


实际应用如下👇


微信截图_20220512121408.png


routes导出来结果是这样


微信截图_20220512121421.png


当然原本的定义路由的方式也变了


/*
 * 个人中心路由模块(user)
 * @Author: tree
 * @Date: 2019-11-06 20:20:51
 */
export default [
  {
    path: '/user/info',
    name: 'personalInfo',
    component: () => import('@/views/user/info.vue'),
    meta: { title: '账号信息', keepAlive: false, showHeader: true },
  },
  {
    path: '/user/security',
    name: 'security',
    component: () => import('@/views/user/security.vue'),
    meta: { title: '安全设置', keepAlive: false, showHeader: true },
  },
];


2.4 其他常见路由 API


  • window.history.back() : 加载 history 列表中的前一个 URL
  • window.history.forward() : 加载 history 列表中的下一个 URL
  • window.history.back(n) : 加载 history 列表中的某个页面
  • window.location.href: 返回完整的URL
  • window.location.hash: 返回URL的锚部分
  • window.location.pathname: 返回URL路径名


2.5 koa-router 待补充



相关文章
|
4月前
|
移动开发 前端开发 API
深入理解前端路由:构建现代 Web 应用的基石(上)
深入理解前端路由:构建现代 Web 应用的基石(上)
深入理解前端路由:构建现代 Web 应用的基石(上)
|
4月前
|
前端开发 搜索推荐 UED
解密前端路由: hash模式vs.history模式
解密前端路由: hash模式vs.history模式
|
17天前
|
移动开发 前端开发 JavaScript
前端vue2、vue3去掉url路由“ # ”号——nginx配置(一)
前端vue2、vue3去掉url路由“ # ”号——nginx配置
49 0
|
4月前
|
前端开发 JavaScript 关系型数据库
若依框架------后台路由数据是如何转换为前端路由信息的
若依框架------后台路由数据是如何转换为前端路由信息的
125 0
|
8月前
|
前端开发 JavaScript API
前端路由:构建现代Web应用的导航之道
在构建现代Web应用程序时,前端路由是不可或缺的一部分。它允许用户在应用内导航,同时保持URL的同步,使应用看起来像一个多页面应用程序。本博客将深入研究前端路由的核心概念、实现方式、最佳实践以及如何为您的Web应用程序创建流畅的导航体验。
44 0
|
17天前
|
前端开发 JavaScript 应用服务中间件
前端vue2、vue3去掉url路由“ # ”号——nginx配置(二)
前端vue2、vue3去掉url路由“ # ”号——nginx配置
47 0
|
12天前
|
缓存 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 前端路由实现原理
【4月更文挑战第30天】本文探讨了JavaScript前端路由在SPA中的重要性,阐述了其基本原理和实现方式,包括Hash路由和History路由。前端路由通过监听URL变化、匹配规则来动态切换内容,提升用户体验和交互性。同时,文章也提到了面临的SEO和页面缓存挑战,并通过电商应用案例分析实际应用。理解并掌握前端路由能助开发者打造更流畅的单页应用。
|
16天前
|
前端开发 JavaScript 数据可视化
前端vite+vue3——自动化配置路由布局
前端vite+vue3——自动化配置路由布局
31 0
|
4月前
|
前端开发 JavaScript API
SPA与前端路由:构建无缝体验的现代前端应用
在前端开发领域,单页面应用(SPA)和前端路由成为了构建现代、高度交互性的应用程序的重要技术。本文将探讨SPA的优势以及前端路由的实践,帮助读者更好地理解如何利用这些技术来提升用户体验和开发效率。
|
4月前
|
前端开发 JavaScript 搜索推荐
深入理解前端路由:构建现代 Web 应用的基石(下)
深入理解前端路由:构建现代 Web 应用的基石(下)
深入理解前端路由:构建现代 Web 应用的基石(下)