前端路由那些事

简介: 谈到路由,一般分为前端路由和后端路由两种,后端路由指的当用户通过浏览器切换不同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 待补充



相关文章
|
7月前
|
移动开发 前端开发 JavaScript
前端vue2、vue3去掉url路由“ # ”号——nginx配置(一)
前端vue2、vue3去掉url路由“ # ”号——nginx配置
553 0
|
4月前
|
JavaScript 前端开发 开发者
Vue.js 框架大揭秘:响应式系统、组件化与路由管理,震撼你的前端世界!
【8月更文挑战第27天】Vue.js是一款备受欢迎的前端JavaScript框架,以简洁、灵活和高效著称。本文将从三个方面深入探讨Vue.js:响应式系统、组件化及路由管理。响应式系统为Vue.js的核心特性,能自动追踪数据变动并更新视图。例如,通过简单示例代码展示其响应式特性:`{{ message }}`,当`message`值改变,页面随之自动更新。此外,Vue.js支持组件化设计,允许将复杂界面拆分为独立且可复用的组件,提高代码可维护性和扩展性。如创建一个包含标题与内容的简单组件,并在其他页面中重复利用。
84 3
|
23天前
|
移动开发 缓存 前端开发
深入理解前端路由:原理、实现与应用
本书《深入理解前端路由:原理、实现与应用》全面解析了前端路由的核心概念、工作原理及其实现方法,结合实际案例探讨了其在现代Web应用中的广泛应用,适合前端开发者和相关技术人员阅读。
|
3月前
|
存储 JavaScript 前端开发
前端 vue:路由的高级使用
前端 vue:路由的高级使用
|
1月前
|
缓存 前端开发 JavaScript
JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
73 1
|
2月前
|
JavaScript 前端开发 API
前端技术分享:Vue.js 动态路由与守卫
【10月更文挑战第1天】前端技术分享:Vue.js 动态路由与守卫
|
3月前
|
资源调度 JavaScript 前端开发
前端vue:路由的基本使用
前端vue:路由的基本使用
|
3月前
|
移动开发 前端开发 JavaScript
浅谈前端路由原理hash和history
该文章详细解析了前端路由的两种模式——Hash模式与History模式的工作原理及其实现方式,并通过实例代码展示了如何在实际项目中运用这两种路由模式。
|
2月前
|
JavaScript 前端开发 应用服务中间件
Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍
Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍
46 0
|
3月前
|
移动开发 缓存 前端开发
构建高效的前端路由系统:从原理到实践
在现代Web开发中,前端路由系统已成为构建单页面应用(SPA)不可或缺的核心技术之一。不同于传统服务器渲染的多页面应用,SPA通过前端路由技术实现了页面的局部刷新与无缝导航,极大地提升了用户体验。本文将深入剖析前端路由的工作原理,包括Hash模式与History模式的实现差异,并通过实战演示如何在Vue.js框架中构建一个高效、可维护的前端路由系统。我们还将探讨如何优化路由加载性能,确保应用在不同网络环境下的流畅运行。本文不仅适合前端开发者深入了解前端路由的奥秘,也为后端转前端或初学者提供了从零到一的实战指南。