spa单页面开发的尝试

首先 spa是什么

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

提取要点来理解 单个html文件,动态更新。直观的说就是没有后续的页面加载处理,(不会再任何位置重新加载,也不会去申请其他页面资源)

那么为什么要用这个技术
可以先看看网易云音乐官网的处理。(大部分的首页处理并非全部)。在使用的时候我们明显体会到了跟多页面的不同。在用户体验上的优势是这个技术得以流行的主要原因。列举如下:

  • 快速渲染和及时反馈
  • 响应时间缩短,在传统网站中,对于用户的请求 会有一个 请求-反应-重绘的周期,处理时间更长,但是在单页应用中,更多的处理逻辑将在前端执行,服务端的工作只有必要的数据验证,数据持久存储等,以加快响应时间
  • 避免资源浪费。在网易云音乐的官网中,用很大一部分是固定资源(比如标题 边框等等)占据很多空间。但是如果做成多页面的话,将会浪费时间去做反复的整张重绘
  • 可以控制的加载过程展示,相对于传统网站,可以在加载的过程中给出更加友好的过程展示

应该怎么做
两种方法:hash 和 history
hash:

hash 属性是一个可读可写的字符串,该字符串是 URL 的锚部分(从 # 号开始的部分)

#代表的不是路径的一部分 而是一个代表位置的字符,还记得学习HTML时有说过a标签一开始是用来定位的。a标签的确可以实现锚点,还有一种方法,(看着#可能会想到是不是跟id有关。)id属性 也可以实现。
需要强调几点

  1. http请求不包括#以及之后的部分
  2. 改变hash(#)会改变浏览器的浏览历史记录
  3. 改变hash(#)不会导致页面重载

从别人的例子我们知道,要实现的无非自己来决定是#之后的内容,以及动态更新前端资源(ajax)
核心代码是

window.addEventListener('hashchange',function(){
            var hash = document.location.hash;
            ...
            ...
            ...
}

以下是我实现的的效果图效果展示

这里是代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .one,.two{
            width: 1000px;
            height: 300px;
            border: 1px solid black;
            margin: 0 auto;
        }
        #daixuan{
            height: 50px;
            width: 100%;
            background-color: antiquewhite
        }
    </style>
</head>
<body>
    <div id="daixuan">
            <a href="#first">the first one</a> <a href="#second">the second one</a>
    </div>
    <div id="first">
       
        <div class="one"></div>
        <div class="two"></div>
    </div>
    <script>
        window.addEventListener('hashchange',function(){
            var hash = document.location.hash;
            if(hash == '#first'){
            
                var xhr = new XMLHttpRequest();
                xhr.onload = function(){
                    var output =  JSON.parse(xhr.responseText);
               console.log(output);
                document.getElementsByClassName('one')[0].innerHTML = output[0] .say;
                document.getElementsByClassName('two')[0].innerHTML = output[0].reply;
                }
                xhr.open('GET','./data.json',true);
                xhr.send();
            }
            if(hash == '#second'){
             
                var xhr = new XMLHttpRequest();
                xhr.onload = function(){
                    var output =  JSON.parse(xhr.responseText);
               console.log(output);
                document.getElementsByClassName('one')[0].innerHTML = output[1] .say;
                document.getElementsByClassName('two')[0].innerHTML = output[1].reply; 
                }
                xhr.open('GET','./data.json',true);
                xhr.send();
            }
        })
    </script>
</body>
</html>

待传的json数据在这里

[
    {
        "say":"This is the first one",
        "reply":"Hello,the first one"
    },
    {
        "say":"This is the second one",
        "reply":"Hello,the second one"
    }
]

细节就不多说了,欢迎指正。但是要强调:Chrome浏览器不接受file协议,即本地json数据,使用时会报错,像这样:
报错信息
我的处理方式是在vscode里下载live server插件。

另一种方式是通过html5
的history api:
history.pushState()和history.replaceState(),一个事件history.onpopstate.

  • [ history.pushState(stateObj, title, url)
    stateObj为一个状态对象,这个对象可以被popstate事件读取,也可以在history对象中获取。
    title为标题一般使用空串来代替。
    url为路径。 pushState是向浏览器的历史记录栈中压入一个历史记录。]

  • [history.replaceState()所接受的参数相同,作用为代替记录。

onpopstate事件  在点击浏览器浏览记录前进后退时触发

这个方法我只做了初步了解,在实现之后我再把代码和样例附上。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# 页面和多页面开发及应用 # 页面: - 什么是页面页面是指只有一个主页面的应用,浏览器一开始要加载所有必须的 html, js, css。所有的页面内容都包含在这个所谓的主页面中。但在写的时候,还是会分开写(页面片段),然后在交互的时候由路由程序动态载入。 - 跳转仅加载一次,用于PC和公务网站 - 页眉 -> 第一页,第二页, 第三页 -> 脚本 # 页面技术: -AngularJS是一个全面的客户端侧框架。其模板基于双向UI数据绑定。数据绑定是一种自动方法,在模型改变时更新视图,以及在视图改变时更新模型。其HTML模板在浏览器中编译。编译步骤创建纯HTML,浏览器将其重新渲染到实时视图。该步骤会在随后的页面浏览中重复。在传统的服务器端HTML编程中,控制器和模型等概念在服务器进程中进行交互以产生新的HTML视图。在AngularJS框架中,控制器和模型状态在客户端的浏览器中维护,从而使生成新页面不依赖与服务器的交互。 -Ember.js是基于模型-视图-控制器(MVC)软件架构模型的客户端侧JavaScript Web应用程序框架。它允许开发人员在一个框架中通过常用的习惯用语和最佳实践来创建可伸缩的单页面应用程序。该框架提供丰富的对象模型、声明性双向数据绑定、计算属性,Handlebars.js提供的自动更新模板,以及一个路由器管理应用程序状态。 -Meteor.js是一个专门为页应用设计的全栈(客户端-服务器)JavaScript框架。它具有比Angular、Ember或ReactJS更简的数据绑定特性且使用--Distributed Data Protocol和一个发布/订阅来自动将数据更改传播到客户端,无需开发人员编写任何同步代码。全栈反应确保从数据库到模板的所有层都可以在必要时自动更新。诸如服务器端渲染等生态系统包则解决搜索引擎优化(SEO)等问题。 -Aurelia是一个适用于移动设备、桌面和网页的JavaScript客户端框架。它类似AngularJS,但更新、更符合标准,并采用模块化举措。Aurelia使用下一代ECMAScript编写。 -Vue.js(通常称为Vue)是一个用于构建用户界面的开源渐进式JavaScript框架。 -React(通常写为React.js或ReactJS)是一个构建用户界面的JavaScript函式庫。它由Facebook、Instagram和个人开发者以及企业社区维护。React最大的优势是易于使用——基本上任何熟悉HTML的开发人员都可以创建React应用程序。另一个所称的优势是可能使用相同的技术堆栈来同时创建Web与移动应用程序。有多家公司使用React和Redux库来让开发人员创建复杂但可扩展的Web应用程序。 -Fulcro是一个全栈库,它采用Netflix的Falcor,Facebook的Relay和Om Next对反应性,功能性,数据驱动软件进行改编的数据驱动原则。 -页面做seo(搜索引擎优化): -根据部分进行优化为每个关键字创建一个<div>或<section>或每个关键字并为其分配一个适当的ID,该页面上的内部链接将链接至ID。 -优化页面速度对于页网站SEO来说至关重要。 - 做了seo 以后,页面还是页面 # 页面优点: -减小服务器压力。 如果不用页面spa),如果每次切换页面的时候,都向服务器发送一个请求,服务器返回一个html文件;但是如果使用了页面,在切换时,不需要请求服务器,只要通过本地的js来切换即可。并且服务器端就不需要配置路由,完全做到了前后端分离 -增强用户体验,增加app的使用流畅性。 使用spa之后,页面在切换的时候非常流畅,完全没有那种不断刷新的感觉,而是非常快的就有了响应,因为js运行速度很快,所以js在做本地路由的时候,就会非常快。 -页应用没有页面之间的切换,就不会出现“白屏现象”,也不会出现假死并有“闪烁”现象。 -页应用相对服务器压力小,服务器只用出数据就可以,不用管展示逻辑和页面合成,吞吐能力会提高几倍。 -良好的前后端分离。后端不再负责模板渲染、输出页面工作,后端API通用化,即同一套后端程序代码,不用修改就可以用于Web界面、手机、平板等多种客户端。 -页面缺点: -首次加载耗时比较多。 解决办法:可以采用基于HTTP Chunk 的首屏数据渐进式预加载方案,该方案总体减少了页应用1.2s的首屏呈现时间。首屏数据渐进式预加载的优化思路也得到了体现: 优化首屏数据加载节点的速度。 预先加载首屏数据,使得多个串行节点并行化。 -SEO问题,不利于百度,360等搜索引擎收录。 解决办法:可以采用prerender服务,它拿到请求够,直接在服务端的一个js engine里,运行这个HTML(就像浏览器做的那样),直到内容动态填完之后,再广播一个事件告诉phantomjs“内容已经好了,可以返回给爬虫了”,这样爬虫就拿到了一份完整的HTML,就和在浏览器里渲染完的一样。目前流行的框架都有对应的服务器渲染框架 -如有造成Css命名冲突。 解决办法:我们可以使用Sass、LESS和Stylus等CSS预处理器,在一定程度上可以解决该问题。 -前进、后退、地址栏、书签等,都需要程序进行管理,页面的复杂度很高,需要一定的技能水平和开发成本高。 # 多页面: -什么是多页面:每一次页面跳转的时候,后台服务器都会给返回一个新的html文档,这种类型的网站也就是多页网站,也叫做多页应用 - 跳转需要刷新所有资源,用于app 或 客户端 - 页眉 -> 第一页 -> 脚本,页眉 -> 第二页 -> 脚本,页眉 -> 第三页 -> 脚本 -多页面优点:给用户提供一个完美的视觉方向,重点是没有很多的菜,简洁明了的SEO管理。由于可以针对每页一个关键字优化应用程序 -多页面缺点:后端和移动客户端不能同时使用,前端和后端开发紧密结合。开发变得相当复杂。开发人员需要为客户端和服务器端使用框架。这导致应用程序开发时间更长。 # 区别: -组成:页面由一个外壳页面和多个页面组成, 多页面由多个完整页面组成 -css(资源公用):页面为共用,只需要外壳部分加载,多页面则不共用,每个页面独加载 -刷新方式:页面页面局部更改或刷新,多页面整页刷新 -url模式:页面 a.com/#/pageone 多页面 a.com/pageone.html -用户体验:页面页面切换快,用户体验良好,多页面加载缓慢,流畅度不够,用户体验较差 -转场动画:页面容易实现,多页面无法实现 -数据传递:页面容易,多页面需要依赖url传参,或cookie,localSrorage等 -搜索引擎优化:页面需要独方案,实现较为困难,不利于SEO搜索,可利用与SSR优化,多页面实现方法容易 -适用范围:页面高要求的体验度,追求页面的流畅,多页面追求高度支持搜索引擎的应用 -开发成本:页面较高,需要专业的框架,多页面较低,但页面重复代码较多 -维护成本:页面相对容易,双页面相对复杂
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值