需要做一个选择,是Web app还是Native app,当然,还有第三种,Hybrid app。

现在手机用户越来越多,电脑终端浏览器也在不断的更新换代,推陈出新,网页已经不仅仅是用来分享信息这么简单,可以用来做更多的事情。

本地存储升级

在以前,浏览器几乎不具备太多的存储能力。HTML5在存储方面做了重大的改进,提供了localStorage和sessionStorage对象用于小型数据的存储,更提供了WebDatabase以存储大量数据。

cookie与cookie的局限

Http本身是一种无状态无链接的协议,用户在浏览器上请求一个动作时,服务器不会知道用户上一个动作做了什么,因此,如果要存储诸如登录与否、已登录文本等状态信息是非常麻烦的。cookie的发明则满足了大部分的状态存储的需求。从根本上讲,cookie就是一段存储在客户端(浏览器)的文本,我们既可以在服务器响应返回时设置cookie,也可以在前端通过javascript进行修改。cookie有域限制,不同域的cookie相互不影响,也不能互相访问。

可以在谷歌浏览器的控制台输入document.cookie来查看当前网页所有可用的cookie,也可以通过这样的方式document.cookie="uid=123"来设置cookie,这条语句不会覆盖之前的cookie,只是自动添加到原先cookie的后面,不同的键值对用";"分隔。除了域的限制以外,还有一个大小和数量的限制对于我们数据存储来说,影响很大。不同的浏览器采用了不同的限制策略,但都不会很多。

来自HTML5的Web Storage

相比较于cookie而言,HTML5规范中的WebStorage更适合用作本地数据存储。Web Storage的使用非常方便,速度更快也更安全,只会存储在浏览器中而不会随HTTP请求发送到服务器端。它可以轻松存储大量数据而丝毫不会影响你网站的性能。

Web Storage使用

浏览器内置了两个已经实例化好了的对象,一个是sessionStorage,另一个是localStorage。

其中sessionStorage中存储的数据只是在单页面会话期间有效,sessionStorage更类似于一个页面上的全局变量。而localStorage的数据则会被持久化到客户端,而且永远不会过期(cookie可以设置过期时间),并且其容量也不会像cookie那样受限。

无论是sessionStorage还是localStorage,都可以使用下述这些方法或属性:

setItem(key,value)    getItem(key)    removeItem(key)    length    key(n)    clear()

这两者的区别是存储数据的生命周期不一样,只要一直在这个域内连续访问,存储在sessionStorage的数据会一直存在,一旦关闭页面或浏览器,所有sessionStorage存储的数据都会消失(也就是说,sessionStorage不会将数据存入磁盘)。

storage事件

对Storage对象进行的所有修改都会触发文档上的storage事件。其中事件对象会有以下属性:

domain        key     oldValue    newValue

例如:

document.addEventListener("storage", function(e) {console.log("Storage changed. Name '" + e.Key +"'"); });

由于这个事件有兼容性问题,一般不建议使用。

当然,并不是说localStorage大小可以无限使用,对于不同的浏览器,有不一样的设定,但大体上会给每个域设有5MB的存储空间,这对于大多数应用来说,已经足够了。

缓存和应用缓存

HTML5提供了一种独特的缓存机制:Application Cache(应用缓存)

顾名思义,这是为应用程序而生的缓存机制。主要是可以将服务器端的资源文件缓存至本地,至少有以下三个有点:

加速应用启动速度---省却了下载文件的时间

离线访问--利用离线缓存下来的页面和文件资源继续未完成的工作

节省服务器资源--更少的请求,意味着更小的服务器压力。

应用缓存的基本使用

一般而言,针对单页应用启用。

manifest

在文档中开启应用缓存非常简单,只需要在HTML标签中添加一个manifest属性,并指定manifest文件即可。

<!DOCTYPE html>

<html manifest="/appcache.manifest">

//这个html文件本身一定会被缓存

</html>

而appcache.manifest其实就是一个文本文件,里面指定了需要浏览器缓存的资源,比如像下面这个样子:

CACHE MANIFEST

index.html

stylesheet.css

images/logo.png

scripts/main.js

浏览器首次加载页面时会读取该文件,并下载和缓存它指定的资源,上面例子中缓存了四个文件,由于缓存是一次性的,因此如果四个文件有任何一个文件不可用,整个缓存行为将失败。除了文件中指定的四个需要缓存的文件以外,指定manifest文件的html文档也会被缓存下来。

要注意服务器在返回此文件时必须设置MIME类型为text/cache-manifest,不同服务器指定MIME类型的方式不同,基于NodeJS的Web服务器Express中设置MIME的方式如下:

res.type('text/cache-manifest')

res.sendfile(appcache.manifest文件路径)

manifest文件还可以指定一些特别的缓存行为,下面是一个完整格式的示例

CACHE MNIFEST

#指定会被缓存的资源

/favicon.ico

images/logo.png

stylesheetes/style.css

javascripts/app.js

#必须在有网络时访问的资源

NETWORK:

/api

http://api.weibo.com

#降级访问

FALLBACK:

#根目录如果不可用,则读取offline.html文件

/    /offline.html

#所有images/目录下的文件不可用时被请求,则读取images/offline.jpg

images/    images/offline.png

任何一个manifest文件都可以包含CACHE NETWORK 和FALLBACK三个不同的部分,它们分别表示如下:

CACHE:一定会被缓存的资源,浏览器首次加载页面时便下载其后的所有文件。

NETWORK:这些文件属于白名单资源,无论是否处于离线状态,这些资源的访问都会绕过缓存,资源的URL可以使用通配符。

FALLBACK:对于不可访问资源使用后备资源进行访问,两种资源以空格隔开,第一部分表示资源可用时的路径,第二部分表示后备资源缓存路径。资源的URL可以使用通配符。

以上三个部分可以按照任意顺序和数量进行组合。

缓存更新

著名程序员Phil Karlton曾说过:"在计算机科学领域,有两大难题,如何让缓存失效(cache invalidation)和如何给各种东西命名"

有三种方式进行缓存失效:

修改manifest文件:修改被缓存的文件本身并不会自动更新缓存,但是更改manifest文件本身则会重新下载整个缓存列表。

通过API接口以编程方式进行缓存控制。

用户主动在浏览器中清除缓存数据—对于开发者来说意义不大,最多是在调试的时候根据需要清除缓存来测试程序

由于manifest文件支持注释,而注释的更改也可以使manifest文件变化从而导致更新缓存,我们可以利用这一特点来实现自动更新缓存。使用程序生成一串随机值创建一行注释写入到manifest文件中,这个随机值可以是版本号、文本哈希值和时间戳等。

下面给出的是一个基于NodeJS的简单的版本生成器:

var fs = require('fs'),

mfPath = './public/appcache.manifest',

mfOutputPath = './public/output.manifest'

function gernerateVersionHash() {

//使用当前时间生成一段随机版本号

return (+new Date()).toString(32)

}

fs.readFile(mfPath, function(err, data) {

if(err) throw err;

var output = '# version=' + generateVersionHash() + '\n' + data;

fs.writeFile(mfOutputPath, output, function(err) {

if(err) throw err;

console.log('生成文件成功!路径:' + mfOutputPath)

}); })

配置好路径后,每次在更新了应用程序时,只需要运行这个脚本即可更新缓存。当然也可以监视你要保存的资源文件是否被修改来自动生成新版本的manifest文件以实现更新缓存。

编程接口

更新缓存更好的方式是通过javascript访问离线缓存接口。window.applicationCache对象定义了应用缓存的编程接口。比如我们要更新缓存,可以调用applicationCache.update()方法时,浏览器将先重新获取manifest文件,如果manifest文件有变化,那么就尝试更新用户的缓存。不过此时只是将需要缓存的文件下载下来,当下载完毕,调用applicationCache.swapCache()即可,applicationCache.status属性查询缓存的当前状态。

Application cache的使用不算困难,但是在使用时一定要注意下面这两个问题:

访问页面时,查询参数将会不起作用。如访问index.html?page=1这个url,第一次加载时后端服务器可以取到page=1这个参数,可是当index.html被缓存后,无论如何调正查询参数都是不会向服务器发起请求的,需要注意这一点,如果需要在url中传递参数,可以使用hash,并用javascript处理hash内容。

manifest本身也有可能被缓存,设置过期header是个解决办法。

以上内容来自《HTML5 移动Web开发实战详解》 林珑编著。

从Wep page到Application的更多相关文章

  1. SpringBoot Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.

    使用SpringBoot写HelloWorld,当配置好启动类后,再创建新的controller或其它类,启动项目后访问对应的映射名,页面显示: Whitelabel Error Page This ...

  2. 新建SpringBoot项目运行页面报错Whitelabel Error Page This application has no explicit mapping for /error, so yo

    新建SpringBoot项目运行页面报错Whitelabel Error Page This application has no explicit mapping for /error, so yo ...

  3. 启动Springboot 报错 Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Sat Jan 12 15:50:25 CST 2019 There was an unexpected error (type=Not

    解决方案:http://www.cnblogs.com/michaelShao/p/6675186.html

  4. 《Springboot极简教程》问题解决:Springboot启动报错 Whitelabel Error Page: This application has no explicit mapping for(转)

    13.2 Spring Boot启动报错:Whitelabel Error Page 13.2 Spring Boot启动报错:Whitelabel Error Page 问题描述 Whitelabe ...

  5. Single Page Application

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

  6. 关于Springboot启动报错 Whitelabel Error Page: This application has no explicit mapping

    Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as ...

  7. Custom ASP.NET Application into SharePoint --整合ASP.NET应用程序到SharePoint

    转:http://www.devexpertise.com/2009/02/18/integrating-a-custom-aspnet-application-into-sharepoint-par ...

  8. ServletContext与application的关系

    ServletContext 就是application 生命周期是从servletContext创建到服务器关闭 其实servletContext和application 是一样的,就相当于一个类创 ...

  9. How to create PDF files in a Python/Django application using ReportLab

    https://assist-software.net/blog/how-create-pdf-files-python-django-application-using-reportlab CONT ...

随机推荐

  1. knockout.js的简介和简单使用

    1.knockout简介knockout是一个轻量级的UI类库,通过MVVM模式使JavaScript前端UI简单化knockout有四大重要概念:1)声明式绑定:使用简明移读的语法很容易地将模型(m ...

  2. 开源的javascript实现页面打印功能,兼容所有的浏览器(情况属实)

    这篇文章完全是属于技术文章,也是记录一下自己在项目当中遇到的坑爹问题啊,因为是B/S的程序,所以打印功能还是必须要有的,对于打印我选择了一个js插件,发现非常的简单和方便,所以这里拿出来和大家分享一下 ...

  3. 论httpclient上传带参数【commons-httpclient和apache httpclient区别】

    需要做一个httpclient上传,然后啪啪啪网上找资料 1.首先以前系统中用到的了commons-httpclient上传,找了资料后一顿乱改,然后测试 PostMethod filePost = ...

  4. Windows下 C++ 实现匿名管道的读写操作

    由于刚弄C++没多久,部分还不熟练,最近又由于开发需求要求实现与其他程序进行通信,瞬间就感觉想到了匿名通信.于是自己查阅了一下资料,实现了一个可读可写的匿名管道: 源代码大部分都有注释: Pipe.h ...

  5. JavaSE——TCP网络编程(二)

    ServerSocket 类与Socket 类的不同用法: ServerSocket类: 创建一个ServerSocket类,同时在运行该语句的计算机的指定端口处建立一个监听服务,如:    Serv ...

  6. vim编辑器,管道,输入输出重定向

    1.vim的认识及其一些常用指令 a, 认识vim的命令行模式和插入模式: 当vim运行后默认进入该模式,他可以控制屏幕光标的移动,字符.字或行的删除,移动复制某区段及进入Insert mode下,或 ...

  7. spring中常用工具类介绍

    http://www.cnblogs.com/langtianya/p/3875103.html 文件资源操作     Spring 定义了一个 org.springframework.core.io ...

  8. RHEL7进程管理

    进程概念 名称 说明 程序 一组指令的集合 进程 程序的执行就是进程也可以把进程看成一个独立的程序在内存中有其对应的代码空间和数据空间,一个进程所拥有的数据和代码只属于自己进程是资源分配的基本单位,也 ...

  9. web api 限制单个IP在一定时间内访问次数

    ps:下面实例是每隔30秒访问次数不超过3次 1.Filter: using Infrastructure.Log; using Infrastructure.Web; using Lemon.Sta ...

  10. Atitit.json xml 序列化循环引用解决方案json

    Atitit.json xml 序列化循环引用解决方案json 1. 循环引用1 2. 序列化循环引用解决方法1 2.1. 自定义序列化器1 2.2. 排除策略1 2.3. 设置序列化层次,一般3级别 ...