博客地址:https://ainyi.com/15javascript
在chrome浏览器,对于同一域名,最多支持6个请求的并发,其余请求会推入到队列中等待或停滞不前,直到6个请求之一完成后,队列中新的请求才会放出。css

能够看到,六个绿色条并发请求,四个灰色条等待请求,最下面三个绿色条3.4s后才触发请求html
- html、css、js 代码压缩
- 公共文件(js/css)合并、请求合并
- 浏览器缓存(强缓存、弱缓存)
- CDN(Content Delivery Network,内容分发网络)加速。经过将静态资源(例如javascript,css,图片等等)缓存到离用户很近的相同网络运营商的CDN节点上,不但能提高用户的访问速度,还能节省服务器的带宽消耗,下降负载(所以,一个地区内只要有一个用户先加载资源,在 CDN 中创建了缓存,该地区的其余后续用户都能所以而受益)
- loading 动画
- 页面骨架屏
- 减小操做 dom 方法
- 优化图片加载
- 懒加载和预加载
减小操做 dom 方法
- 插入大量dom元素时,可使用innerHTML替代逐个构建元素
- 处理列表子元素的事件时,可使用事件委托
优化图片的加载
- 图片懒加载,优先加载浏览器可视区域的图片
- 小图片或图标,可用SVG、Iconfont、Base64等技术,多个图标也能够制做成雪碧图(CssSprites)
- 加载时预先加载一张特别小的通用略缩图,正式图片加载完成后替换略缩图
- 服务端根据业务须要能够对图片进行压缩 (不影响用户体验的状况下)
- 为项目添加骨架屏
- Base64是网络上最多见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
懒加载原理
首先将页面上的图片的 src 属性设为空字符串或者一个加载中的图片,而图片的真实路径则设置在 data-original 属性中,vue
当页面滚动的时候须要去监听 scroll 事件,在 scroll 事件的回调中,判断咱们的懒加载的图片是否进入可视区域,java
若是图片在可视区内,将图片的 src 属性设置为 data-original 的值,这样就能够实现延迟加载node
预加载
- 纯 css 实现预加载
不在浏览器可视范围内加载图片,直接 css 加载,
但图片会随文档一块儿加载,此时可能会下降文档的加载速度
- 纯 js 实现预加载
js 脚本提早加载图片 src 或使用 image 对象提早加载图片
- css 和 js 实现预加载
如 img 标签最初设置为 display: none,要加载的时候显示
或者滚动条到达可视范围内,js 为目标 div 加上这个已经加载好的 css 属性
- ajax 预加载
提早 ajax 请求获取数据
场景有个 tab 标签页,当鼠标放到某个 tab,马上 ajax 加载该 tab 的数据
当点击这个 tab 标签页的时候,就能够马上加载出来,再将数据缓存起来或加入全局变量,下一次使用直接从缓存读取
图片转为base64
- 图片的 base64 编码就是能够将一幅图片的二进制编码成一串字符串,使用该字符串代替图像地址
- 能够减小http请求,base64能够随着html的下载同时下载
- 适用于小图片和简单图片
节点
element.parentNode 返回元素的父节点ios
element.childNodes 返回元素的一个子节点的数组ajax
element.nodeName 返回元素的标记名(大写),用的时候转换小写(element.nodeName.toLowerCase())vuex
event.target:返回触发此事件的元素(事件的目标节点)chrome
详看:http://www.javashuo.com/article/p-fhvvbfyk-bk.html
HTML DOM 元素对象:http://www.runoob.com/jsref/dom-obj-all.html
HTML DOM 事件对象:http://www.runoob.com/jsref/dom-obj-event.html
工做中对于广告编辑页的优化
优化加载速度 1.4s
优化的具体
- 公共接口合并,减小 http 请求,后端作缓存
- promise all 解决根据请求顺序顺序获取的问题(当前接口的数据展现须要依赖上一个接口数据的情景)旧版本是 如有依赖关系的接口,是等待上一个接口请求完毕,才发送当前接口请求
- 数据预加载(第四个模块的数据默认收起,点击展开的时候预先加载。不用等待)
- 公用数据下沉到领域模型,多个模块复用的数据,不用再次请求接口
- 实现页面 MVC 结构 可看这里数据处理单独抽出来放在 service 层,(vuex mutation)
- 数据处理(数据量很大的时使用数据字典,可使用 obj.key 获得想要的数据,须要的数据 key 值与数据字段做关系映射)
- 组件化、ESLint 代码规范,便于维护旧版本是 循环使用 if 等于须要的 key 来获取数据
- for 循环的使用,数组循环使用 for of,对象使用 for in
- 路由方面,使用路由懒加载
- 一开始页面须要加载多条请求,在 axios 统一请求拦截加上loading,和接口请求计数器+1,统一响应拦截计数器-1,当等于零就关闭 loading
- 渠道组件和多选省市级三级联动组件的优化(重写 Element 的穿梭框组件)具体看 关于 Element 组件的穿梭框的重构
博客地址:https://ainyi.com/15