热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

单页面应用VS多页面应用的区别和适用场景

本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了单页面应用 VS 多页面应用相关的知识,希望对你有一定的参考价值。


技术图片

 

 

单页应用(SinglePage Application,SPA)


指只有一个主页面的应用,一开始只需加载一次 js,css 等相关资源。所有的内容都包含在主页面,对每一个功能模块组件化。单页应用跳转,就是切换相关组件,仅刷新局部资源。


多页应用(MultiPage Application,MPA)


指有多个独立的页面的应用,每个页面必须重复加载 js,css 等相关资源。多页应用跳转,需要整页资源刷新。



两者对比表格:





















































 SPAMPA
结构一个主页面 + 许多模块的组件许多完整的页面
体验页面切换快,体验佳;当初次加载文件过多时,需要做相关的调优。页面切换慢,网速慢的时候,体验尤其不好
资源文件组件公用的资源只需要加载一次每个页面都要自己加载公用的资源
适用场景对体验度和流畅度有较高要求的应用,不利于 SEO(可借助 SSR 优化 SEO)适用于对 SEO 要求较高的应用
过渡动画Vue 提供了 transition 的封装组件,容易实现很难实现
内容更新相关组件的切换,即局部更新整体 html 的切换,费钱(重复 HTTP 请求)
路由模式可以使用 hash ,也可以使用 history普通链接跳转
数据传递因为单页面,使用全局变量就好(Vuex)COOKIE 、localStorage 等缓存方案,URL 参数,调用接口保存等
相关成本前期开发成本较高,后期维护较为容易前期开发成本低,后期维护就比较麻烦,因为可能一个功能需要改很多地方

 




单页应用实现核心:前端路由


前端路由的核心:改变视图的同时不会向后端发出请求。


这里我讲讲 vue-router 路由的两种模式:hash&history


1、hash 模式

hash 模式背后的原理是 onhashchange 事件。



  1. window.addEventListener( hashchange ,function(e) {



  2. console.log(e.oldURL);



  3. console.log(e.newURL)



  4. },false);




通过 window.location.hash 属性获取和设置 hash 值。


由于 hash 发生变化的 url 都会被浏览器记录下来,所以浏览器的前进后退可以使用,尽管浏览器没有请求服务器,但是页面状态和 url 关联起来。后来人们称其为前端路由,成为单页应用标配。


hash 模式的特点在于 hash 出现在 url 中,但是不会被包括在 HTTP 请求中,对后端没有影响,不会重新加载页面。



2、history 模式


利用了 HTML5 History Interface 中新增的 pushState()replaceState(),它们提供了对历史记录进行修改的功能。


相关的 API:


history.pushState()



  1. history.pushState(stateObj, title, url);




  1. state:一个与指定网址相关的状态对象, popstate 事件触发时,该对象会传入回调函数。如果不需要可填 null

  2. title:新页面的标题,但是所有浏览器目前都忽略这个值,可填 null

  3. url:新的网址,必须与当前页面处在同一个域。浏览器的地址栏将显示这个网址。


例如:history.pushState(new,new,new.html);


添加上面这个新记录后,浏览器地址栏立刻显示 ~/new.html,但并不会跳转到 new.html,它只是成为 history 中的最新记录。pushState 方法不会触发页面刷新,只是 history 对象变化,地址栏会变。


history.replaceState()



  1. history.replaceState(stateObj, title, url);



参数同 pushState() 一样。

调用该方法,会修改当前的 history 对象记录, history.length 的长度不会改变


history.state

当前 URL 下对应的状态信息。如果当前 URL 不是通过 pushState 或者 replaceState 产生的,那么 history.statenull。当需要 state 和 URL 同步时可以使用 replaceState() 使之同步。


popstate 事件


同一个文档的 history 对象出现变化时,就会触发 popstate 事件。


不同的浏览器在加载页面时处理 popstate 事件的形式存在差异。页面加载时 Chrome 和 Safari 通常会触发 popstate 事件,但 Firefox 则不会。

注意:调用 history.pushState() 或者 history.replaceState() 不会触发 popstate 事件。 popstate 事件只会在浏览器某些行为下触发, 比如点击后退、前进按钮(或者调用 history.back()、history.forward()、history.go()方法)。

 

参考文章:https://mp.weixin.qq.com/s/P3IPqGvcDooLht5xKWPIOw


推荐阅读
  • Vulnhub DC3 实战记录与分析
    本文记录了在 Vulnhub DC3 靶机上的渗透测试过程,包括漏洞利用、内核提权等关键步骤,并总结了实战经验和教训。 ... [详细]
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • 开发笔记:前端之前端初识
    开发笔记:前端之前端初识 ... [详细]
  • http:blog.csdn.netzeo112140articledetails7675195使用TCPdump工具,抓TCP数据包。将数据包上传到PC,通过Wireshark查 ... [详细]
  • 提升工作效率:掌握15个键盘快捷键
    在日常工作中,熟练掌握计算机操作技巧能够显著提升工作效率。本文将介绍15个常用的键盘快捷键,帮助用户更加高效地完成工作任务。 ... [详细]
  • Spring Boot使用AJAX从数据库读取数据异步刷新前端表格
      近期项目需要是实现一个通过筛选选取所需数据刷新表格的功能,因为表格只占页面的一小部分,不希望整个也页面都随之刷新,所以首先想到了使用AJAX来实现。  以下介绍解决方法(请忽视 ... [详细]
  • 如题:2017年10月分析:还记得在没有智能手机的年代大概就是12年前吧,手机上都会有WAP浏览器。当时没接触网络原理,也不 ... [详细]
  • 在Ubuntu 18.04上使用Nginx搭建RTMP流媒体服务器
    本文详细介绍了如何在Ubuntu 18.04上使用Nginx和nginx-rtmp-module模块搭建RTMP流媒体服务器,包括环境搭建、配置文件修改和推流拉流操作。适用于需要搭建流媒体服务器的技术人员。 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • Redis 是一个高性能的开源键值存储系统,支持多种数据结构。本文将详细介绍 Redis 中的六种底层数据结构及其在对象系统中的应用,包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象。通过12张图解,帮助读者全面理解 Redis 的数据结构和对象系统。 ... [详细]
  • 在移动端开发中,多点触控手势是提升用户体验的重要手段。然而,目前只有iOS浏览器原生支持手势事件,其他设备需要通过touchstart、touchmove和touchend等基础事件进行自定义实现。本文将详细介绍如何在Vue项目中实现多点触控手势。 ... [详细]
  • 本文整理了 DedeCMS 中常用的标签分类及其具体应用方法,包括标题调用、导航调用、文章列表、子栏目调用、尾部信息调用等。 ... [详细]
  • 本文介绍了 Oracle SQL 中的集合运算、子查询、数据处理、表的创建与管理等内容。包括查询部门号为10和20的员工信息、使用集合运算、子查询的注意事项、数据插入与删除、表的创建与修改等。 ... [详细]
  • 随着SEO技术的发展,越来越多的企业和个人开始重视网络营销。然而,要让网站在搜索引擎中获得良好的排名,不仅需要提升网站内容的质量,还需要构建高质量的外部链接。本文将详细介绍什么是高质量的外部链接以及如何有效构建这些链接。 ... [详细]
  • ipsec 加密流程(二):ipsec初始化操作
    《openswan》专栏系列文章主要是记录openswan源码学习过程中的笔记。Author:叨陪鲤Email:vip_13031075266163.comDate:2020.1 ... [详细]
author-avatar
纠结丿灬情殇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有