关于前端路由我所知道的

简介: 关于前端路由我所知道的

image.png


开宗明义 前端路由的本质:对 url 进行改变和监听,使 UI 与 url 保持同步。

当我们在浏览器地址栏输入 https://github.com/hk4114/How2Route 这个路径的时候,浏览器发起请求,服务器通过 url 从映射表中执行相应的函数,并将函数的执行结果返回给浏览器进行渲染。

这是传统 web 应用的交互方式。路由其实更像是一种请求。不同页面使用不同 url 从服务器加载对应资源渲染页面,如果跳转到新页面就会重新请求资源进行渲染。用户通过路由 url 和服务器 server 直接进行交互。

而在现在盛行的 SPA 单页应用来说,用户输入地址 url,向服务器发起请求,获取到的是整个应用的资源文件,一个 index.html 和打包过的 css/js。由前端 client 去判断该展示什么样的视图。

所以我理解:

如果将 web 应用比作 object。路由是一种状态 key。通过路由 key 展示不同视图/页面 value。

传统应用和单页应用的区别在于 通过路由返回相应视图/页面的逻辑是在哪里处理的。在前端 client 就是前端路由,在后端 server 就是后端路由。


image.png



为什么将路由放在前端?


维护过传统 web 应用,感觉有维护体验不佳:通过 controller 路由找到对应页面,最后发现有问题的模块 template 在其他地方,然后再按图索骥找对应的 jsp 文件再查看出问题的模型。改一个字段可能需要把整个项目都看一遍。

相对来说,后端 server 只提供接口,将路由交互,交给前端 client 处理,分工更明确。逻辑上也将数据和视图拆分出来:后端 server 和 前端 client 通过 ajax/fetch 进行交互。用户只是和前端 client 进行交互。


image.png


点击查看【codepen】


如何实现前端路由?


两步实现前端路由 /doge

  1. 监听 url 的改变,改变 UI 视图
  2. 改变 url

具体实现上有两种方式

  1. hash baidu.com/#foo
  2. history baidu.com/foo

hash 通过 window.addEventListener('hashchange') 这个事件,就可以监听到 hash 值的变化,驱动界面变化。

history 通过 history.pushState 让 url 改变,但是不重新加载页面,记录浏览器的历史,驱动界面发送变化。


原生


hash


监听 hashchange 可以通过操作 dom 的方式来处理

function onHashChange() {
  if (location.hash === '#/home') {
    vanillaHashRouterView.innerHTML = '<h2>Hash Router(Vanilla) Home</h2>'
  } else if (location.hash === '#/about') {
    vanillaHashRouterView.innerHTML = '<h2>Hash Router(Vanilla) About</h2>'
  }
}

history

history.pushState 的方式需要拦截点击事件默认行为,点击时使用 pushState 修改 URL 并更新手动 UI,从而实现点击链接更新 URL 和 UI 的效果。

const linkList = document.querySelectorAll('.vanilla.history a[href]')
linkList.forEach(el => el.addEventListener('click', function (e) {
  e.preventDefault()
  history.pushState(null, '', el.getAttribute('href'))
  onPopState()
}))
// 路由变化时,根据路由渲染对应 UI
function onPopState () {
  switch (location.pathname) {
    case '/home':
      vanillaHisoryRouterView.innerHTML = '<h2>History Router(Vanilla) Home</h2>'
      return
    case '/about':
      vanillaHisoryRouterView.innerHTML = '<h2>History Router(Vanilla) About</h2>'
      return
    default:
      return
  }
}


Router 在不同框架里结合各自框架的特性,具体到细节上有不同的实现方式。模仿实现一下效果。

source code

参考资料:


目录
相关文章
|
移动开发 前端开发 JavaScript
前端vue2、vue3去掉url路由“ # ”号——nginx配置(一)
前端vue2、vue3去掉url路由“ # ”号——nginx配置
1008 0
|
9月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
594 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
JavaScript 前端开发 开发者
Vue.js 框架大揭秘:响应式系统、组件化与路由管理,震撼你的前端世界!
【8月更文挑战第27天】Vue.js是一款备受欢迎的前端JavaScript框架,以简洁、灵活和高效著称。本文将从三个方面深入探讨Vue.js:响应式系统、组件化及路由管理。响应式系统为Vue.js的核心特性,能自动追踪数据变动并更新视图。例如,通过简单示例代码展示其响应式特性:`{{ message }}`,当`message`值改变,页面随之自动更新。此外,Vue.js支持组件化设计,允许将复杂界面拆分为独立且可复用的组件,提高代码可维护性和扩展性。如创建一个包含标题与内容的简单组件,并在其他页面中重复利用。
261 3
|
存储 JavaScript 前端开发
前端 vue:路由的高级使用
前端 vue:路由的高级使用
|
11月前
|
移动开发 缓存 前端开发
深入理解前端路由:原理、实现与应用
本书《深入理解前端路由:原理、实现与应用》全面解析了前端路由的核心概念、工作原理及其实现方法,结合实际案例探讨了其在现代Web应用中的广泛应用,适合前端开发者和相关技术人员阅读。
|
前端开发 JavaScript 应用服务中间件
前端vue2、vue3去掉url路由“ # ”号——nginx配置(二)
前端vue2、vue3去掉url路由“ # ”号——nginx配置
674 0
|
12月前
|
缓存 前端开发 JavaScript
JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
454 1
|
JavaScript 前端开发 API
前端技术分享:Vue.js 动态路由与守卫
【10月更文挑战第1天】前端技术分享:Vue.js 动态路由与守卫
|
资源调度 JavaScript 前端开发
前端vue:路由的基本使用
前端vue:路由的基本使用
|
移动开发 前端开发 JavaScript
浅谈前端路由原理hash和history
该文章详细解析了前端路由的两种模式——Hash模式与History模式的工作原理及其实现方式,并通过实例代码展示了如何在实际项目中运用这两种路由模式。

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
  • 2
    前端工程化演进之路:从手工作坊到AI驱动的智能化开发
  • 3
    Vue 3 + TypeScript 现代前端开发最佳实践(2025版指南)
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
  • 6
    实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式