web 前端开发,如何提高页面性能优化?
内容方面:
1.减少 HTTP 请求 (MakeFewerHTTPRequests)
2.减少 DOM 元素数量 (ReducetheNumberofDOMElements)
3.使得 Ajax 可缓存 (MakeAjaxCacheable)
针对 CSS:
1.把 CSS 放到代码页上端 (PutStylesheetsattheTop)
2.从页面中剥离 JavaScript 与 CSS(MakeJavaScriptandCSSExternal)
3.精简 JavaScript 与 CSS(MinifyJavaScriptandCSS)
4.避免 CSS 表达式 (AvoidCSSExpressions)
针对 JavaScript :
1.脚本放到 HTML 代码页底部 (PutScriptsattheBottom)
2. 从页面中剥离 JavaScript 与 CSS(MakeJavaScriptandCSSExternal)
3. 精简 JavaScript 与 CSS(MinifyJavaScriptandCSS)
4. 移除重复脚本 (RemoveDuplicateScripts)
面向图片(Image):
1.优化图片
2 不要在 HTML 中使用缩放图片
3 使用恰当的图片格式
4 使用 CSSSprites 技巧对图片优化
前端性能优化
思路:分析一个页面从输入 URL 到页面加载显示完成的所有步骤,采用 分治法 逐步优化。
-
优化DNS查询
减少域名:尽量把所有的资源放在一个域名下。
一个域名同时可以发4(IE8)或 8个请求(Chrome),请求文件少,用1个域名,文件多用多个域名。与3权衡。 -
优化TCP协议
TCP连接复用,使用keep-alive:连接回复加上请求头:keep-alive。
第一次请求不断开,第二次请求复用。
使用http 2.0版本:多路复用,连接复用率会更高 -
优化发送HTTP请求
合并JS或CSS文件
inline image:使用data:url scheme来内连图片
减小cookie体积,每个请求都会附带cookie,所以不要滥用cookie。
合理使用CasheControl代替发送HTTP请求
同时发送多个请求(浏览器自带)IE8可以同时请求下载4个的css文件,Chrome可以同时请求下载8个 。 -
优化接受响应
设置Etags:浏览器重复与请求服务器一样的文件,ETag响应304。
Gzip压缩大文件 使用macos gzip,npm server gzip gzip 文件名
其响应头为Content-Encodinging:gzip,先压缩接收到再解压缩。缺点:耗费浏览器CPU,权衡 -
优化DOCTYPE
不能不写,不能写错 -
优化CSS、JS请求
使用CDN:用CDN请求静态资源同时可以增大同时下载数量,内容分发网络(CDN)可以使请求总时间降低,也可以减少cookie
CSS放在head里:使其尽早下载,因为chrome需要下载完所有的css后才渲染页面
JS放在body里的最后:尽早显示整个页面,获取节点。 -
使用懒加载
组件懒加载<span style="color:#000000"><code> const xxx =()=>import('./components/xxx.vue') </code></span>
路由懒加载
-
优化用户体验
用户看到哪些内容就请求哪些内容
加一个loading动画用户会感觉时间变快 -
减少监听器,使用事件委托
<span style="color:#000000"><code class="language-html"> <span style="color:#f2777a"><span style="color:#f2777a"><span style="color:#999999"><</span>body</span><span style="color:#999999">></span></span> <span style="color:#f2777a"><span style="color:#f2777a"><span style="color:#999999"><</span>ul</span><span style="color:#999999">></span></span> <span style="color:#f2777a"><span style="color:#f2777a"><span style="color:#999999"><</span>li</span><span style="color:#999999">></span></span>1<span style="color:#f2777a"><span style="color:#f2777a"><span style="color:#999999"></</span>li</span><span style="color:#999999">></span></span><span style="color:#f2777a"><span style="color:#f2777a"><span style="color:#999999"><</span>li</span><span style="color:#999999">></span></span>2<span style="color:#f2777a"><span style="color:#f2777a"><span style="color:#999999"></</span>li</span><span style="color:#999999">></span></span><span style="color:#f2777a"><span style="color:#f2777a"><span style="color:#999999"><</span>li</span><span style="color:#999999">></span></span>3<span style="color:#f2777a"><span style="color:#f2777a"><span style="color:#999999"></</span>li</span><span style="color:#999999">></span></span><span style="color:#f2777a"><span style="color:#f2777a"><span style="color:#999999"><</span>li</span><span style="color:#999999">></span></span>4<span style="color:#f2777a"><span style="color:#f2777a"><span style="color:#999999"></</span>li</span><span style="color:#999999">></span></span> <span style="color:#f2777a"><span style="color:#f2777a"><span style="color:#999999"></</span>ul</span><span style="color:#999999">></span></span> <span style="color:#f2777a"><span style="color:#f2777a"><span style="color:#999999"><</span>script</span><span style="color:#999999">></span></span> <span style="color:#cc99cc">let</span> liList <span style="color:#99cc99">=</span> document<span style="color:#999999">.</span><span style="color:#6699cc">querySelectorAll</span><span style="color:#999999">(</span><span style="color:#99cc99">'li'</span><span style="color:#999999">)</span> <span style="color:#999999">// liList[0].onclick = ()=>console.log(1)</span> <span style="color:#999999">// liList[1].onclick = ()=>console.log(2)</span> <span style="color:#999999">// liList[2].onclick = ()=>console.log(3)</span> <span style="color:#999999">// liList[3].onclick = ()=>console.log(4)</span> <span style="color:#999999">//监听太多</span> <span style="color:#cc99cc">let</span> ul <span style="color:#99cc99">=</span> document<span style="color:#999999">.</span><span style="color:#6699cc">querySelector</span><span style="color:#999999">(</span><span style="color:#99cc99">'ul'</span><span style="color:#999999">)</span> ul<span style="color:#999999">.</span><span style="color:#6699cc">onclick</span> <span style="color:#99cc99">=</span> <span style="color:#999999">(</span>e<span style="color:#999999">)</span> <span style="color:#99cc99">=></span> <span style="color:#999999">{</span> <span style="color:#cc99cc">if</span> <span style="color:#999999">(</span>e<span style="color:#999999">.</span>target<span style="color:#999999">.</span>tagName <span style="color:#99cc99">===</span> <span style="color:#99cc99">'LI'</span><span style="color:#999999">)</span> <span style="color:#999999">{</span> console<span style="color:#999999">.</span><span style="color:#6699cc">log</span><span style="color:#999999">(</span>e<span style="color:#999999">.</span>target<span style="color:#999999">.</span>innerText<span style="color:#999999">)</span> <span style="color:#999999">}</span> <span style="color:#999999">}</span><span style="color:#999999">//减少监听,采用事件委托</span> <span style="color:#f2777a"><span style="color:#f2777a"><span style="color:#999999"></</span>script</span><span style="color:#999999">></span></span> <span style="color:#f2777a"><span style="color:#f2777a"><span style="color:#999999"></</span>body</span><span style="color:#999999">></span></span> </code></span>
-
优化图片大小=图片压缩
-
减少或合并DOM操作或使用虚拟DOM
-
使用setTimeout降低调用接口频率