来源:https://zhuanlan.zhihu.com/p/648113861

概述

单页应用(SPA,Single Page Application)是一种网页应用或网站的设计模式,它在浏览器中仅加载一个 HTML 页面,并动态地更新该页面,而不是为每个新页面加载新的 HTML。这使得应用能够与用户交互,无需重新加载整个页面。

主要特点:

  1. 动态重写:SPA 在用户与应用交互时动态地重写当前页面,而不是加载新页面。
  2. 速度:由于大部分资源(如 HTML、CSS、JavaScript)只加载一次,因此 SPA 通常比传统的多页应用有更快的响应。
  3. 浏览器历史记录:虽然 SPA 只有一个页面,但它们可以使用浏览器的历史API来创建可导航的URL,使用户可以使用浏览器的前进和后退按钮。
  4. 与后端交互:SPA 通常会与后端的 Web API 进行数据交互,获取所需的数据并更新视图。
  5. 前端路由:SPA 使用前端路由来管理应用中的不同视图,而不是依赖服务器端的路由。

简而言之,单页应用是一种在浏览器中动态更新和呈现内容的方法,而无需每次用户操作时都从服务器加载新页面。这提供了流畅、快速和用户友好的体验。

需求场景

场景:音乐播放应用

背景: 小梅是一名开发者,她想为音乐爱好者创建一个在线音乐播放应用。用户可以搜索歌曲、创建播放列表、控制播放和查看歌曲详情。

需求:

  1. 用户打开应用时,首先看到一个搜索框和推荐的歌曲列表。
  2. 用户可以在搜索框中输入歌曲或艺术家的名称,然后看到搜索结果。
  3. 用户点击一首歌曲可以播放,并可以查看歌曲的详情。
  4. 用户希望在操作过程中,音乐不会中断,页面也不会完全刷新。

SPA 实施:

单一HTML页面:小梅创建一个HTML页面作为应用的基础。

动态加载内容:

  • 当用户在搜索框中输入并提交时,应用使用 AJAX 向服务器请求数据,然后动态更新搜索结果区域的内容。
  • 当用户点击一首歌曲时,歌曲的播放和详情也是通过动态加载实现的。

前端路由:小梅使用前端路由库来管理不同的视图(如首页、搜索结果、歌曲详情)。当用户点击不同的歌曲或执行不同的操作时,URL 会改变(例如 #/song/1234),但页面不会重新加载。

与后端交互:每当需要从服务器获取数据(如搜索结果或歌曲详情)时,应用会发起 API 请求,然后用返回的数据动态更新页面内容。

结果: 小梅成功创建了一个流畅的在线音乐播放应用。用户可以无缝地搜索、播放音乐和查看歌曲详情,无需等待页面加载或担心音乐中断。

结论: 通过使用单页应用(SPA)的设计模式,小梅为用户提供了一个快速、流畅且无缝的音乐体验,避免了传统多页应用中频繁的页面刷新和加载延迟。

详细示例

单页应用(SPA,Single Page Application)是一种网页或网站应用,它在单个页面中提供用户所需的所有内容和交互。当用户与应用交互时,SPA 会动态地重写当前页面,而不是加载整个新页面。这通常通过 AJAX 和 HTML5 的历史API实现,从而提供更快、更流畅的用户体验。

示例:

想象一下你正在使用一个在线的天气预报应用。这个应用允许你查看不同城市的天气、查看5天的天气预报、查看气象图表等。

  1. 初始加载:当你首次访问这个应用时,它会加载一个完整的页面,其中包含顶部的导航栏、搜索框、当前城市的天气信息等。
  2. 查看其他城市的天气:当你在搜索框中输入另一个城市的名称并点击“搜索”时,应用不会加载一个全新的页面。相反,它会在后台向服务器发送一个请求,获取该城市的天气数据,然后动态地更新页面的部分内容,如天气信息、图表等。
  3. 查看5天的天气预报:当你点击“5天预报”按钮时,应用再次向服务器发送请求,获取5天的数据。然后,它动态地在当前页面中插入这5天的天气信息,而不是导航到一个新的页面。
  4. 导航:尽管这是一个单页应用,但你仍然可以使用浏览器的“前进”和“后退”按钮来导航。这是因为应用使用 HTML5 的历史API来更改浏览器的URL,而不实际加载新页面。

这个在线天气预报应用的优点是:

  • 用户不需要等待整个页面重新加载,从而提供了更快的响应时间。
  • 减少了服务器的负载,因为只有必要的数据被请求和发送,而不是整个页面。
  • 提供了一个更接近桌面应用的流畅体验。

总的来说,单页应用(SPA)是为了提供更好的用户体验而设计的,它允许网页内容和交互在单个页面中动态地更新。

部分概念解释

SPA 怎么实现的动态重写? SPA 动态重写页面主要依赖于 JavaScript。当用户与页面交互时,JavaScript 会捕获这些事件(如点击按钮),然后根据需要执行相关的函数。这些函数可能会修改页面的 DOM,添加、删除或修改元素,从而动态地更新页面内容。这种方式避免了完全重新加载页面。

SPA只有一个页面为什么可以有历史记录,前进后退? 尽管 SPA 只有一个物理页面,但它可以使用 HTML5 的 History API 来更改浏览器的 URL 而不重新加载页面。通过 pushState 和 replaceState 方法,SPA 可以添加或修改浏览器历史记录。当用户点击前进或后退按钮时,popstate 事件会被触发,SPA 可以捕获这个事件,并相应地更新页面内容。

SPA怎么和后端交互? SPA 主要使用 AJAX(Asynchronous JavaScript and XML)与后端进行交互。使用 JavaScript 的 XMLHttpRequest 对象或现代的 fetch API,SPA 可以在后台异步地请求数据,然后在前端处理和显示这些数据。此外,许多 SPA 还使用 WebSockets、GraphQL 或其他API形式与后端交互。

路由是什么? 路由是确定如何响应客户端请求的一种机制。在 Web 开发中,路由通常基于请求的 URL 和 HTTP 方法(如 GET、POST)来决定哪个控制器或函数应该处理该请求。

前端路由是什么? 前端路由是 SPA 中的一个关键概念,它允许 SPA 在不从服务器请求新页面的情况下更改视图或内容。当用户点击链接或导航到新的 URL 时,前端路由会捕获这个事件,然后使用 JavaScript 来决定如何响应:例如加载一个新的视图模板、获取新的数据等。这种方法提供了快速的页面切换和更好的用户体验。流行的前端框架,如 React、Vue 和 Angular,都提供了前端路由的解决方案。

服务器端的路由是什么? 服务器端路由是指服务器根据客户端的请求(通常是 URL 和 HTTP 方法)来决定返回哪个页面或资源。例如,当你访问 https://example.com/about,服务器可能会识别 /about 路由并返回关于页面的内容。在传统的多页面应用中,每次导航到新页面都涉及到服务器端路由。

URL中的#是什么? URL 中的 # 符号表示片段标识符,它用于指向页面中的特定部分。在单页应用(SPA)中,# 通常与前端路由结合使用,创建所谓的哈希路由。这允许 SPA 在不从服务器加载新页面的情况下更改浏览器的 URL。

AJAX 是什么? AJAX(Asynchronous JavaScript and XML)是一种在不重新加载整个页面的情况下与服务器交换数据并更新部分网页内容的技术。它允许页面在后台异步地发送请求,获取数据,然后使用 JavaScript 更新页面。尽管名字中有 "XML",但现代的 AJAX 交互通常使用 JSON 格式。

HTML5是什么? HTML5 是 HTML(超文本标记语言)的最新版本,它为 Web 开发者提供了许多新的元素、属性和 APIs。HTML5 的目标是提供一个更加丰富、更加互动的 Web 标准,包括视频、音频、图形和动画支持,以及更强大的 JavaScript API。

HTML5的历史API是什么? HTML5 的历史 API(通常称为 History API)允许开发者直接与浏览器的会话历史进行交互。这意味着开发者可以在不重新加载页面的情况下修改浏览器的 URL。主要的方法包括 pushState、replaceState 和 popstate 事件。这个 API 在单页应用(SPA)中尤其有用,因为它允许 SPA 在用户导航时更改 URL,提供了更自然的浏览体验。

单页应用(SPA)是什么?的更多相关文章

  1. 单页应用SPA做SEO的一种清奇的方案

    单页应用SPA做SEO的一种清奇的方案 网上有好几种单页应用转seo的方案,有服务端渲染ssr.有预渲染prerender.google抓AJAX.静态化...这些方案都各有优劣,开发者可以根据不同的 ...

  2. 从单页应用(SPA)到服务器渲染(SSR)

    从单页应用(SPA)到服务器渲染(SSR) 情景回顾 在学习Vue开发一个电商网站的管理后台时,使用到了一个组件 vue-quill-editor 主要是一个快捷的一个富文本编辑器 在使用这个组件的组 ...

  3. 移动前端开发-单页应用(spa)模型

    一门新的技术诞生总会引来一番争议,单页Web应用程序也不例外,其最大的优势在于用户体验,对于内容的改动不需要加载整个页面:对服务器压力很小,消耗更少的带宽,与面向服务的架构更好地结合.使用HTML+C ...

  4. 单页应用SPA的路由

    关于单页应用 单页Web应用(single page web application,SPA),就是只有一张Web页面的应用,是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用 ...

  5. 单页应用SPA开发最佳实践

    最近用vue+vue-router做了个单页应用的项目,页面大概有15个左右.积累了一些开发经验在此做一些记录.本文主要从可维护性方面来考虑SPA的开发实践 全站的颜色定义放在一个less或者scss ...

  6. 《移动Web前端高效开发实战》笔记4--打造单页应用SPA

    路由是一个单页应用的核心,大部分前端框架都实现了一个复杂的路由库,包括动态路由,路由钩子,组件生命周期甚至服务器端渲染等复杂的功能.但是对于前端开发者而言,路由组件的核心是URL路径到函数的映射,了解 ...

  7. 基于jQuery/zepto的单页应用(SPA)搭建方案

    这里介绍一个基于jquery或zepto的单页面应用方案,遵循尽可能简单的原则,使大家一目了然,只需配置一个路由,之后完全按照jq日常写法即可完成.可做学习使用,也可修改后用于一些业务逻辑简单的spa ...

  8. Nodejs之MEAN栈开发(六)---- 用Angular创建单页应用(上)

    在上一节中我们学会了如何在页面中添加一个组件以及一些基本的Angular知识,而这一节将用Angular来创建一个单页应用(SPA).这意味着,取代我们之前用Express在服务端运行整个网站逻辑的方 ...

  9. Senna.js – 速度极快的单页应用程序引擎

    Senna.js 是一个速度超快的单页应用程序引擎,提供了几个低级别的 API,可以帮助你打造现代化的基于 Web 的应用程序.更重要的是,搜索引擎蜘蛛应该能够索引相同的内容. 通过使用 HTML5 ...

  10. seo-mask -- 为单页应用创建一个适合蜘蛛爬取的seo网站

    seo-mask seo-mask是利用搜索引擎蜘蛛的爬取原理(蜘蛛只会爬取网页的内容,并不会关心解析网页里的css和js),制作一套专门针对seo的镜像网站,鄙人称它为针对seo的mask,让蜘蛛看 ...

随机推荐

  1. Proxmox VE(虚拟机集群)安装配置

    #Proxmox VE 安装配置 创建kvm模板 有私有云需求, 创建与管理Windows和Linux虚拟机的场景,使用PVE(Proxmox VE)管理很方便. 本人使用PVE管理公司开发测试环境几 ...

  2. python 根据中文表头标题抓取动态(表格)文档数据

    思路 如图左侧表头标题,要获得右侧数据.网页数据提取成汉字,表格数据间会有空格,用split()分隔成list.用index()查找某个汉字表头位置,输出list下一个位置既是要得到值 text2 = ...

  3. 循规蹈矩--从零开始建设k8s监控(一)

    前言 监控k8s集群,目前主流就是使用prometheus以及其周围的生态,本文开始介绍怎么一步步完成k8s监控的建设 环境准备 组件 版本 操作系统 Ubuntu 22.04.4 LTS minik ...

  4. React 应用的 Nginx 缓存控制

    典型 React 应用面临的缓存问题,可通过 Nginx 配置进行解决 通用部署 构建应用后,只需使用 Nginx 指向静态文件即可 server { listen 80; root /PATH/TO ...

  5. [开源项目]YOLOv8_Efficient

    Yolov8_Efficient Simple and efficient use for yolov8 About This is an unofficial repository maintain ...

  6. 在jooq的POJO类中使用Lombok的Data注解

    jooq生成pojo类的配置根据官方给的如下: https://www.jooq.org/doc/3.14/manual/getting-started/tutorials/jooq-in-7-ste ...

  7. 后端开发之chrome开发者模式-copy

    1. 场景描述 java开发前后端分离模式越来越流行,后端人员可以直接使用swagger进行接口调试(前后端分离之Swagger2),但是调试的时候,需要设置入参,假如该模块不是软件老王开发的,接别人 ...

  8. w3cschool-Nginx 使用手册

    https://www.w3cschool.cn/nginxsysc/ Nginx 使用手册 手册简介 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 ...

  9. Linux 提权指南

    知屋漏者在宇下,知政失者在草野,知经误者在诸子. 导航 壹 - 密码搜寻 贰 - Sudo 命令 叁 - SUID/SGID 特权 肆 - 计划任务 伍 - 文件/目录 陆 - Linux 内核 柒 ...

  10. Collection的子接口之一:List 接口

    List 接口概述: 鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组 List集合类中 元素有序.且可重复,集合中的每个元素都有其对应的顺序索引. List容器中的元素都对 ...