前端是庞大的,包括
HTML
、CSS
、Javascript
、Image
、Flash
等等各类各样的资源。javascript前端优化是复杂的,针对方方面面的资源都有不一样的方式。那么,前端优化的目的是什么 ?css
- 从用户角度而言,优化可以让页面加载得更快、对用户的操做响应得更及时,可以给用户提供更为友好的体验。
- 从服务商角度而言,优化可以减小页面请求数、或者减少请求所占带宽,可以节省可观的资源。
如上图所示,文件不合并存在的问题:html
keep-alive
通过代理服务器时可能会被断开 ,不必定能完成状态的保持。可是进行文件合并也是存在的问题:前端
首屏渲染问题
: 在进行js文件合并后,文件明显变大、请求时间变长。当html网页进行渲染时,若该渲染须要依赖这个js的话,那页面渲染会等到js文件请求以后回来才会继续进行,致使首屏渲染时间延迟。缓存失效问题
:若如今有a、b、c三个文件合并,只要任意改变其中一个文件都会致使这个合并文件缓存失效,因此文件合并容易致使大面积缓存失效。对于文件合并有如下三个建议:vue
如何进行文件合并:java
webpack
、gulp
、fis3
等)HTML压缩 HTML代码压缩就是压缩一些在文本文件中有意义,可是在HTML中不显示的字符,包括空格
,制表符
,换行符
等,还有一些其余意义的字符,如HTML注释
也能够被压缩。 node
CSS压缩 CSS代码压缩就是对一些无效代码删除
和CSS语义合并
。对于咱们来讲无效代码多是注释,也多是无效字符。 android
JS压缩与混乱 JS代码压缩就是对一些无效字符的删除
、剔除注释
、代码语义的缩减和优化
(如变量名缩短等)和代码保护
。(代码进行压缩与混乱防止代码逻辑被轻易窥探)webpack
如何进行HTML、CSS、JS压缩ios
使用在线网站进行压缩。
不一样格式图片经常使用的业务场景:
jpg
有损压缩,压缩率高,不支持透明 —— 大部分不须要透明图片的业务场景png
支持透明,浏览器兼容好 (可降阶压缩:png3二、png2四、png8) —— 大部分须要透明图片的业务场景webp
压缩程度更好,在ios webview有兼容性问题 ,在android中支持比较好 —— 安卓开发svg
矢量图,代码内嵌,相对较小 —— 图片样式相对简单的业务场景(小的icon、logo等)gif
支持透明、体积小、成像相对清晰(静态GIF和动画GIF) —— 与其余4种图片的使用场景基本不冲突压缩后的大小:png > jpg > webp
一个好用的图片优化平台
DOMContentLoaded
事件触发以前完成,保证能拿到dom元素),顺序执行。(异步)onload
事件触发前执行,不保证执行顺序,脚本一旦加载完毕就会马上执行。(异步)DOMContentloaded与onload的区别
scroll
事件的回调,去判断咱们的懒加载图片是否进入可视区域。getBoundingClientRect
用于获取某个元素相对于视窗的位置集合,若图片top
小于视窗的高度,说明进入可视区域。lazyload.js
。<!doctype html>
<html>
<head>
<title>懒加载</title>
</head>
<body>
<div class="image-list">
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.1.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.2.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.3.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.4.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.5.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.6.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.7.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.8.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.9.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.10.jpg" />
</div>
<script>
var viewHeight = document.documentElement.clientHeight; //获取可视区域的高度
function lazyload () {
var eles = document.querySelectorAll('img[data-original][lazyload]'); //获取须要懒加载的元素
Array.prototype.forEach.call(eles, function (item, index) {
var rect;
if (item.dataset.original === '') return;
rect = item.getBoundingClientRect(); //获取元素的大小及其相对于视口的位置集合,集合中有top, right, bottom, left等属性。
if (rect.bottom >= 0 && rect.top < viewHeight) { //判断元素是否进入可视区域
!function () { //当即执行匿名函数,加载图片
var img = new Image();
img.src = item.dataset.original;
img.onload = function () {
item.src = img.src;
}
item.removeAttribute('data-original');
item.removeAttribute('lazyload');
}()
}
})
}
lazyload(); //初始化懒加载方法
document.addEventListener('scroll', lazyload); //添加页面滚动监听器
</script>
</body>
</html>
复制代码
lazyload
库。Image对象
,var image = new Image();image.src = "http://...";XMLHttpRequest
对象,更好去控制预加载的过程,存在跨域问题。reflow
)。当页面布局和几何属性改变时就须要回流。repaint
)。回流必将引发重绘,而重绘不必定会引发回流。
一、获取DOM后分隔为多个图层
二、对每一个图层的节点计算样式结果(recalculate style)
三、为每一个节点生成图形和位置(layout、reflow和重布局)
四、将每一个节点绘制填充到图层位图汇总(paint,repaint)
五、图层做为纹理加载到GPU
六、合并多个图层到页面上,生成最终图像(composite layers)
复制代码
一、3D或透视变换(perspective、transform)CSS属性
二、使用加速视频解码的<video>节点
三、拥有3D(WebGL)上下文或加速的2D上下文的<canvas>节点
四、混合插件(如Flash)
五、对本身的opacity作CSS动画或使用一个动画webkit变换的元素
六、拥有加速CSS过滤器的元素
七、元素有一个包含复合层的后代节点(一个元素拥有一个子元素,该子元素在本身的层里)
八、元素有一个z-index较低且包含一个复合层的兄弟元素(换句话说就是该元素在复合层上面渲染)
复制代码
一、用translate(重绘)替代top(回流)改变
二、用opacity替代visibility(重绘)
三、不要一条一条地修改 DOM 的样式,预先定义好 class,而后修改 DOM 的className
四、把 DOM 离线后修改,好比:先把 DOM 给 display:none (有一次回流),而后你修改100次,而后再把它显示出来
五、不要把获取DOM元素的真实位置代码放在一个循环里使用,不然会对相关缓冲区进行刷新,最好存到循环外的变量中再去使用
六、不要使用table布局,可能很小的一个小改动会形成整个 table 的从新布局(回流)
七、动画实现的速度的选择,动画速度快(重绘和回流)的话可能致使页面性能降低
八、对于动画新建图层(例:添加transform CSS属性)
九、添加 CSS3 样式启用 GPU 硬件加速(例:transform: translateZ(0)或transform: translate3d(0, 0, 0))
十、减小对DOM的操做,对DOM操做的代价是高昂的
十一、避免使用出发重绘、回流的CSS属性
十二、将重绘、回流的影响范围限制在单独的图层以内,可是图层的合成过程比较消耗运算量,图层不能过多
复制代码
cookie
去维持客户端状态。expire
。http response header
中的set-cookie(服务端生成),用于浏览器端和服务器端的交互。document.cookie
能够读写cookie(客户端生成),客户端自身数据的存储。localstorage
替代)cdn
上静态文件的流量损耗(将cdn域名和主域名独立开)。httponly
,不容许js进行读写,防止攻击。可靠
:在没有网络的环境中也能提供基本的页面访问,而不会出现“未链接到互联网”的页面。快速
:针对网页渲染及网络数据访问有较好优化。融入
:应用能够被增长到手机桌面,而且和普通应用同样有全屏、推送等特性。HTTPS
,Service Worker 的 API 比较 low-level)Lighthouse
,能够检测网站是否符合PWA、网站的可靠性、速度等性能优化指标[下载地址]。(https://lavas.baidu.com/doc-lavas/vue/more/downloads/lighthouse_2.1.0_0.zip)
geofencing
(地理围栏定位),但它将推出的第一个首要特性,就是拦截和处理网络请求的能力,包括以编程方式来管理被缓存的响应。Service Worker只能用于https站点中,非https站点不具有Service Worker能力。
生命周期
运用
chrome://inspect/#service-workers
)。chrome://serviceworker-internals
)。浏览器缓存就是把一个已经请求过的Web资源(如html页面
,图片
,js
,数据
等)拷贝一份副本储存在浏览器中。缓存会根据进来的请求保存输出内容的副本。当下一个请求来到的时候,若是是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求,仍是向源服务器再次发送请求。比较常见的就是浏览器会缓存访问过网站的网页,当再次访问这个URL地址的时候,若是网页没有更新,就不会再次下载网页,而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新,浏览器才会再次下载网页。
HTTP1.0
的东西,如今默认浏览器均默认使用HTTP1.1
,因此它的做用基本忽略。Cache-Control: max-age=秒
替代。public
、private
、no-cache
、no-store
、no-transform
、must-revalidate
、proxy-revalidate
、max-age
、s-maxage
一、no-cache:不要读取缓存中的文件,要求向WEB服务器从新请求
二、no-store:请求和响应都禁止被缓存
三、max-age:表示当访问此网页后的max-age秒内再次访问不会去服务器请求,其功能与Expires相似,只是 Expires是根据某个特定日期值作比较。一但缓存者自身的时间不许确.则结果可能就是错误的,而max-age, 显然无此问题.。Max-age的优先级也是高于Expires的
四、max-stale:容许读取过时时间必须小于max-stale 值的缓存对象
五、min-fresh:接受其max-age生命期大于其当前时间 跟 min-fresh 值之和的缓存对象
六、only-if-cached:告知缓存者,我但愿内容来自缓存,我并不关心被缓存响应,是不是新鲜的
七、no-transform:告知代理,不要更改媒体类型,好比jpg,被你改为png
一、public: 数据内容皆被储存起来,就连有密码保护的网页也储存,安全性很低
二、private:数据内容只能被储存到私有的cache,仅对某个用户有效,不能共享
三、no-cache:能够缓存,可是只有在跟WEB服务器验证了其有效后,才能返回给客户端
四、no-store:请求和响应都禁止被缓存
五、max-age:本响应包含的对象的过时时间
六、must-revalidate:若是缓存过时了,会再次和原来的服务器肯定是否为最新数据,而不是和中间的proxy
七、s-maxage:与max-age的惟一区别是,s-maxage仅仅应用于共享缓存.而不该用于用户代理的本地缓存等针对单用户的缓存。另外,s-maxage的优先级要高于max-age
八、max-stale:容许读取过时时间必须小于max-stale 值的缓存对象
九、proxy-revalidate:与must-revalidate相似,区别在于proxy-revalidate要排除掉用户代理的缓存的。即其规则并不该用于用户代理的本地缓存上
十、no-transform:告知代理,不要更改媒体类型,好比jpg,被你改为png