web性能优化
2017-11-19 23:12 心猿意‘码’ 阅读(268) 评论(0) 编辑 收藏 举报1.高级web性能优化:
a.服务器端技术:改进并行性,使用缓存控制和HTTP压缩,重写URL,以及对RSS订阅使用差值压缩
b.客户端技术:延迟加载JS,按需加载资源,使用逐步增强和使用与数据URL内联的图像以节省HTTP请求数
2.吸引眼球的方法:
a.前载标题,b.描述元标签,c.PPC标题和摘要
3.搜索引擎优化:站内优化和站外优化
a.站内优化:内容关键字优化,有效内容创建和策略性链接交换
b.站外优化:将指向本站的链接数量和流行度最大化
4.flash优化技巧:使用两个div,一个div用于flash动画,另一个用于与其等价的HTML代码
当flash插件可用时,利用JS把HTML DIV隐藏起来,此时HTML对搜索引擎仍然有效
注意:这种方法无法用于复杂的多页面站点,因为所有文字都存放在flash之外的一个XMl文件中
5.专业设计:象征信誉的logo易用的布局,舒服的配色方案,广告词注重收益精确无误与目标受众密切相关,能够吸 引用户的相关图片,易于更新的特别标记
6.导航设计:放弃图片导航,避免将关键字放入图像,扔掉只支持JS的导航,换成基于列表的层叠样式表风格,或提 高等价的导航文本
7.避免在不同URL上使用相同或非常相似的页面
8.影响搜索引擎排名的重要因素:
在标题中使用关键字,入链的锚文本,站点全局链接流行度,站点年龄,站点内部链接结构里链接流行度,站点入链的主题相关性,站点链接在主题社区里的流行度,主体文本中使用的关键字,链接站点的全局链接流行度,链接页面的主题相关度
9.对搜索引擎负面影响的因素:
服务器经常不能访问,内容与索引中已有的内容非常相似或重复,出链质量低或指向垃圾站点,在许多页面上复制标题/元标签,滥用目标关键字(表现为填充,堆砌垃圾信息),参与链接工厂或大量出售链接,非常慢的服务器响应速度,从垃圾站点来的入链,站点的访问者层次低
10.添加关键字的策略:
可见文本的前两句,版式标题及子标题,链接和锚文本,页面URL,文件名,Alt文本,可索引的导航元素
11.a.永久重定向:
Options+FollowSymLinks
RewriteEngine on
RewriteRule ^oldpage.htm$ ......[R=301,L]
b.IIS重定向:
打开Internet Services Manager并浏览你想要重定向的站点
在右侧面板,点击想要重定向的文件或者目录,然后点击Properties
在File标签下面,点击单选按钮A redirection to a URL
将目标输入到Redirect to文本框
确保选中多选框The exact URL entered above和A permanent redirection for this resource
点击Apply
12.加快网页速度方法:
尽量减少HTTP请求,调整图片大小并优化,优化多媒体,将JS转换为CSS,使用服务器端探测,优化JS获得更快的执行速度和更小的文件体积,把表布局转换为CSS布局,用CSS规则替代内联样式,最小化初始显示时间(快速加载有用部分),理智的加载JS
1)减少HTTP请求数:合并文件和用CSS技术代替基于图形的技术(转换图形文本为CSS文本,合并外部文件、脚本、CSS文件,去掉框架和JS头文件包含,用CSS边距代替空白单元,CSS悬停代替JS,CSS精灵)
2)调整图片大小并优化:提前计划最大程度压缩文件大小(简化背景图像);裁剪图片只保留与上下文最相关的部分;调整图像到正好所需的像素大小;合并图片,节约HTTP请求,使用图像映射或CSS精灵;模糊JPEG背景,通过‘表面模糊’进行测试;使用CSS边界或背景代替在图像中的嵌入边框,不要为子排版而设置某种颜色的空白边距,而是使用剪切的图像和通过编码实现背景色;尽可能使用PNG图像替换GIF和JPEG,必要时使用色彩抖动;用HTML高度和宽度指定图像大小;PS智能锐化;用CSS或透明GIF或PNG叠加文本代替JPEG中的嵌入文本,有更高压缩比;优化图片前先消噪;最小化GIF和PNG色彩抖动、位深;采用加权优化(区域压缩),通过alpha遮罩来优化背景;对于尺寸稍小的GIF和PNG,可以使用“有损”压缩;减少或避免在分层图像中阴影效果;
3)快速加载有用部分:通过分层表格或div确保有用内容(例如导航信息),能够快速加载
13.CSS和JS位置:
CSS置顶,JS置底
14.JS优化:
1)删除JS注释(注意条件注释)
2)小心删除空白字符(有些语句忘记添加分号)
3)使用缩写型赋值
4)字符常量宏(定义全局变量)
5)去除无用代码:在声明或多层循环中只包含一个声明,可删除花括号;变量在首次使用时会自动创建且是全局性的,如果使用全局变量,可省略var声明(小心使用);在函数末尾的返回表达式没有参数可删掉(如return)
15.CSS优化:
1)用类型选择器代替内联样式
2)使用后代选择器而不要使用内联类
3)将存在相同声明的选择器归组
4)将相同选择器的不同声明分组
5)将相同样式合并为共享类
6)利用继承消除重复声明
7)使用CSS缩写来简化规则和颜色的定义
8)缩写较长的类名和ID名
9)用CSS代替JS动作
10)使用CSS3
11)属性值的复写:(border,border-color,margin,padding,outline)
一个值代表所有边,两个代表上下和左右,三个代表上 右左 下,四个代表上右下左
12)CSS单幅图像菜单翻转:
一般准备两个图片,但这样的话需要两次HTTP请求,在“关”图片没有预加载情况下,会产生闪烁,最好的解决方法是将两个图片放在一个图片精灵里,通过切换背景位置实现翻转
13)可靠的CSS架构:
重置样式表让渲染行为保持一致
对主页区域使用标记容器单元格,以此设计后代选择器
将外部CSS文件放在head元素里,使之渐进渲染
16.Ajax优化:
1)恰当的使用Ajax解决问题
2)使用良好构建和支持的Ajax库
3)最小化JS代码
4)减少HTTP请求
5)选择正确的传输数据格式
6)确保网络可用性和性能
7)使用JS缓存
8)为搜索引擎提供兼容机制,保证JS被禁用时的可访问性
9)使用片段标识符来储存状态
17.解决Ajax缓存问题:
不将Ajax请求放入缓存的三种方法:
1)在服务器端输出No Cache头部信息
例(PHP):
header("Cache-Control:no-cache");
header("Pragma:no-cache");
2)使用唯一URL来生成请求(使用时间戳)
例:
var ts = "ts="+(new Date()).getTime();
sendRequest("sayhello.php",ts);
3)为过去的某个时间设定If-Modified-Since
①使用XHR对象方法setRequestHeader()来将请求中的If-Modefied-Since设定为遥远的过去
例:xhr.setRequestHeader("If-Modefied-Since","Tue,14 Nov 1995 03:33:08 GMT");
②将Expires头设为遥远的未来
例:header("Expires:Sun,05 Jan 2025 04:00:09 GMT");
18.超时、重试和顺序
设置在一段时间,比如5秒后触发的定时器,来取消正在进行的链接
var g_abort=false; var xhr=createXHR(); if(xhr) { xhr.open("GET","sayhello.php",true); var timeout=setTimeout(function(){g_abort=true;xhr.abort();},5000); xhr.onreadystatechange=function(){responseCallback(xhr,timeout);}; xhr.send(); }
19.三种缓存方法:
1)通过<meta>标签<meta http-equiv="Expires"...>
2)通过编码实现HTTP头设置(CGI脚本等)
3)通过网络服务器通用配置文件(httpd.conf)
20.web性能优化:
1)服务器端优化技术:优化并行下载,缓存频繁使用的对象,使用HTTP压缩,使用delta编码,用mod_rewrite重写URL
关闭ETag,使用Expires和Cache_Control头部来有效缓存资源
关闭方法:在Apache配置文件中添加如下两行(需要mod_header包含在默认Apache结构中)
Header unset Etag
FileETag none
2)客户端优化技术:
Ⅰ.延迟脚本加载:(使用渐进增强,按需加载JS或装载,为外部widget使用一个iframe模拟异步JS)
a.渐进增强:
使用简介的语义化XHTML构造基础内容,让所有浏览器都可以访问,由外部CSS提供更高级的布局,由外部JS提供更高级的交互,用JS实现从DOM添加或删除对象,用JS实现更高级的功能
b.按需加载JS:
使用DOM创建一个脚本元素并把它追加到头部元素:
function include_js(file){ if(document.getElementByTagName){ var html_doc=document.getElementsByTagName('head')[0]; var js=document.createElement('script'); js.setAttribute('src',file); js.setAttribute('type','text/javascript'); html_doc.appendChild(js); js.onreadystatechange=function(){ //for IE if(js.readyState=='complete'){ alert('JS onreadystate fired'); //return true; } } js.onload=function(){ //for non-IE alert('JS onload fired'); //return true; } return false; } else alert('getElementsByTagName not supported'); }
为了避免缓存,可添加随机种子到脚本名中:
function include_jsNoCache{
var ms=new Date().getTime().toString();
var seed="?"+ms;
include_js(src+seed);
}
上述代码在Safari中不会触发onload事件,只有在加载脚本前设置onload和src 属性才会触发Safari中的加载事件,而且前面的脚本也不会清理内存,当脚本被添加到DOM并使用完后,应该删除以节省内存,修改如下:
include_js=(function(){ var uid=0; var remove=function(id){ var head=document.getElementsByTagName('head')[0]; head.removeChild(document.getElementById('jsInclude_'+id)); }; return function(file,callback){ var callback; var id=++uid; var head=document.getElementsByTagName('head')[0]; var js=document.createElement('script'); js.setAttribute('type','text/javascript'); js.setAttribute('src',file); js.setAttribute('id','jsInclude_'+uid); if(document.all) js.onreadystatechange=function(){ if(js.readyState=="complete"){callback(id);remove(id);} }; else js.onload=function(){ callback(id);remove(id); }; head.appendChild(js); return uid; }; })();
c.为外部JS使用iframe:
这样在加载脚本时如果有拖延,只有iframe被拖延,而不是整个网页,因为JS能从一个HTML文件访问嵌入其中的iframe中变量,反之亦然,所有通过把一个HTML分成几个iframe可以有效将同步的HTML网页变成异步
首先,编写一个函数,用于在iframe加载完成之后处理数据:
function mainPageFunction(data){
//...
}
然后创建一个iframe加载外部的JS文件,注意iframe会引起布局问题,所以可以使用隐藏的iframe
这里对指定位置的iframe不做介绍,可用用空的iframe加载数据:
<iframe src="about:blank" height="0" width="0" name="dataframe"></iframe>
<script type="text/javascript">
window.frames['dataframe'].window.location.replace('loadData.html');
</script>
parent.mainPageFunction(data);
Ⅱ.在服务器上缓存站外文件并本地加载:
可以使用cron任务周期地抓取文件,然后本地加载以避免任何由外部服务器引起的延时