深刻理解http请求的过程是前端性能优化的核心! css
注意: html
一、文件合并存在的问题。前端
二、资源的合并与压缩(html,css,js压缩和混乱,文件合并,开启gzip)。vue
png8/png24/png32之间的区别?
ios
不一样格式图片的特色和经常使用的业务场景?
web
对图片的优化有哪些?
canvas
HTMLParser解析器自上而下解析,生成DOM树。
外部资源link、script,浏览器会发起请求。
解析CSS生成CSS规则树,进而构建渲染树(计算element位置,布局layout)。
接着调用操做系统NativeGUI的API进行绘制。segmentfault
外部资源并发请求,一个域名下的并发请求数是有上限的。
因此通常将网站的静态资源托管在多个CDN下。跨域
css在head中能够阻塞页面渲染、css能够阻塞js执行,可是css不阻塞外部脚本的加载。promise
直接引入的js阻塞页面的渲染(asyn[异步下载、当即执行]、differ[并行下载、顺序执行]这两种方式加载js例外)
js不阻塞资源的加载(预资源加载器)
js顺序执行,阻塞后续js逻辑的执行(单线程)
懒加载:图片进入可视区域以后请求图片资源。
懒加载的实现:
1.JS判断图片是否进入可视区域。
2.当进入时,修改img
的src属性为实际图片地址。
预加载:图片等静态资源在使用以前提早请求。
预加载实现:
1.使用标签(<img src="xxx" style="display:none">)
2.使用Image
对象(new Image();)
3.使用XMLHTTPRequest
对象(资源跨域问题)
UI线程和js线程互斥。
css性能能让JavaScript变慢。
频繁触发重绘
与回流
,会致使UI频繁渲染,最终致使js变慢。
回流: 当render tree
中的一部分(或所有)由于元素的规模尺寸,布局,隐藏等改变而须要从新构建,
这就称为回流(reflow)。
获取如下属性时会引起回流
:
width,height
offsetTop/Left/Width/Height
scrollTop/Left/Width/Height
clientTop/Left/Width/Height
调用了getComputedStyle(), 或者 IE的 currentStyle
重绘: 当render tree
中的一些元素须要更新属性,而这些属性只是影响元素的外观,风格,而不会
影响布局的,好比background-color
,这就称为重绘。
Chrome中知足如下任意状况就会建立图层:
video、canvas都是一个独立的图层。
经常使用的会独立为一个图层的属性:
transform:translateZ(0);
will-change:transform;
怎么优化呢?
translate
(改变不会触发浏览器从新布局,可是元素仍会占据原始位置)替代top
(会触发从新布局)改变。opacity
(不会触发重绘)替代visibility
(会触发重绘)。class
,而后修改DOM的className
。display:none
,而后修改100次,再把它显示出来。)table
布局,一个小的改动会形成整个table
的从新布局。Cookie
由于HTTP请求无状态,因此须要cookie
去维护客户端状态。
cookie的生成方式:
document.cookie
能够读写cookie(客户端自身数据的存储)cookie存储的限制:
对于cookie的优化:
cookie中在相关域名下面--cdn的流量损耗
解决方法:__ cdn的域名和主站的域名要分开 __
对于cookie的读写操做:
// 写入 document.cookie = "username=hello"; // 读取 let cookie = document.cookie; /** * param [String] cookie * return [Object] object */ function getCookie(cookie){ if(!cookie){ return null; } let reg = /\s*([^;]+)\s*=\s*([^;]+)\s*/g; let obj = {}; cookie.replace(reg,($0,$1,$2) => { if($1&&$2){ obj[$1] = $2; } }); return obj; }
cookie存储数据能力被localstorage
替代。
httponly :不容许js读写。(防止盗用cookie)
对于LocalStorage的读写操做:
// 写入 localStorage.setItem('username','hello') undefined // 读取 localStorage.getItem('username') "hello"
对于 SessionStorage的读写操做:
// 写入 SessionStorage.setItem('username','hello') undefined // 读取 SessionStorage.getItem('username') "hello"
具体内容查看笔记:
ServiceWorker探索
ServiceWorker和cacheStorage缓存及离线开发
利用ServiceWorker进行多页面通讯:
// 主页面发送信息 navigator.serviceWorker.controller.postMessage(value); // 主页面监听消息 navigator.serviceWorker.addEventListener('message',event => { // console.log(event.data); }); // ServiceWorker接收信息(对其余页面消息分发) self.addEventListener('message',event => { let promise = self.clients.matchAll().then(clientList => { let senderID = event.source ? event.source : 'unknown'; clientList.forEach(client => { if(client.id === senderID){ return; } client.postMessage({ client: senderID, message: event.data }); }); }); event.waitUntil(promise); });
from memory cache
),expires
(到期时间http/1.0)和max-age
相比,max-age
具备更高的优先级。public
相关的缓存设备例如CDN,优先级高于max-age
,若是客户端访问到的是CDN服务器缓存中的数据切未更改则返回304状态码。(Cache-control:max-age=3600, s-maxage=31536000
,就算在max-age
时间内,也不直接加载本地文件,而是访问CDN缓存。缓存中的文件若是没有更改,则直接通知客户端304,加载本地文件。感受和no-cache
很像呀)Cache-Control:private, max-age=0, no-cache
),不是不缓存的意思,它实际上的机制是,仍然对资源使用缓存,但每一次在使用缓存以前必须(MUST)向服务器对缓存资源进行验证。Expires是http/1.0
中定义的浏览器缓存策略。(expires: Wed, 24 Jan 2018 12:19:34 GMT
)
可是last-modified是有缺点的。
不能
获取精确的修改时间 此缓存策略优先级高于Last-Modified/If-Modified-Since
vue执行过程:
下载vue.js ==> 执行vue.js代码 ==> 生成HTML页面
随着前端浏览器的性能的提高,大量的运算在前端执行。
使用vue框架出现了首屏性能、渲染问题。
优化方案?
vue
的runtime
中能够直接执行的js代码)prerender
的方式(将vue渲染完成的静态页面返回)