作者:TYANer

单页应用对于大家而言,可能是一个比较陌生的概念,但是其实大家都和单页应用打过交道。之所以这么说,是因为目前平台开发的所有中台系统的前端部分,包括Kadmin、TGS、OTA都属于单页应用。那么,到底什么是单页应用呢?

单页应用的概念

单页应用,顾名思义,就是整个应用只有一个主页面,其余的“页面”,实际上是一个个的“组件”。单页应用中的“页面跳转”,实际上是组件的切换,在这个过程中,只会更新局部资源,页面不会整个刷新。也正是因为这个原因,当我们的前端代码有更改,重新部署之后,如果用户不主动刷新,就会发现有“资源缓存”。

以TGS为例,下面每一步操作,都会清除请求日志,重新记录。

1.通过地址栏输入地址进入页面。此时,会请求主页面https://console.tgs-dev.tap4fun.com/ 和公共的资源文件。

2.点击跳转到登录板块。可以看到,由于初次进入应用的时候,已经加载了所有的静态资源,在“页面切换”时,只发送了相关的API请求。

3.再次刷新后,重新请求了静态资源。

单页应用的实现

单页应用的实现主要有两种方式,hash模式和history模式。从表现上来说,history模式和hash模式都能够实现不刷新的URL跳转。在平台的业务中,Kadmin采用的是history模式的路由跳转,TGS采用的是hash模式的路由跳转。

Kadmin URL参考:https://kadmin-inner.tap4fun.com/deploy/application/list/
TGS URL参考:https://console.tgs-dev.tap4fun.com/#/pay/goods

1、history模式

history模式是基于HTML5规范,利用history.pushStatehistory.replaceState API来完成 URL 跳转而无须重新加载页面。

API简介:

(1)history.pushState()

history.pushState(stateObj, title, url)

  • stateObj:状态对象,存储 JSON 字符串,可以用在 popstate 事件中。
  • title:标题,现在大多浏览器忽略这个参数,直接用 null 代替。
  • url:任意有效的URL,必须与当前页面处在同一个域,用于更新浏览器的地址栏。

history.pushState()用于新增一个历史记录。

(2)history.replaceState()

history.replaceState(stateObj, title, url)

history.replaceState()的使用与history.pushState()非常相似,区别在于replaceState()是修改了当前的历史记录项而不是新建一个。

history API详细介绍:https://developer.mozilla.org/en-US/docs/Web/API/History_API/Working_with_the_History_API#Adding_and_modifying_history_entries

history模式的具体实现在不同的框架中可能不尽相同,但是实现原理基本都是通过监听触发history对象修改的事件,并绑定相应的处理函数。

2、hash模式

hash模式使用 URL 的 hash 来模拟一个完整的 URL。由于hash本来的作用是锚点,因此,在 URL 改变时,页面不会重新加载。所以hash模式需要监听hashchange事件,并绑定相关的“页面切换”处理函数,以实现“页面切换”。同时可以使用 window.location.hash 属性获取和设置 hash 值。

window.addEventListener('hashchange', updateView(), false);

使用hash模式的单页应用,URL中会有一个“#”,让它和真正的URL始终有一些差异,不少开发者会觉得这样的形式有些“丑陋”,因此更偏爱于history模式。

单页应用的优点

  1. 局部刷新,渲染速度快。
  2. 允许浏览器在后台向服务器发出请求以完全获取其他内容或新“页面”的同时,保持当前页面的打开状态,交互性好。
  3. “页面”间数据传递十分方便,可以使用全局变量。
  4. 公共资源只需要加载一次,减少了HTTP请求数。
  5. 组件可复用。

单页应用的缺点

  1. 静态资源更新后,不会因为“页面切换”重新加载,必须手动刷新,否则可能出错。
  2. 在首页可能加载不必要的资源,当初次加载文件过多时,需要做相关的调优。否则,资源间的下载和执行相互阻塞,会导致页面初次加载速度变慢。
  3. 单页应用不利于SEO。

404 单页应用 报错 路由_单页应用相关推荐

  1. 404 单页应用 报错 路由_详解vue 单页应用(spa)前端路由实现原理

    写在前面:通常 SPA 中前端路由有2种实现方式: window.history location.hash 下面就来介绍下这两种方式具体怎么实现的 一.history 1.history基本介绍 w ...

  2. 404 单页应用 报错 路由_通过 Laravel 创建一个 Vue 单页面应用(五)

    文章转发自专业的Laravel开发者社区,原始链接:https://learnku.com/laravel/t/34858 我们在第4部分完成了编辑用户的功能,并且学习了如何使用 v-model 来监 ...

  3. 404 单页应用 报错 路由_Vue 部署单页应用,刷新页面 404/502 报错

    在 Vue 项目中,可以选择 hash或者 history.pushState() 实现路由跳转.如果在路由中使用history模式: export default new Router({ mode ...

  4. SAP WM LI04 试图去打印一个已经完成盘点流程(清账)的盘点单, 系统会报错!

    SAP WM LI04 Print Physical Inventory Document - Inventory record 30 already cleared – LI04 试图去打印一个已经 ...

  5. eas报错日记_金蝶EAS常见问题解答_基础业务服务_2016教程.docx

    金蝶EAS常见问题解答_基础业务服务_2016教程 目录1基础业务服务21.1基础组织21.2上机日志6问题描述61.3客户化菜单181.4 License许可351.5附件管理471.6编码规则62 ...

  6. mysql报错注入_关于Mysql注入过程中的三种报错方式

    放点原来的笔记,Mysql在执行语句的时候会抛出异常信息信息,而php+mysql架构的网站往往又将错误代码显示在页面上,这样可以通过构造如下三种方法获取特定数据. 实际测试环境: Default m ...

  7. 关于编辑器对input标签报错提示“表单输入没有相关label”的问题

    相信很多朋友在制作表单的时候,我们的编辑器会有下图的相关提示吧 我们发现虽然这样并不影响我们的正常使用,但是看着这样的报错提示总是很让人心烦,那么这到底是为什么呢? 其实,这是因为编辑器建议我们在使用 ...

  8. mysql报错乱码_连接mysql服务器报错时,出现乱码

    页头用了 header('content-type:text/html;charset=utf-8'); try { $this->dbo=new PDO($dsn,$dbuser,$dbpas ...

  9. php phar包require报错,php,_很奇怪,php 引入了phar,但是报错,说Predis\Client类找不到?,php - phpStudy...

    很奇怪,php 引入了phar,但是报错,说Predis\Client类找不到? require 'Predis.phar'; use Predis\Client; ini_set('session. ...

最新文章

  1. 学计算机专业英语报告范文,计算机学习报告
  2. 如何使用Laravel Debugbar?
  3. Log Buffer
  4. android 验证码
  5. bufg和bufgp_如何将自己写的verilog模块封装成IP核(一)
  6. 数据仓库之电商数仓-- 4、可视化报表Superset
  7. python3语音控制电脑_python语音控制电脑_uusee全屏
  8. 巴士电台开放接口API
  9. 程序媛爬取了 5 个 APP 的 4220 个数据,解读过去的一年到底过得怎么样!
  10. oracle数据库集群采用的是形式,铁道部采用Oracle集群数据库进行TMIS系统“三级建库”...
  11. [swift 进阶]读书笔记-C2P3_Set、 C2P4_Range
  12. 雷林鹏分享:PHP 实例 - AJAX 与 XML
  13. linux系统交换分区的文件格式是,【简答题】Red Hat Linux中,交换分区的文件系统类型是什么,光盘文件的文件系统类型是什么?...
  14. php 高德地图经纬度,高德地图php 换取经纬度 地址
  15. 快商通AI智能客服机器人,荣获中国科学院《互联网周刊》重磅荣誉!
  16. Apache中文URL中有包含“\x85”字节的汉字时导致的Rewrite失败及404问题
  17. FlashFXP 连接成功无法显示目录
  18. 四种隔离级别及应用场景
  19. 教你免费使用论文检索网,轻松下载
  20. 结构类型的定义,应用

热门文章

  1. UVA1368 UVALive3602 ZOJ3132 DNA Consensus String【贪心】
  2. scala 基础 —— 函数(柯里化)
  3. 【Python 安装】安装第三方库时 PermissionError: [WinError 5] Access is denied
  4. NVIDIA 显卡信息(CUDA信息的查看)
  5. numpy 维度与轴的问题
  6. 解决算法问题的思路 —— 从问题描述到数学表达
  7. 微信中html5获取手机号,微信小程序通过用户授权获取手机号
  8. python数据归一化代码_Python 数据归一化/标准化
  9. python随机数据库_Python实现生成随机数据插入mysql数据库的方法
  10. python界面编程实例_python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例...