0

0

javascript如何实现单页面应用?_学习javascript路由原理【教程】

紅蓮之龍

紅蓮之龍

发布时间:2026-01-24 14:08:03

|

949人浏览过

|

来源于php中文网

原创

单页面应用(spa)的最小实现是通过history.pushstate修改url、popstate监听路由变化、配合路由表匹配路径并更新dom。需手动首次调用路由函数,拦截a标签点击,服务端须兜底返回主html。

javascript如何实现单页面应用?_学习javascript路由原理【教程】

什么是单页面应用(SPA)的最小实现?

单页面应用的核心不是框架,而是「不刷新页面却能改变 URL 并响应视图变化」。关键在于拦截浏览器默认跳转行为,用 JavaScript 手动更新内容 + 修改地址栏,同时监听地址变化做对应渲染。

最简可行方案只需三步:history.pushState 改 URL、window.addEventListener('popstate') 监听后退/前进、配合一个路由表匹配路径并切换 DOM。

  • 不用 location.hash 也能做,但需服务端配合(所有路径返回同一 HTML)
  • pushState 不触发页面刷新,但会留下历史记录,用户可正常点击后退
  • 首次加载时,需从 location.pathname 读取当前路径,主动匹配一次路由

如何手写一个基础前端路由?

下面是一个无依赖、支持 //about/user/123 的简易路由:

const routes = {
  '/': () => document.getElementById('app').innerHTML = '<h2>首页</h2>',
  '/about': () => document.getElementById('app').innerHTML = '<h2>关于</h2>',
  '/user/:id': (params) => document.getElementById('app').innerHTML = `<h2>用户 ${params.id}</h2>`
};

function route() {
  const path = location.pathname;
  for (const [pattern, handler] of Object.entries(routes)) {
    const regex = new RegExp('^' + pattern.replace(/:(\w+)/g, '([^/]+)') + '$');
    const match = path.match(regex);
    if (match) {
      return handler(match.slice(1));
    }
  }
  document.getElementById('app').innerHTML = '<h2>404</h2>';
}

// 首次加载
route();

// 监听浏览器前进/后退
window.addEventListener('popstate', route);

// 拦截 a 标签点击(假设所有路由链接都加了 data-navigate 属性)
document.addEventListener('click', e => {
  if (e.target.matches('a[data-navigate]')) {
    e.preventDefault();
    history.pushState({}, '', e.target.href);
    route();
  }
});

注意:pushState 第三个参数必须是同源 URL,否则抛出 SecurityErrorpopstate 在页面首次加载时不会触发,所以必须手动调用一次 route()

Dora
Dora

创建令人惊叹的3D动画网站,无需编写一行代码。

下载

立即学习Java免费学习笔记(深入)”;

为什么不能只靠 location.hash

location.hash 确实能避免刷新,但它有硬伤:URL 中的 # 后内容不发给服务端,导致分享链接、SEO、服务端直出全部失效。更重要的是,现代 SPA 都要求真实路径语义(如 /blog/2023/04),而 # 路由只能模拟成 /?#/blog/2023/04 这类丑陋形式。

  • hashchange 事件兼容性好,但已属历史方案,新项目应优先用 History API
  • 使用 hash 时,pushStatereplaceState 无效,必须用 location.hash = '...'
  • 服务端无需配置,但不利于 PWA 缓存策略和 HTTP 缓存头控制

服务端需要做什么?

如果用了 history.pushState,用户直接访问 /user/123 时,浏览器会向服务端发起请求。此时服务端不能返回 404,而要始终返回你的主 HTML 文件(比如 index.html),让前端路由接管。

  • Nginx 配置示例:try_files $uri $uri/ /index.html;
  • Vercel/Netlify 自动处理,无需额外配置
  • 本地开发用 serve -s build(-s 表示 single-page app 模式)
  • 若服务端返回 404,用户刷新页面就会看到空白或错误页,这是最常被忽略的部署陷阱

路由逻辑本身完全在前端,但它的健壮性高度依赖服务端兜底策略——这点比写多少嵌套路由都关键。

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

246

2023.07.27

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

522

2023.08.04

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

610

2023.08.04

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

244

2024.02.23

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

693

2024.07.09

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

3618

2024.08.07

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

54

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

71

2026.01.13

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号