前端项目常见性能优化方案

CDN

概念:

通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器更快更可靠的将高性能、可扩展性及低成本的资源发送给用户。

作用:

CDN一般用来托管Web资源,可供下载的资源,应用程序。使用CDN来加速这些资源的访问。

使用场景:

使用第三方CDN服务
使用CDN进行静态资源的缓存
直播传送

懒加载

概念:
也叫 延时加载、按需加载,在较长的网页中应用的一种性能优化的方法。

特点:
减少无用资源的加载
提示用户体验
防止加载过多图片影响其他资源文件的加载

图片懒加载原理:
图片的加载是由src引起的,给src赋值,浏览器请求图片资源。
使用HTML5的data-xxx属性存储图片路径,需要时赋值给src。
图片加载条件:
imgs.offsetTop(元素到顶部距离) < window.innerHeight(浏览器可视区高度) 
+ document.body.scrollTop(滚动距离)

预加载的区别:
预加载指的是将所需的资源提前请求加载到本地,后面需要用到的时候直接从缓存取资源。懒加载是需要的时候再请求资源。

回流和重绘

概念 :
1)回流:在渲染树中,浏览器会重新渲染那些,尺寸、结构或者属性发生改变的元素,。
2)重绘:元素样式发生改变但不影响位置时,浏览器会对元素进行重绘。
回流一定重绘,重绘不一定回流。

解决方法 :
在低层级的DOM节点操作DOM
使用absolute或fixed定位,元素脱离文档流
设置display:none,操作完再显示出来
基于浏览器的渲染队列,将多个读操作放在一起,变成一次回流重绘

防抖和节流

概念:
防抖:事件被触发n秒后再执行回调,n秒内再出触发事件,重新计时,最后一次事件n秒后再执行回调。
节流:单位时间内多次触发事件,只有一次生效。

应用场景:
防抖:
按钮提交,多次提交按钮,只执行最后提交的一次。
服务端验证:表单校验 连续输入,搜索联想词功能 lodash.debounce

节流:
拖拽:固定时间只执行一次,防止超高频次触发位置变动。
缩放:监控浏览器resize,resize事件是在窗口或框架的大小被调整时发生。
动画场景:

函数实现:

     

    /* 防抖 */
    var ipt=document.querySelector('#ipt')

    ipt.addEventListener('input',()=>{
      // console.log(ipt.value,222222);
      dbounce()
    })

    /* 防抖 连续触发走最后一次 */
    var  timeId=null
    function  dbounce(){
      clearTimeout(timeId)
      timeId= setTimeout(()=>{
        console.log(1111);
       },500)
    }
    /* 节流 */
    var ipt2=document.querySelector('#ipt2') 
    /* 节流=====单位时间只走第一次 */
    var flag=true
    var  timeId2=null
    ipt2.addEventListener('click',()=>{
      if(!flag){
        return 
      }
      flag=false
      var n=5
      timeId2= setInterval(() => {
        n-=1

        if(n<1){
          /* 表示时间走完 */
          ipt2.value='获取验证码'
          flag=true
          n=5
          clearInterval(timeId2)
        }else{
          /* 时间还没有走完 */
          ipt2.value=n+'s之后在获取验证码'
        }
      }, 1000);
    })

图片优化

用CSS代替部分图片
用CDN加载
小图使用base64格式
雪碧图
选择正确

webpack优化

用webpack来优化前端性能

压缩代码:删除多余的代码、注释、简化代码的写法等。
利用CDN加速:构建过程中将引用的静态资源路径修改为CDN上对应的路径。
Tree Shaking:将代码中永远走不到的片段删除。
Code Splitting:将代码按路由维度或者组件分块,做到按需加载,充分利用浏览器缓存。
提取公共第三方库:SplitChunksPlugin插件来进行公共模块抽取,利用浏览器缓存可以长期缓存的这些无需频繁变动的公共代码。

webpack的五大模块
entry:
入口提示 webpack以哪个文件为入口七点开始打包,分析构建内部依赖图。
output: 
输出提示 webpack打包后的资源输出到哪里去,以及如何命名。
(loader)module:
让Webpack 能够去处理那些非js文件
plugins:
插件可以用于执行范围更广的任务。插件的范围包括,从打包优化到压缩,一直到重新定义环境中的变量等
mode:
开发模式:本地调试
生产模式:优化上线

loading加载器  从右往左执行
file-loader :把文件输入到一个文件夹中,在代码中通过相对URL去引用输出的文件
url-loader :和file-loader类似,
source-map-loader  : 加载额外的Source Map文件,方便断点调试
image-loader :加载并压缩图片文件
babel-loader :把ES6转换成ES5
css-loader :加载css,支持模块化,压缩,文件导入等特性
style-loader :把CSS代码注入到JavaScript中,通过DOM操作去加载CSS
eslint-loader :通过ESLint检查JavaScript代码

常见Plugin  
define-plugin :定义环境变量
html-webpack-plugin :简化html文件创建
uglifyjs-webpack-plugin :通过UglifyES压缩ES6代码
webpack-parallel-uglify-plugin :多核压缩,提高压缩速度
webpack-bundle-analyzer :可视化webpack输出文件的体积
mini-css-extract-plugin :CSS提取到单独的文件中,支持按需加载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值