# 性能优化的方法
![](http://jbcdn2.b0.upaiyun.com/2016/07/9c0ceb55bb24183c2aaec564d95b2bb8.jpg)
优化的目的在于:
1. 多使用内存 缓存
2. 减少CPU GPU计算,更快展现
主要优化方向有:
1. 加载优化:即提升网络加载,压缩体积
2. 渲染优化:优化页面渲染
## 网络传输性能优化
#### 1.使用HTTP缓存
#### 2.资源打包
使用webpack与gzip进行资源打包,压缩文件体积。
#### 3.图片优化
**不要在HTML中缩放图像**:在使用200* 200的图像时,不要使用400* 400的图像再将宽高设为200。
**使用雪碧图**:多张图片拼接在一起时,会比这些图片的和小。所以使用雪碧图不仅可以减少ajax请求,也可以压缩文件体积。
**使用矢量图icon**
**使用CDN**
## 页面渲染性能优化
#### CSS 放前面,JS放后面
CSS 放在HTML头部的原因:
> 这样会让浏览器尽早拿到 CSS 尽早生成 CSSOM,然后在解析 HTML 之后可一次性生成最终的 RenderTree,渲染一次即可。如果 CSS 放在 HTML 底部,会出现渲染卡顿的情况,影响性能和体验。
>
JS 放在 HTML 底部的原因:
> 保证让浏览器优先渲染完现有的 HTML 内容,让用户先看到内容,体验好。另外可以保证JS代码正确获取DOM。
>
#### 懒加载
首先将页面上的图片的 src 属性设为空字符串,而图片的真实路径则设置在data-original属性中,
当页面滚动的时候需要去监听scroll事件,在scroll事件的回调中,判断我们的懒加载的图片是否进入可视区域,如果图片在可视区内将图片的 src 属性设置为data-original 的值,这样就可以实现延迟加载。
~~~
<img src="" class="image-item" lazyload="true" data-original="images/1.png"/>
~~~
实现:
~~~
function imgLazyLoad(el) {
let imgs = [].slice.call(document.querySelectorAll(el));
function isInSight(el) {
const bound = el.getBoundingClientRect();
return bound.top <= window.innerHeight + 100 && bound.bottom >= -100; // 添加预留量
}
function loadImg(el) {
if (el.src !== el.dataset.src) {
el.src = el.dataset.src;
}
}
return function checkImgs() {
for (var i = 0; i < imgs.length;) {
if (isInSight(imgs[i])) {
loadImg(imgs[i]);
imgs.splice(i, 1);
if (!imgs.length) {
window.removeEventListener('scroll', lazyload);
}
} else {
i++;
}
}
};
}
function throttle(fn, interval = 500) {
let canRun = true;
return function () {
if (!canRun) return;
canRun = false;
setTimeout(() => {
fn.apply(this, arguments);
canRun = true;
}, interval)
}
}
var lazyload = throttle(imgLazyLoad('.my-photo'));
window.addEventListener('DOMContentLoaded', lazyload);
window.addEventListener('scroll', lazyload);
~~~
通过scrollTop判断是否处在屏幕之内。
#### defer async
defer与async都是可以延迟脚本执行 但是 async不能保证按顺序执行 defer可以,且defer只有ie支持。
#### 事件节流/去抖-->单独列出
#### 减少DOM操作
#### SSR后端渲染
- html
- 冒泡/捕获/委托
- 前端路由
- Dom
- 创建节点API
- 页面修改型API
- 节点查询型API
- 节点关系型API
- 元素属性API
- DOM事件
- classList
- 性能优化
- 节流防抖
- localStorage sessionStorage
- BOM
- meta
- data属性
- js实现拖拽
- html5
- 关于meta
- 轮播图
- js实现拖放
- 电话号inputFormater
- js
- es6
- promise
- iterator
- generator
- async
- proxy
- Set
- Map
- Object的扩展
- String
- Iterator
- Symbol
- 解构赋值
- 函数式编程
- module
- 基本数据类型
- 数组相关codings
- for of/for in
- this
- call bind apply
- 闭包
- 作用域
- prototype与继承
- 深浅拷贝
- setTimeOut/setInterval
- 垃圾处理机制
- 设计模式
- 观察者模式
- 单例模式
- 策略模式
- RegExp
- with
- 其他玩意
- Error/Stack Trace
- 面向对象
- css
- 回流重绘
- %取值
- 属性继承/属性优先级
- flex
- BFC
- 盒模型
- 设置css的方法
- 定位机制
- 块级/行内元素
- hack和一些别的玩意
- css动画
- 几个布局
- 画图形
- css3
- animation对比transform
- 点击不同图片区域跳转不同
- css选择器性能问题
- vh rem em
- css选择器
- 伪类伪元素
- css匹配原理
- 数据结构与算法
- 数据结构
- 树
- 链表
- 栈和队列
- 排序
- 归并排序
- 插入排序
- 选择排序
- 冒泡排序
- 快速排序
- 递归
- 回溯法
- 搜索算法
- 动态规划
- http
- 跨域问题
- CORS
- GET/POST
- ajax
- ajax上传文件
- http缓存
- https
- TCP/UDP
- cookie/session
- http2.0
- spdy
- websocket
- React
- redux
- 生命周期
- 虚拟dom与diff
- 双向数据绑定
- mvvm
- setState
- contextApi props reudx
- 高阶组件
- react-redux
- Fiber
- react-router
- 受控/非受控组件
- 待整理
- webpack
- loader实现
- 前端安全
- 移动端适配
- Vue
- 传值
- 其他