【js】了解前端缓存,收获不止于此!

了解前端缓存,收获不止于此!

这次我们来讲一下关于前端缓存的问题。感谢赵欢同学提供doc素材。

首先,开局我画了一张图,你会对文章有一个大局了解。

今天讲的是前端缓存。

前端缓存有3大种:如图,分为HTTP缓存、浏览器缓存、应用程序缓存。

HTTP缓存

我们先来看HTTP缓存:(做下了解)

分为强缓存与协商缓存。

首先看强缓存:

强缓存之Expires:

  • 值为服务端返回的到期时间,即下一次请求时,请求时间小于服务端返回的到期时间,直接使用缓存数据;
  • 到期时间是由服务端生成的,客户端时间跟服务端时间可能存在误差,这就会导致缓存命中的误差;
  • 被Cache-Control替代;

强缓存之Cache-Control:


参数


说明


public


所有内容都将被缓存(客户端和代理服务器都可缓存)


private


内容只缓存到私有缓存中(仅客户端可以缓存,代理服务器不可缓存)


no-cache


必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。因此,如果存在合适的验证令牌 (ETag),no-cache 会发起往返通信来验证缓存的响应,如果资源未被更改,可以避免下载。


no-store


所有内容都不会被缓存到缓存或 Internet 临时文件中


must-revalidation/proxy-revalidation


如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证


max-age=xxx


缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高

来举个栗子:

图中Cache-Control仅指定了max-age,所以默认为private,缓存时间为31536000秒(365天)

也就是说,在365天内再次请求这条数据,都会直接获取缓存数据库中的。

协商缓存:(相当于就是浏览器与服务器通过一个值作为更新flag,一个协商一个判断)

协商缓存之Etag/If-None-Match:

  1. 当浏览器请求服务器的某项资源(A)时,服务器会根据A算出一个哈希值,并通过Etag返回给浏览器,浏览器把ETAG和资源A同时缓存到本地。
  2. 当下次向服务器请求该资源时,会通过If-None-Match把ETAG发送给服务器。
  3. 服务器再次计算A的哈希值并和浏览器的返回值作比较,如果A发生了变化就把A返回给浏览器(返回值200),如果未发生变化就返回浏览器304(未修改)

协商缓存之Last-Modified/If-Modified-Since:

  1. 在浏览器请求服务器的某项资源时,返回资源的同时还有一个Last-Modified的属性标记此文件在服务器端的最后修改时间;
  2. 浏览器第二次访问该资源时,会向服务器传送 If-Modified-Since报头,询问该时间之后文件是否被修改过;
  3. 如果服务器的资源没有变化,则时间一致,返回304的状态吗,浏览器使用本地缓存;
  4. 如果时间不一致,返回200,显示新文件并缓存。

那么Etag和Last-Modified,他们之间有什么区别呢???

  • Etag是标识传输,Last-Modified是时间传输;
  • Etag的优先级高于Last-Modified;
  • Last-modified标注的最后修改时间只能精确到秒,如果文件在1秒以内被多次修改,它不能准确标注文件的最后修改时间;
  • 如果文件定期生成,但内容没有任何变化,但是last-modified却改变了,导致没法使用缓存;
  • 有可能存在服务器没有准确获取文件修改时间,或与代理服务器时间不一致的情况;
  • etag每次服务端生成都需要进行读写操作,而last-modified只需要读取操作,etag消耗更大些;

各有优劣!

那强缓存与协商缓存,他们的规则分别是什么?

强缓存规则:

  • 已失效时,请求服务器,服务器返回数据和缓存规则,客户端将数据和缓存规则存入缓存数据库;
  • 未失效时,请求缓存数据库,返回数据并渲染;

协商缓存规则:

  • 先到缓存数据库中获取标识Etag/Last-Modified,
  • 再通过If-None-Match/If-Modified-Since字段带上缓存标识请求服务器,服务器判断内容是否失效;

这两种缓存的执行流程是怎么样的?

  • 强缓存未失效,从缓存中读取数据,cache-control优先级高于Expires;
  • 强缓存已失效,执行协商缓存,Etag的优先级高于last-Modified;
  • 缓存未失效从缓存中读取数据返回304状态码;
  • 缓存已失效返回资源和200状态码;

怎么清除缓存?

浏览器默认会缓存图片,css和js等静态资源,所以开发环境下经常会因为强缓存导致资源没有及时更新而看不到最新的效果,需要清除缓存可以使用一下几种方法:

  1. 直接ctrl+f5,这个办法能解决页面直接引用的资源更新的问题;
  2. 使用ctrl+shift+delete清除缓存;
  3. 如果用的是chrome,可以F12在network那里把缓存给禁掉,选中“disable Cache”:
  4. 或者给资源文件加一个时间戳;
  5. 或者禁止修改html中的缓存字段为禁止使用;
  6. 或者在谷歌浏览器刷新按钮上,点击右键,选择“清空缓存并硬性重新加载”;
浏览器缓存

然后是浏览器缓存:(这个前端很多时候会用到)

有本地小容量存储与本地大容量存储

小容量的Cookie:

一般用于以下场景:

  1. 记住用户名密码
  2. 欢迎语

小容量的LocalStorage:

记录后只要不手动清除就会一直存在。

小容量的SessionStorage:

仅在本次会话时有效。关闭当然窗口后就没有了。

Storage的API如下:(localStorage为例,sessionStorage一样)

保存数据:(3种写法均可)

写法1:

localStorage.setItem("key",value)

写法2:

localStorage["key"]=1

写法3:

localStorage.key=1

读取数据:(相对也有3种)

写法1:

var value=localStorage.getItem("key")

写法2:

var value=localStorage["key"]

写法3:

var value=localStorage.key

删除单个数据:

localStorage.removeItem(key);

删除所有数据:

localStorage.clear();

得到某个索引的key:

localStorage.key(index);

比较一下Cookie、LocalStorage、sessionStorage的异同:

  • cookie会在在同源的http请求中携带,不能超过4K,参与和服务器交互;
  • sessionStorge和locaStorage保存数据在本地,限制最多5M,不参与和服务器交互;
  • sessionStorage仅在当前窗口关闭前有效;
  • localstorage会一直保存在浏览器中,除非手动删除;
  • cookie在设置过期时间之前一直有效,不设置过期时间窗口关闭则清除;
  • sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面,
  • localstorage和cookie在所有同源窗口中共享

本地大容量存储之WebSql

表保存数据,用sql操作数据库(写的是sql语句,懂mysql数据库的完全不在话下)

创建表:

create table if not exists product(id integer primary key autoincrement,name text not null,price double);

添加一条数据:

insert into product(name,price) values(‘斗战圣皇‘,‘1.2‘);

insert into product(name,price) values(‘布衣神探:最后的证据‘,‘0.9‘);

删除一条数据:

delete from product where id=2;

更新一条数据:

update product set name=‘斗战圣皇第二部‘,price=‘0.99‘ where id=1;

查询表格:

select * from product;

删除表格:

drop table IF EXISTS product;

本地大容量存储之IndexDB

保存的是对象类型的数据

  • open()打开或创建数据库
  • deleteDatabase()删除数据库;
  • transaction()打开事物
  • add()添加数据
  • get()查找数据
  • delete()根据ID删除数据
  • clear()清除全部数据

应用程序缓存

分为应用缓存和PWA

什么是应用缓存?

页面基本结构:

  1. html标签上配置manifest文件,文件后缀.appcache;
  2. manifest 需要配置 MIME-type,即 "text/cache-manifest"。必须在 web 服务器上进行配置,不同服务器不一样;

    如tomcat 需要修改conf/web.xml配置文件,添加:

    <mime-mapping>

    <extension>manifest</extension>

    <mime-type>text/cache-manifest</mime-type>

    </mime-mapping>

  3. manifest文件的格式个配置,分三部分,缓存文件,不缓存文件,页面无法访问时的回退页面;

    CACHE MANIFEST

    /theme.html

    NETWORK:

    login.php

    FALLBACK:

    /html/ /offline.html

举个栗子:

有网络时:

什么是PWA?

先了解APP和web网页存在的一些不足:

APP应用存在的不足:

  • 开发成本高(IOS和安卓)
  • 软件上线需要审核
  • 版本更新需要上传到应用商店
  • 想使用APP必须下载

web网页存在的不足:

  • 手机桌面入口不够便捷,需要记住URL或加入书签
  • 不能像APP一样推送消息

PWA弥补了APP和web网页存在的一些缺点:

  • 是一个web网页应用
  • 可以添加至主屏幕,点击主屏幕的图标可以实现启用动画以及隐藏地址栏
  • 实现了离线缓存功能,即使手机没有网络,依然可以实现一些离线功能
  • 实现了消息推送

一个简单的PWA栗子:

原文地址:https://www.cnblogs.com/wuhairui/p/10750589.html

时间: 2024-08-03 11:20:04

【js】了解前端缓存,收获不止于此!的相关文章

使用JS实现前端缓存

在前端浏览器中,有些数据(比如数据字典中的数据),可以在第一次请求的时候全部拿过来保存在js对象中,以后需要的时候就不用每次都去请求服务器了.对于那些大量使用数据字典来填充下拉框的页面,这种方法可以极大地减少对服务器的访问.这种方法特别适用于使用iframe的框架. 具体实现思路和方法: 创建一个cache.js文件: 1.前端页面,定义那些数据需要一次性拿到前端缓存,定义一个对象来保存这些数据: /** * 定义需要在用户登录的时候获取到本地的数据字典类别 */ var clsCodes =

HTML编程之如何使用JS实现前端缓存

在前端浏览器中,有些数据(比如数据字典中的数据),可以在第一次请求的时候全部拿过来保存在js对象中,以后需要的时候就不用每次都去请求服务器了.对于那些大量使用数据字典来填充下拉框的页面,这种方法可以极大地减少对服务器的访问.因此这种方法特别适用于使用iframe的框架. 具体实现思路和方法如下: 创建一个cache.js文件: 1.前端页面,定义那些数据需要一次性拿到前端缓存,定义一个对象来保存这些数据: /** * 定义需要在用户登录的时候获取到本地的数据字典类别 */ var clsCode

JS高级前端开发群加群说明

JS高级前端开发群加群说明 一.文章背景: 二. 高级群: 三. 加入方式: 四. 说明: 一.文章背景: 去年年初建了几个群,在不经意间火了,一直排在“前端开发”关键字搜索结果第一名.当然取得这样的成绩或这样一个结果也是情理之中,一方面来说,提倡的各种交流沟通方法大部分是正确有效或被大家认可的,另外一方面说,这么多人聚在一起,跟大伙的参与分享是分不开的,尤其是各群的管理,是我们的灵魂精神的支柱.另外在国内行业前进的道路上,尽自己的绵薄之力帮助他人,引领氛围,进而影响行业,也是略感欣慰.有时候精

ahjesus 前端缓存原理 转载

LAMP缓存图 从图中我们可以看到网站缓存主要分为五部分 服务器缓存:主要是基于web反向代理的静态服务器nginx和squid,还有apache2的mod_proxy和mod_cache模 浏览器缓存:包括页面html缓存和图片js,css等资源的缓存 PHP缓存:有很多免费的PHP缓冲加速工具,如apc eaccerlertor等 内存缓存:主要是采用memcache这种分布式缓存机制 数据库缓存:通过配置数据库缓存,以及数据存储过程,连接池技术等 下面重点介绍浏览器缓存原理: 从上图:我们

使用Memcached、Spring AOP构建数据库前端缓存框架

数据库访问可能是很多网站的瓶颈.动不动就连接池耗尽.内存溢出等.前面已经讲到如果我们的网站是一个分布式的大型站点,那么使用 memcached实现数据库的前端缓存是个很不错的选择:但如果网站本身足够小只有一个服务器,甚至是vps的那种,不推荐使用memcached,使 用Hibernate或者Mybatis框架自带的缓存系统就行了. 一.开启memcached服务器端服务 如果已经安装了memcached服务器端程序,请确认服务器端服务已开启. 二.引入jar 1.  alisoft-xplat

使用 node.js 开发前端打包程序 ---转载

我们在做前端开发的时候经常会在部署上线的时候做程序的打包和合并,我们接下来就会对如何使用 node.js 开发前端打包程序做非常深入的讲解,希望能够帮到有需要的同学. 我们现在做前端开发更多的是多人共同协作开发,每个人负责不同的模块,便于开发和调试.这样就导致我们最后部署上线的时候需要把所有人开发的模块进行合并,生成单个或多个文件上线.如果手动合并的话肯定是费时又费力,而且非常容易出错,所以我们一般都是通过一些工具来实现自动合并的功能. 打包程序的原理非常简单,入口文件->寻找依赖关系->替换

【php】基于Redis的js、css缓存类

<?php /* *基于Redis的js.css缓存类(有效解决tp等框架访问public出现的各种问题) *Written by Radish 2015.8.16 */ define('REDIS_HOST', '127.0.0.1'); define('REDIS_PORT', 6379); // class im { function __construct() { $this->redis = new Redis(); $this->redis->connect(REDIS

关于更新发布CSS和JS文件的缓存问题

在Web应用程序大行天下的今天,我们程序员的工作大都基于B/S架构,B/S架构的优势就在于可以及时(甚至随时)更新页面以及后台逻辑,而不用通知客户去手动更新客户端.在这种环境下,是不是B/S架构的软件就真的没有升级的问题了呢? 现如今,浏览器大战下,各个浏览器也是拼了命的提高性能,升级JS解析引擎,更好的处理浏览器的页面缓存,让用户的浏览体验更快,占用更小的PC资源.那么,问题就出现在JS和CSS缓存,甚至页面缓存上.至于浏览器对页面的缓存,我们一般通过在服务端发送页面的时候设置页面的生存期,一

Memcached与Spring AOP构建数分布式据库前端缓存框架

由于上一篇有介绍了Memcached缓存,并集群部署,这边我们就不介绍,我们直接介绍Memcached与Spring AOP构建分布式数据库前端缓存框架 一.Java 实现Memcached客户端,实现分布式 (1)需要的jar 1)commons-pool-1.5.6.jar 2)java_memcached-release_2.6.3.jar 3)slf4j-api-1.6.1.jar 4)slf4j-simple-1.6.1.jar (2)Java 实现Memcached客户端代码如下: