关于web页面优化
简单汇总了一下web的优化方案(主要的前端优化策略)
- 减少http请求次数
- 文件合并(js、css、图片);ps:多个图片合并之后,总体积会变小
- 内联图片,即data:URL scheme,但容易导致html页面混乱
- 可缓存的ajax
- 尽量使用get而不是post,get仅发送一次TCP数据包,而post会发送两次
- 使用专用的静态服务器域名,这样在请求静态文件时,就不会传递cookie了,节省带宽
- 推迟加载内容
- 如动画等,可以等页面必备的逻辑执行完后再执行动画
- 预加载
- 空闲的时候,加载接下来可能用到的东西
- 无条件的预加载
测试代码index.html
onload中进行图片预加载
<!DOCTYPE html>
<html lang="en" ng-app="app">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
function parseDom(arg) {
let objE = document.createElement("div");
objE.innerHTML = arg;
return objE.childNodes[0];
};
window.addEventListener('load',function(){
let loader = document.getElementById('preload');
loader.append(parseDom('<img src="pic/IMG_20170914_115807.jpg"/>'));
})
</script>
<body>
<a href="2.html">去下一个页面</a>
<div id="preload" style="display: none;"></div>
</body>
</html>
2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<body>
<img src="pic/IMG_20170914_115807.jpg"/>
</body>
</html>
访问首页时,进行预加载jpg
访问2.html时,就不需要再次加载了,加快了响应速度
- 有条件的预加载:根据用户的操作预测接下来可能访问的东西,提前加载资源
- 减少dom的数量,检测数量 document.getElementsByTagName('*').length ,数量多造成reflow慢、元素定位慢
- 使用CDN
内容分发网络(Content Delivery Network,CDN)是由一系列分散到各个不同地理位置上的Web服务器组成的,它提高了网站内容的传输速度。用于向用户传输内容的服务器主要是根据和用户在网络上的靠近程度来指定的。例如,拥有最少网络跳数(network hops)和响应速度最快的服务器会被选定。
- 避免使用css expression,因为表达式需要实时更新,使计算次数非常频繁
- 使用外部js和css,因为浏览器可以对其进行缓存,多页面复用同一个文件的时候效果明显
- 对js和css文件进行压缩
- css放在顶端head标签内
- 把可以延迟执行的js放在底部,因为默认情况下script标签的下载和执行都是同步的,想要动态加载script,可以使用第三方的lab.js
- 网上还有说把js打包成png的,看了评论感觉实用性不是很大,压缩效率和gzip差不多,而且好像出现中文内容,就会打包失败,还要求支持canvas(IE8以上)
- 尽量少用全局变量,容易出现混乱而且不易于回收(除非你手动删除),容易造成内存泄漏
- 对于重复运行的代码,用setInterval而不是用setTimeout
- 语句数量最小化
/**不提倡**/
var i = 1;
var j = "hello";
var arr = [1,2,3];
var now = new Date();
/**提倡**/
var i = 1,
j = "hello",
arr = [1,2,3],
now = new Date(); /**不提倡**/
var name = values[i];
i++;
/**提倡**/
var name = values[i++];
- 过深的原型链也会导致效率低下
- 设置动画元素为absolute或fixed
position: static
或position: relative
元素应用动画效果会造成频繁的reflow
。
position: absolute
或position: fixed
的元素应用动画效果只需要repaint
。
- 尽量把多个操作放到一个timer中,而不是使用多个timer
- 字符串连接采用Array.join而是使用+,前者不会创建临时对象,能降低垃圾回收的开销【不同浏览器实现方式不同,因此有不同的争议】
- 性能上来说:
""+字符串
>String()
>.toString()
>new String()
。 - dom对象与js对象相互引用、事件绑定等容易造成内存泄漏,因为dom对象一般不会被销毁,除非你去删除dom
- 多个元素的点击事件转换为一个父容器的点击事件,可提高效率
- 尽量在循环外部使用tryCatch(个人理解就是catch语句块会创建一个作用域,循环中创建作用域导致性能低下)
- 对dom定位时,尽量在某个父容器中进行搜索,减小搜索范围
- 减少使用with,with有自己的作用域,会增加作用域链的长度,优化策略是减小作用域的长度,降低作用域链上的搜索时间
dom节点优化
节点优化的关键在于降低reflow次数,先了解以下什么是reflow【可理解为刷新重绘等】
accepted
|
|
1.使用 DocumentFragment 可以减少reflow次数
2. css优化
如以下代码逐条更改元素的几何属性,理论上会触发多次
reflow
。element.style.fontWeight = 'bold' ;
element.style.marginLeft= '30px' ;
element.style.marginRight = '30px' ;可以通过直接设置元素的
className
直接设置,只会触发一次reflow
。element.className = 'selectedAnchor' ;
3.当dom元素比较多的时候,可以对要频繁操作的dom元素进行缓存,而不是每次都进行定位
4.innerHTML创建dom的效率要大于createElement()和appendChild()和document.write
5.避免的空的src和href,空的代表加载当前页面,这是没有必要的
6.多innerHTML的多次赋值转换为一次赋值,可降低reflow
var str = "<div>这是一个测试字符串</div>";
/**效率低**/
var obj = document.getElementsByTagName("body");
for(var i = 0; i < 100; i++){
obj.innerHTML += str + i;
}
/**效率高**/
var obj = document.getElementsByTagName("body");
var arr = [];
for(var i = 0; i < 100; i++){
arr[i] = str + i;
}
obj.innerHTML = arr.join("");
闭包优化
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = (function(index) {
return function(evt) {
output.innerText += 'Clicked ' + events[index];
};
})(i);
}
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = (function(event) {
return function(evt) {
output.innerText += 'Clicked ' + event;
};
})(events[i]);
}
以上两段代码的区别:前者对event形成依赖,而后者不会。当外部的event被修改了或者被删除了,前者由于形成了依赖,无法正常工作,而后者没有依赖,可以正常执行
关于web页面优化的更多相关文章
- Web前端优化最佳实践及工具集锦
Web前端优化最佳实践及工具集锦 发表于2013-09-23 19:47| 21315次阅读| 来源Googe & Yahoo| 118 条评论| 作者王果 编译 Web优化Google雅虎P ...
- base64:URL背景图片与web页面性能优化
一.base64百科 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息. 某人: 唉,我彻底废柴了,为何上面明明是中文,洒家却看不懂嘞,为什 ...
- web页面的优化
众所周知,一个web页面通常会包括HTML(XHTML.XML).CSS.Javascript,而其中HTML(XHTML.XML)为结构化语言,用于构建页面结构和相关数据:CSS则负责页面的样式,即 ...
- 用RequireJS优化Wijmo Web页面
用RequireJS优化Wijmo Web页面 上周Wijmo 2014 V2版本刚刚发布(下载地址), 有网友下载后发现仅仅使用了40个Widgets的一小部分,还需要加载全部的jquery.wi ...
- 转: web 页面加载速度优化实战-100% 的飞跃提升
前言 一个网站的加载速度有多重要? 反正我相信之前来 博主网站 的人至少有 50% 在加载完成前关闭了本站. 为啥捏? 看图 首页完整加载时间 8.18s,看来能进来看博主网站的人都是真爱呀,哈哈. ...
- 隔壁老主精讲web页面性能优化。
首先说一下为什么要进行web页面性能优化,在同样的网络环境下,两个同样能满足你的需求的网站,一个“Biu”的一下就加载出来了,一个卡--卡--卡--卡--卡--才出来,你会选择哪个?研究表明:用户最满 ...
- 小tip: base64:URL背景图片与web页面性能优化——张鑫旭
一.base64百科 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息. 某人: 唉,我彻底废柴了,为何上面明明是中文,洒家却看不懂嘞,为什 ...
- web页面内容优化管理与性能技巧
来源:GBin1.com 回 想一下,以前我们不得不花费大量时间去优化页面内容(图片.CSS等等),如今用户有更快速的互联网链接,我们似乎能够使用更大的图像或更大的闪 存文件,里面包含的有视频或者图片 ...
- Web页面性能优化(YSlow)
YSlow(解析为Why Slow)是雅虎基于网站优化规则推出的工具,帮助你分析并优化网站性能.旧版Yslow 有13条规则,新版Yslow有23项规则,YSlow会根据这些规则分析你的网站,并给出评 ...
随机推荐
- combobox级联检索下拉选择框
1.效果图 2.前端 @{ ViewBag.Title = "Index"; Layout = null; @*自动筛选下拉框*@ <script src="~/S ...
- SVG如何嵌套在HTML中
1.使用HTML标签 以下三个标签所有主流浏览器都支持 a.<iframe>标签 优势:允许使用脚本 缺点:虽然不是HTML5的新增标签,但是不推荐在HTML4 和 XHTML中使用 例: ...
- Codeforces Round #544 (Div. 3) D. Zero Quantity Maximization
链接:https://codeforces.com/contest/1133/problem/D 题意: 给两个数组a,b. 同时ci = ai * d + bi. 找到一个d使c数组中的0最多. 求 ...
- Magento 缓存机制简析
在知道缓存机制前,首先需要知道,Magento的路由机制,这边就不做赘述了,百度一大堆. 下面一个简单的缓存生效流程: A:首先在页面开始时,Magento在app\code\core\Mage\Co ...
- adb的含义
ADB全名Andorid Debug Bridge. 是一个Debug工具.为何称之为Bridge呢?因为adb是一个标准的C/S结构的工具, 是要连接开发电脑和调试手机的.包含如下几个部分: 1.C ...
- PowerShell和Bash的介绍
PowerShell是运行在windows平台的脚本,而Bash是运行在linux平台的脚本 现在bash能做的事情,PowerShell也能做,PowerShell的强大之处是它可以管理window ...
- apache http server2.2 + tomcat5.5 性能调优
httpd加tomcat做负载均衡,采用session复制方式共享session,采用http-proxy连接方式,打开status mod 一.没有做httpd和tomcat的启动参数修改,包括jv ...
- MySQL优化步骤和my.cnf优化配置
1.查看机器配置,指三大件:cpu.内存.硬盘 2.查看mysql配置参数 3.查看mysql运行状态,可以用mysqlreport工具来查看 4.查看mysql的慢查询 依次解决了以上问题之后,再来 ...
- Windows API函数大全三
7. API之位图.图标和光栅运算函数 BitBlt 将一幅位图从一个设备场景复制到另一个 CopyIcon 制作指定图标或鼠标指针的一个副本.这个副本从属于发出调用的应用程序 CopyImage 复 ...
- Lumia 刷机(强刷)Message send failed解决办法
强刷可以救砖,不需要验证地区code,可以跨刷其它国家/地区的固件,但不是所有机型都可以这样,Lumia 620是支持跨刷的. 看本文你首先要知道使用Nokia Care Suite强刷的步骤,参考从 ...