几种优化web页面加载速度的策略

摘要:
基于Ant的构建打包里js/css的合并、混淆和压缩可以通过concat,closure实现,而gzip则需要clientbrowser和webserver同时约定一些规定。etag;属于HTTP1.1的特性,具有比last-modified更高的优先级,表示有webserver根据resource的path,size,lastmodifieddate进行hash后生成的值,可以判断文件在前一次响应之后是否有被修改。Last-Modified:表示webserver告诉clientbrowser当前resource的最近修改时间。使用静态页面将内容变动频次低的页面做成静态页面,并缓存到webserver内存或者CDN上,常见的技术有freemarker;JSP页

剥离静态资源请求到CDN

一般在主域名下的HTTP请求里都会携带大量Cookie信息,最大4KB,每个域名下最多50条;但如果仅仅访问js/css/jpeg等静态资源文件的话是不需要Cookie信息,所以可以将整个站点的静态资源放到一个专门的域名下,以求减小网络开销,也就是Cookie free domain;

多域名存储资源

浏览器在对同一个域名下的并发请求资源数量是有上限的(IE为8个,chrome为4-6个),一个完整的html页面需要加载的资源一般已经超过100个,所以为了缩短加载速度可以将下载资源分布在多个域名下(也不能太多,DNS查询也需要耗时);这样不仅可以增加资源加载的并发数,还可以实现静态资源Cookie Free加载;

合并HTTP请求

加速网页加载不仅需要加快单个请求速度的同时,还需要减少总的请求个数,css spirites可以将多张图片合并成一张图片,这样只需要一次请求,不同css展示图片上不同的位置;通过使用smartspirites命令在打包的时候讲图片合并成一张图片;

压缩请求资源

将js/css进行concat, minify和compress,最终合并成一个大的js/css,然后使用gzip生成.gz格式的文件,只要在request里指定accept-encoding=gzip,deflate,则可以请求打包之后的.gz文件,极大降低http请求的个数和带宽的负载压力。基于Ant的构建打包里js/css的合并、混淆和压缩可以通过concat, closure实现,而gzip则需要client browser和web server同时约定一些规定。首先client browser发送的request要写明accept-encoding=gzip,deflate,表示可以接受gzip的文件编码;然后web server将js/css文件打包成跟源文件具有同样名字路径的gz后缀文件,并且在response里写明content-encoding=gzip,这样web server响应请求的时候就可以返回gz文件,web browser也可以正确对gz文件进行解析。

合理利用浏览器cache

浏览器会将网页资源cache到客户端本地,然后通过HTTP request header里的cache-control,expires等来控制cache的生命周期。

典型的HTTP request消息头

cache-control: no-cache
cookie: _xsrf=e6552b76-a418-4409-9ec5-967573ea1cda;
origin: https://zhuanlan.zhihu.com
pragma: no-cache
referer: https://zhuanlan.zhihu.com/c_120823325?utm_source=wechat_session&utm_medium=social&utm_oi=54126419378176
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36

典型的HTTP response消息头

access-control-allow-credentials: true
access-control-allow-origin: https://zhuanlan.zhihu.com
cache-control: private, no-store, max-age=0, no-cache, must-revalidate, post-check=0, pre-check=0
content-encoding: br
content-type: application/json
date: Mon, 09 Jul 2018 11:39:10 GMT
etag: W/"88c2b758dbbd144dc7a13a6134675430cc50ad7a"
expires: Fri, 02 Jan 2000 00:00:00 GMT
pragma: no-cache
server: ZWS
set-cookie: tgw_l7_route=ec452307db92a7f0fdb158e41da8e5d8; Expires=Mon, 09-Jul-2018 11:54:10 GMT; Path=/
status: 200

expires:web服务器响应的头字段,表示浏览器在某个时间点(绝对时间点,存在服务器时区不匹配问题)之前可以使用该资源的缓存;但expires字段是HTTP 1.0的定义,现在浏览器一般默认为HTTP 1.1,所以它的作用基本可以忽略。(另一个基本可以忽略的是pragma: no-cache,由于其属于html文件内容的meta信息,所以仅有某些浏览器支持)

cache-control:用于替换expires字段,所以优先级一般高于expires字段,cache-control的值解释如下,max-age用的是当前时间的相对值(Cache-Control: max-age=30000)。

几种优化web页面加载速度的策略第1张

etag;属于HTTP 1.1的特性,具有比last-modified更高的优先级,表示有web server根据resource的path,size, last modified date进行hash后生成的值,可以判断文件在前一次响应之后是否有被修改。etag可以解决last-modified的几个问题,last-modified只能精确到秒级别,如果恰好resource在1秒内更新了,则client browser不能根据last-modifed进行判断;如果文件仅仅是被touch,文件内容没有改变,last-modified却改变了。
If-None-Match:在client browser判断resource cache已经expire后,如果之前的response里有etag字段,则重新发出请求并带上该字段,web server收到请求后对比request里的etag和web server上resource最新生成的etag值,如果不相等,则响应整个resource并设置status code = 200,否则直接返回status code=304。
Last-Modified:表示web server告诉client browser当前resource的最近修改时间。
If-Modified-Since:在client browser判断resource cache已经expire后,如果之前的response里有Last-Modified字段的话,则重新发出请求并带上该字段,web server在收到请求后对比request里的Last-Modified和web server上resource的实际的修改时间,如果实际修改时间较新,则响应整个resource并设置status code=200,否则直接返回status code=304。

几种优化web页面加载速度的策略第2张

几种优化web页面加载速度的策略第3张

使用静态页面

将内容变动频次低的页面做成静态页面(相对于JSP等内容需要实时生成的动态页面),并缓存到web server内存或者CDN上,常见的技术有freemarker;JSP页面需要依赖app server提供的容器环境,而freemarker可以完全脱离app server(Jetty),简单的web server(Nginx)就可以满足访问需求。https://freemarker.apache.org/
直接使用freemarker合并ftl文件和data,并生成html文件,html文件可以直接放置到CDN或者web server上供用户访问。

1 classApp1 {
2     private static finalConfiguration freeMarkerConfig;
3     static{
4         freeMarkerConfig = newConfiguration(Configuration.VERSION_2_3_23);
5         try{
6             freeMarkerConfig.setDefaultEncoding("UTF-8");
7 freeMarkerConfig.setTemplateExceptionHandler(
8           TemplateExceptionHandler.RETHROW_HANDLER);
9 freeMarkerConfig.setTemplateLoader(
10           new ClassTemplateLoader(App1.class, "/template"));
11             //freeMarkerConfig.setDirectoryForTemplateLoading(dir);
12         } catch(Exception e) {}
13 }
14 public voidgenerateHtmlByTemplate(String ftlFileName, 
15         String htmlFileName, Map<String, Object>params) {
16         String dir = "";
17         Writer fileWriter = null;
18         try{
19             File file = new File(dir + File.separator +htmlFileName);
20             Template template =freeMarkerConfig.getTemplate(ftlFileName);
21             fileWriter = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
22 template.process(params, fileWriter);
23         } catch(Exception e) {
24         } finally{
25             if(Objects.nonNull(fileWriter)) {
26                 try{
27 fileWriter.flush();
28 fileWriter.close();
29                 } catch(Exception e) {}
30 }
31 }
32 }
33 }

免责声明:文章转载自《几种优化web页面加载速度的策略》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇VC add files to folder失效问题Kafka创建SSL证书下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Web常见的攻击技术

目录 一、针对Web的攻击技术 二、针对 Web 应用的攻击模式 2.1 主动攻击 2.2 被动攻击 三、具体的攻击技术 1、因输出值转义不完全引发的安全漏洞 1.1 跨站点脚本攻击(XSS) 1.2 SQL注入攻击 1.3 OS命令注入攻击 1.4 HTTP首部注入攻击 1.5 邮件首部注入攻击 1.6 目录遍历攻击 1.7 运程文件包含漏洞 2、因设置...

15个优秀的第三方 Web 技术集成 dodo

  在 Web 开发与设计中,事事亲历亲为并非好事,我们经常被告诫不要重复发明轮『子』(don't reinvent thewheel),大而全式的开发不仅是巨大的负担,而且带来更多安全隐患,你毕竟不是所有技术的行家,业界有很多优秀的第三方技术可以借用或者集成,我们必须承认,这些技术比我们自己所能设计的要好得多。本文介绍了15种可以集成到我们的 Web 站...

Web开发中的弹出对话框控件介绍

Web开发中,目前由于Jquery的大行其道,因此很多弹出对话框,都用到了Jquery技术,反而原始的弹出对话框的方式较为少用了。不过基于JQuery的方式实现对话框窗口弹出,也有很多控件可以利用,由于工作需要及业余兴趣所至,我比较了近10种的对话框控件,其中发现有一些做得很好的,除了功能强大,而且也支持多种皮肤样式,甚至有些对话框的居中都考虑到了,细节...

《图解HTTP》

图解HTTP web及网络基础 http1.0 http1.1 TCP/IP协议族 IP协议 作用:把各种数据包传送给对方 IP地址 指明节点被分配到的地址 MAC地址 网卡所属的固定地址 ARP协议依赖MAC地址进行通信 TCP协议 提供字节流服务:将大块数据分割为报文段进行传输 三次握手 SYN SYN/ACK ACK DNS服...

Web离线应用解决方案——ServiceWorker

什么是ServiceWorker   在介绍ServiceWorker之前,我们先来谈谈PWA。PWA (Progressive Web Apps) 是一种 Web App 新模型,并不是具体指某一种前沿的技术或者某一个单一的知识点,,这是一个渐进式的 Web App,是通过一系列新的 Web 特性,配合优秀的 UI 交互设计,逐步的增强 Web App...

Web开发(F12调试)

参考学习: 参考:Node.js v12.16.1 文档 参考:Node.js 教程 | 菜鸟教程 目录 1、Node.js介绍及作用 1.1 Node.js介绍 1.2 Node.js作用 2、第一个Node.js程序 1)新建一个文件nodetest.js 2)通过node命令执行 3)Node.js全局变量 3、NPM介绍(...