一、 什么是单页面富应用?

单页面应用:Single Page Application

  • 概念:Web应用即使不刷新也在不同的页面间切换,解决浏览器前进、后退等机制被破坏等问题。并且页面访问会被浏览器保存。
  • 实现方法:
    1. Node+Html5实现
    2. React/Vue等MVVM框架

二、单页面应用的实现

1. Node+Html5

H5实现单页面应用为什么需要Node?
虽然使用的是H5的新特性:History API,但是单页面应用实际上是利用路由变化从而判断是否改变内容。这里仅用node开启服务,url地址的变化采用的是H5的History API。

步骤
  1. 使用express自动化构建项目
express myAppName
  1. 去掉多余路由文件(user.js),修改App.js渲染文件的类型(默认jade => html)
app.engine('html',require('ejs').renderFile);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'html');
  1. 编写index.html
    项目效果:点击相应button,url路由和底部内容都会相应变化
//html
<div class="appWried"><div class="appBtn"><button>PAGE1</button><button>PAGE2</button><button>PAGE3</button></div><div class="appContent">暂无内容</div>
</div>
<script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
<script>$(function(){var button = $('.appBtn button');button.click(function(){let route = $(this).text(); //获取按钮的文本//把按钮内容当做url路由导航pageChange(route);//history.pushState 添加浏览器历史history.pushState('','',route)   //state回调函数传入对象 title新页面标题 url新页面路径,地址栏会显示新路径})//根据点击或者路由改变相应的页面内容function pageChange(route){console.log(route);button.removeClass('active');//filter() 方法将匹配元素集合缩减为匹配指定选择器的元素button.filter(function(){return $(this).text() == route;}).addClass('active');//改变内容$('.appContent').text(`我是${route}`);}
})</script>

这里为了方便,我采用了JQuery的官方CDN。
pushState是html5的History新增的。

window.history.pushState(json,title,url)
// 状态对象:记录历史记录点的额外对象,可以为空
// 页面标题:目前所有浏览器都不支持, 可以为空
// 可选的url:浏览器不会检查url是否存在,只改变url,url必须同域,不能跨域

此外,pushState经常搭配监听历史记录点事件window.onpopstate来监听url的变化。并且可以获取存储在该历史记录点的状态对象,也就是pushState存储的json对象。例如:

window.addEbentListener('popState',function(){console.log('url改变')
})

2. React

现在很多前端框架都追求组件化开发、组件化复用。组件化和单页面应用非常配。所以React、Vue等也常常用于SPA的开发。
使用React开发SPA至少需要用到:React、React-router(-dom)

项目使用的是React-router-dom。
react-router 和 react-router-dom 的不同之处就是后者比前者多出了 这样的 DOM 类组件。并且react-router-dom是其升级版,可以更快更新,react-router即将废弃.

项目效果:

//views/index.js
import React from 'react';
import { Link,withRouter } from 'react-router-dom'
import './style.css'class AppPage extends React.Component{constructor(arg){super(arg)this.state={}}render(){let appContent = ''if(this.props.history.location.pathname){appContent = this.props.history.location.pathname}else{appContent = '暂无内容'}return(<div className="appWried"><div className="appBtn"><Link to="/PAGE1"><button className={ this.props.history.location.pathname === '/PAGE1' ? 'active' : '' }>PAGE1</button></Link><Link to="/PAGE2"><button className={ this.props.history.location.pathname === '/PAGE2' ? 'active' : '' }>PAGE2</button></Link><Link to="/PAGE3"><button className={ this.props.history.location.pathname === '/PAGE3' ? 'active' : '' }>PAGE3</button></Link></div><div className="appContent">{appContent}</div></div>)}
}AppPage = withRouter(AppPage); //通过withRouter给AppPage组件注入路由信息export default AppPage;
//App.js
import AppPage from './views/index'
<Router>...<AppPage />...
</Router>

注意:使用了route、withRouter需要在app.js最外层嵌套Router组件

至此,利用React实现简单的SPA就完成了!

三、总结

单页面应用开发在前端已经是不可或缺了。单页面应用既有它的优点,也有它的缺点。

优点:

  1. 良好的交互体验

用户不需要重新刷新页面,获取数据也是通过Ajax异步获取,页面显示流畅。

  1. 良好的前后端工作分离模式

单页Web应用可以和RESTful规约一起使用,通过REST API提供接口数据,并使用Ajax异步获取,这样有助于分离客户端和服务器端工作。更进一步,可以在客户端也可以分解为静态页面和页面交互两个部分。

  1. 减轻服务器压力

服务器只用出数据就可以,不用管展示逻辑和页面合成,吞吐能力会提高几倍;

  1. 共用一套后端程序代码

不用修改后端程序代码就可以同时用于Web界面、手机、平板等多种客户端;

缺点:

  1. SEO难度较高

由于所有的内容都在一个页面中动态替换显示,所以在SEO上其有着天然的弱势,所以如果你的站点对SEO很看重,且要用单页应用,那么就做些静态页面给搜索引擎用吧。

  1. 前进、后退管理

由于单页Web应用在一个页面中显示所有的内容,所以不能使用浏览器的前进后退功能,所有的页面切换需要自己建立堆栈管理,当然此问题也有解决方案,比如利用URI中的散列+iframe实现。

  1. 初次加载耗时多

为实现单页Web应用功能及显示效果,需要在加载页面的时候将JavaScript、CSS统一加载,部分页面可以在需要的时候加载。所以必须对JavaScript及CSS代码进行合并压缩处理,如果使用第三方库,建议使用一些大公司的CDN,因此带宽的消耗是必然的。

转载于:https://www.cnblogs.com/wbxjiayou/p/6155340.html

解决SPA的SEO(搜索引擎优化):SSR(服务器渲染)
SSR:服务器将每个要展示的页面都运行完成后,将整个相应流传送给浏览器,所有的运算在服务器端都已经完成,浏览器只需要解析 HTML 就行。

具体SSR作用下次介绍~

附上上面代码的github:SPA的实现

前端单页面富应用(SPA)的实现相关推荐

  1. 前端单页面(SPA)和多页面(MPA)

    了解单页面和多页面应用程序 单页面和多页面 SPA:( Single Page Application ) 单页面应用程序,例如:后台管理系统,整个应用中只有一个页面(index.html) MPA ...

  2. 你知道前端单页面路由是怎么实现的吗?

    首先要学习一下history对象,history对象保存着用户的上网记录,从浏览器窗口打开的那一刻算起.出于安全的考虑,开发人员无法得知用户浏览过的URL.不过,借由用户访问过的页面列表,同样可以在不 ...

  3. 什么是单页面应用(SPA)和多页面应用(MPA)

    背景 最初我们的应用都是多页面应用,多页面应用就是每次客户单请求都返回一个新的页面.在互联网初期,这个问题并没有带来很差的用户体验,但是随着移动互联网的发展以及用户的体验, 开发者开始考虑,为什么我们 ...

  4. java 单页面spa_Javascript 与 SPA单页Web富应用

    书单推荐 # <单页Web应用:JavaScript从前端到后端>http://download.csdn.net/detail/epubitbook/8720475 # <MVC的 ...

  5. 前端单页面拆分多个单页面

    问题现状 后端采用 ==多服务 + nginx== 的技术架构 根据业务拆分成不同的项目,具体服务通过location由nginx转发代理到不同的机器(端口)上. 前端采用的是 ==dva + roa ...

  6. 前端单页面应用分布式部署探索

    公司后台Java使用的Spring Cloud的微服务框架,订单,商品,报价,每一个模块都是一个微服务,一个包,独立打包,单独部署.避免了业务代码之间的强耦合,包也变小了.这是背景. 近两天,公司项目 ...

  7. 【浅入浅出】现代前端框架单页面

    在前端预备:现代前端框架单页面概念这一篇里,作者讲到了单页面,跟前端路由实现,我准备分两篇来记录. 首先,里面提到了一个概念:DOM 直出 简单说就是在浏览器输入网址后发起请求,返回来的 HTML 页 ...

  8. 前端的单页面模式和多页面模式

    一.前言 前端部分的搭建,需要考虑使用哪种模式进行页面之间的跳转交互, 而项目内的页面交互,不可避免的需要相互之间的数据共享. 这就引出了本篇博客的目的,一起来谈谈:项目前端部分的构建方式以及数据共享 ...

  9. SPA(单页面应用)和MPA(多页面应用)

    单页面应用 第一次进入页面时会请求一个html文件,刷新清除一下,切换到其他组件,此时路径也相应变化,但是并没有新的html文件请求,页面内容却变化了. 原理:js会感知到url的变化,通过这一点可以 ...

最新文章

  1. (多图)老弟,你连HTTPS 原理都不懂,还给我讲“中间人攻击”,逗我吗...
  2. Nginx配置中的log_format用法梳理(设置详细的日志格式)
  3. linux脚本语句,LINUX shell 脚本语句
  4. [Markdown语法][快速入门][CSDN]
  5. python爬虫视频 下载 黑马_Python爬虫能爬视频么(python爬虫零基础视频教程)
  6. RHEL 7.0已发布 CentOS 7 即将到来
  7. php和mysql一起_PHP和MYSQL数据库合理且有效的结合在一起_MySQL
  8. jquery选择器之基本选择器
  9. (大数据工程师学习路径)第三步 Git Community Book----基本用法(下)
  10. JavaScript页面跳转常用代码(转)
  11. net域名和com域名在属性和价值上有什么不同?
  12. 全网最细海龟 (turtle) 画图讲解 (三):设置画笔样式
  13. 联发科MT5580芯片处理器参数介绍
  14. 实现js尾递归优化的代码
  15. python 抽奖库_用 python 写一个年会抽奖小程序
  16. 计蒜客 428(人人都有极客精神-日期问题)
  17. c语言atm程序个人总结,C语言程序设计报告(模拟ATM取款机)
  18. Lesson 13 'It's only me' 内容赏析
  19. Derek Wilson:三重缓冲,为什么我们爱它
  20. 哥德巴赫猜想python版

热门文章

  1. 有刷电机和无刷电机。
  2. 珍爱生命,远离正则表达式(parse库简介)
  3. 怎么设计网站设计?需要注意什么?
  4. 数字电路-逻辑代数基础
  5. JSON日期格式转换
  6. 移动支付场景覆盖日渐完善市场下沉是必然
  7. 收集 恋爱 结婚 等烦恼问题
  8. Makefile中的$
  9. 6种肤色检测方法的原理及实现(opencv, C++)
  10. 服务器ubuntu系统安装后黑屏,ubuntu 成功安装后开机黑屏或闪屏