#前端性能优化概览
##网站优化是多方面的
**后端**
1. 架构
2. 数据库优化
3. PHP优化
4. 数据缓存
5. 网页缓存 静态化 与URL路由
**网络**
**前端**
ob_flush():
flush();
##网页缓存
网页缓存和静态化
提升服务器负载能力
缓存策略:
1、时间过期
2、更新时删除缓存读取时生成
3、更新时重新生成缓存
访问量不同的页面如何缓存?比如名人的微博与普通人的微博 if ($total < 100 || $total % 10 == 0)
URL路由可能是伪静态化
1、SEO友好
2、便于理解、收藏
3、安全
示例:url路由与网页缓存
**网页优化是多方面的**
1、后端
2、网络 CDN、域名
3、前端
##前端优化
1、减少数据传输 不减少页面元素如果减少数据量?
2、优化资源加载
同样的内容应该如何优化?
3、代码级优化 -- HTML、CSS、JavaScript 性能相差多少?
4、需要后端如何配合?
** 减少资源传输 **
如何减少? 少传输、传输小的、不传输
1、减少请求数 除了合并还有其他方式能减少请求数吗?
2、减少传输数据体积
3、使用缓存
减少资源传输
1、减少请求数 a)合并请求(CSS、JS、image-sprite)
jsversion.php
2、减少传输数据体积
除了压缩还能从哪些方面入手?
3、使用缓存
减少资源传输
1、减少请求数 a)合并请求(CSS、JS、image-sprite)
b)css3 (shadow border-radius gradient rotate) c)部分image采用data-uri(示例img_datauri.html)
d)按需加载
图片按需加载(示例img_lazyload) js/css按需加载
2、减少传输数据体积
除了压缩还能从哪些方面入手?
a)压缩(gzip、GCCompiler、YUICompressor)(示例jsmin)
b)简化页面结构(首屏内容输出)
c)减少cookie(独立静态资源域名)
d)合适的图片压缩比和类型(gif、png、jpg)
e)响应式设计(media query、ua)
3、使用缓存
a)静态资源外链
b)http cache header(Cache-Control、Expires、Vary、Last- Modified、Etag)需要服务器配合
c)Web Storage(Session Storage、Local Storage)
d)Hijax(History+Ajax)
e)CDN
优化资源加载
如何优化? 用户先看到一部分、加大并发下载
1、尽早输出后端缓冲区
2、CSS、JS加载顺序
3、异步加载策略
4、并行加载策略
1、尽早输出后端缓冲区 优先输出header,浏览器下载资源是多线程的
2、CSS、JS加载顺序 CSS放页面头部,JS放页面底部
2、CSS、JS加载顺序 a)浏览器会等待JS执行完毕,再执行接下来的渲染 b)CSS是并行加载的 c)CSS放前面防止页面渲染抖动和闪烁 d)CSS放前面减少浏览器重绘和重排,提高效率
示例:long_js.html
3、异步加载策略 a)JS异步加载方式(defer/async/insert into head) b)异步加载不会阻塞浏览器渲染 c)按需加载,延迟加载或者交互再加载
4、并行加载策略(示例multi_down.html) 采用不同的静态域名,浏览器对同一域名请求数有限制
代码优化
1、HTML
a)减少DOM数量
b)减少层级
c)不做错误嵌套
2、CSS
a)优化选择器。从右到左原则。
效率:id、类、标签、子、属性、伪选择器、通配符 CSS从右到左原则
效率不高
body * { }
ul li a { } #main-nav > li { } 看着快其实慢 ul#top_nav { } 画蛇添足
改进
.li-a { } .main-li { } #top_nav { }
3、编写高效的JS
作用域、DOM操作、事件代理、时间分片
作用域链 少用全部变量 示例:scope_vs.html
高效JS-访问DOM
a)JS与DOM的桥梁,JS访问DOM代价较大 b)最小化DOM访问,局部变量缓存 c)html collections不是js数组,length动态更新,必要时转换成js 数组效率更高
示例:dom_vs.html、html_collection.html
高效JS-DOM树与渲染树
a)什么是DOM树与渲染树?什么是重绘与重排版?
b)什么时候需要重排版: 元素尺寸内容位置、可见元素、重口尺寸、初始化
c)访问这些属性需要马上执行完渲染队列: offsetTop、offsetLeft、offsetWidth、offsetHeight clientTop。。。
scrollTop。。。
d)JS修改DOM如何提高效率?
a)合并一次修改 b)从文档移除,修改后再插入文档 隐藏
内存构建
示例:dom_add.html
高效JS-事件托管
a)不要写事件句柄在DOM元素上 事件句柄发生在onload或domready,用户不会100%点击
b)采用事件托管,合并管理 事件托管可以利用冒泡用少量句柄实现 事件托管把动作处理和静态页面分离,修改方便
第四章 更高效的代码执行 高效JS-避免长时间JS脚本
a)调用栈限制 b)用户感知(超过100ms) c)分拆执行
示例:work.html
需要服务器端配合处理
1、gzip压缩
web服务器开启
2、缓存
服务器页面输出http头信息
3、并发、按需 服务器端动态配置域名,灵活配置资源 4、页面静态化 提高负载、SEO、便于理解、安全。伪静态化 5、减少请求
服务器端合并文件、调用压缩 版本控制?
CSS、JS压缩之版本控制
好的版本处理: a)浏览器不需要刷新 b)容易回滚 c)修改才生成新的版本 d)合并处理同样遵循上面3条
如何做到?
CSS、JS压缩之版本控制
简单处理方式: 1、a.html引用<script src=“a.js?v=1.0.1”></script> 2、a.html引用<script src=“a-1.0.1.js”></script>
哪种方式好?
如何上线?
如何回滚?
如何维护?
CSS、JS压缩之版本控制
Hash处理方式: 开发时<script src=“a.js”></script> 上线替换<script src=“a-xxxxxx.js”></script>
a)手工版本维护
b)基于目录修改时间
- SWOOLE及php网络编程
- LNMP架构与Socket,http协议
- 如何高效学习
- 开发工具箱
- 编写高效的js
- js闭包编写全功能的购物车
- JSON和JSONP
- 多级分类的开发与应用
- 设计安全的登录注册流程
- 前端性能优化
- 前端架构优化
- 使用第三方云服务加速产品开发
- 移动互联网之API开发
- php分层
- 全文检索的实践与部署
- webIM的原理及前后端实现
- 如何配置高效的数据库以及MySQL的代码及插件开发
- NoSql.队列,任务队列
- 构建本机缓存,构建分布式缓存池
- 数据库分库分表的设计
- Nginx原理及模块开发初步
- 无限扩充的数据库架构
- php构建分库分表分布式数据库连接池
- 静态文件上传、分布式存储与分发
- MySQL Cluster,Proxy分析与实践
- 架构解密