从网络请求过程分析性能优化

缓存

  • dns缓存:输入url进行请求,首先进行DNS解析,读取缓存
  • cdn缓存和转发:通过cdn服务器缓存可以提供更快更稳定的服务
  • 设置浏览器缓存,有内存的缓存像是黑盒,我们平时使用的请求头control-cache,是控制的磁盘,进行强缓存,协商缓存。

请求合并和资源压缩

  • 资源压缩:图片,代码的压缩,webpack的loader转化和mini-css-exact-plugin和guifyjs压缩
  • 资源合并:如webpack打包将所有资源打包进js里,只引用一个资源
  • 请求头的压缩:通过服务端和客户端维护动态+静态的哈夫曼编码的字典
  • 请求头的字段:如cdn请求图片资源不需要进行用户信息的验证,不用cookie字段

资源合并和压缩的分析


  • html压缩:注释等辅助开发的换行符
    在线网站压缩,nodejs提供了html-minifier工具(构建时压缩或在服务端进行压缩:配置是否压缩js,css,注释),后端模板引擎渲染压缩
  • css压缩:无效代码删除,CSS语义合并
    在线网站压缩,html-minifier工具压缩css,clean-css压缩
  • js压缩与混乱:无效字符删除,注释,代码缩减和优化,代码保护
    在线网站压缩,html-minifier工具压缩js,uglifyjs2压缩

  • 文件合并:网络延迟,丢包问题影响后续请求,代理中断,浏览器并发请求数量限制
    合并后的问题:渲染延迟,缓存失效
    解决:公共库与业务代码分离打包,不同页面单独打包
    方法:在线网站合并;nodejs实现文件合并(webpack的entry和output自动合并)
  • 图片优化
    压缩种类: jpg不需要透明图的场景,png需要透明图的场景 webp安卓全部支持 优于前两者,svg简单的图片样式场景
    压缩方式:css雪碧图;将图片内嵌到HTML中image inline(小于64kb);使用矢量图svg绘制icon

  • css&js加载和执行
    css放在head中会保证页面渲染出来是有样式的,所以会阻塞页面的渲染,阻塞js的执行,但是不会阻塞js的加载
    js顺序执行,不会阻塞资源的加载,但是会阻塞页面的渲染,通过预加载的扫描来防止一个js文件的执行阻塞后续js文件的加载。
  • 懒加载:在资源到达可视区域才去进行加载,设置dataimg和lazyload等实现 类似淘宝宝贝的懒加载
    获取当前元素距离最上边的距离小于屏幕区域,需要设置预设高度
  • 预加载:在使用之前进行请求,使用时从缓存中加载,抽奖的图片,动画展示的预加载保证动画的进行。

回流和重绘

  • 浏览器对资源的获取和解析,DOMContentLoaded触发之前是白屏时间,现在浏览器会在html解析生成页面的片段,所以我们将css放在head,将js放在后面,前者是为了css尽快加载,而js放在后面是为了避免放在前面,阻塞HTML的加载而增加白屏时间
  • GUI渲染线程:生成html树+css树=render树,布局和绘制成位图
  • 主进程进行图层的合并和渲染
  • 回流是从布局到渲染:相关的操作:盒模型、定位和浮动、文字内结构的变化
  • 重绘是从绘制到渲染:只影响到元素的外观、风格、而不是影响布局
规避回流的手段

https://segmentfault.com/a/1190000014018604

  • 不去一条一条的修改dom的样式,预先定义好class然后修改className(多次到一次)
  • dom离线修改,新建一个dom进行修改最后进行替换
  • 不要把dom的属性值offsetHeight、offsetWidth放在循环里,浏览器为了避免频繁的回流,会有一个回流缓冲区,读取这些属性的时候为了取值的准确性,会去缓冲区读取而破坏缓冲区,而影响回流的过程
  • 对重绘的图层可以进行绝对和固定定位脱离文档流,同样最后进行一次所有图层的合并和渲染
  • 启动GPU硬件加速,启用后需要设置更高的z-index属性,这是为了避免其后的元素如果z-index值大于等于当前,且absolute或fixed相同,同样会生成复合图层
图层建立的触发条件
  • 3d变幻、透视的css属性 设置 transform: translateZ(0); will-change: transfrom;
  • 使用video节点进行视频播放
  • 拥有3D上下文或者加速的2D上下文的canvas节点
  • flash混合插件
  • 对opacity做css动画或者使用一个动画webkit变换的元素
  • 拥有加速css过滤器的元素
  • 元素有一个包含复合层的后代节点
  • z-index较低并有一个复合图层的兄弟节点

浏览器缓存

1、cookie 大小4kb,过期时间expire; 设置httponly不允许js读取我们的代码破解cookie;cookie在cdn等相关域名下都会被携带而浪费资源
2、localStorage 用于浏览器存储 大小5M,接口封装较好。
3、sessionStorage 用于会话级别的浏览器存储
4、IndexedDB 用于客户端存储大量结构化数据的低级API为应用创建离线版本
5、service worker 革命?用户创建线程打破之前只能在js线程中执行的状态

pwa 渐进式web app

1、可靠 弱网环境加载、无网络加载
2、快速 网页渲染和数据访问的优化
3、融入 可以加入到手机桌面和普通应用一样有全屏和推送等特性

service worker

可以独立于当前页面,后台运行并与页面通信;使用拦截和处理网络请求的能力实现离线应用。对网络请求进行拦截,在service worker中查找,对于未加载的资源会返回promise的reject结果,第二次才会读取缓存

  • 与主页面进行通信 postMessage和addEventListener('message')


    service storage

    缓存的获取
indexDB
var request = window.indexedDB.open('test')
var myDB = {
name: 'test',
version: 1,
db: null
}
request.onsuccess(e) {
    myDB.db = e.target.result
}
myDB.close()
window.indexDB.deleteDatabase(myDB)
// 可以创建indexDB的空间 设置索引 优于键值对的存储方式
var store = request.result.createObjectStore(''books",{keypath: 'isb'})
var titleIndex = store.createIndex('by_title', 'title')
store.put({title: 'quarry memories', isb: 123})
// 通过transition进行store的关联进行事务的操作

缓存

设置自动缓存进行性能优化
cache-controll :max-age; s-maxage(public的时间优先级高于max-age);public(代理商比如cdn);private(用户);no-store;no-cache
协商缓存:Etag对应if-None-Match;last-Modified对应if-Modified-Since

服务端渲染

由于vue代码需要读取框架代码才能渲染,为了解决首屏问题,引入服务端渲染,置出首屏代码扔到服务端来渲染出首屏。
注意几个问题:

  • 服务端渲染vue代码是没有mounted周期的
  • 服务端的置出的代码需要跟客户端的代码进行混入,同样也可以在客户端进行代码管理,动态数据流需要被获取对应关系 以便客户端对服务端进行管理
  • ssr所做的是将css样式和dom结构append到HTML的模板上,js文件可以在客户端后续进行引入执行
  • 平衡客户端和服务端的性能,一般用于解决首屏问题,当然不能太多影响服务端性能
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 相关概念 阻塞渲染 JS下载、执行时肯定会阻塞渲染例如下图中代码,对于浏览器,接收到html文档后,解析到a.js...
    LouisJ阅读 1,061评论 0 32
  • 解析URL 输入URL后,会进行解析(URL的本质就是统一资源定位符) URL一般包括几大部分: protocol...
    小超人的前端之路阅读 754评论 0 1
  • 围绕前端的性能多如牛毛,涉及到方方面面,以我我们将围绕PC浏览器和移动端浏览器的优化策略进行罗列注意,是罗列不是展...
    流动码文阅读 676评论 0 0
  • 一、PC端优化策略 主要包括网络加载类、页面渲染类、CSS优化类、JavaScript执行类、缓存类、图片类、架构...
    puxiaotaoc阅读 23,446评论 6 56
  • 《石榴花》 不争春光恋夏风, 绿枝挺透点点红; ...
    飘逸的云5812阅读 566评论 4 13