2024年最全vue项目的性能优化,2024年最新斗鱼直播面试

最后

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
就答题情况而言,第一问100%都可以回答正确,第二问大概只有50%正确率,第三问能回答正确的就不多了,第四问再正确就非常非常少了。其实此题并没有太多刁钻匪夷所思的用法,都是一些可能会遇到的场景,而大多数人但凡有1年到2年的工作经验都应该完全正确才对。
只能说有一些人太急躁太轻视了,希望大家通过此文了解js一些特性。

并祝愿大家在新的一年找工作面试中胆大心细,发挥出最好的水平,找到一份理想的工作。

可以通过Object.freeze()将data某些数据冻结,也就是configurable设置为false,在defineReactive中会检测某个key对应的configurable是否为false,是则直接返回,不是就继续配置getter/setter。

export default {
  data: () => ({
    users: {}
  }),
  async created() {
    const users = await axios.get("/api/users");
    this.users = Object.freeze(users);
  }
};

  • 其他使用场景:固定配置信息、常量数据(枚举值或数据字典)
  • PS:冻结后的对象是不可变的,无法添加新的属性、删除属性,也无法修改值。要想解除对象的冻结是不可能的,因为Object.freeze是不可逆操作,想要修改对象就只能重新创建一个新对象

6、防抖和节流

防抖和节流是针对用户操作的优化。

  • 防抖就是在一段时间内只执行最后一次,主要用在搜索框实时搜索、输入验证、窗口大小调整。
  • 节流是在规定的时间内只执行一次,主要用在页面滚动加载、高频点击提交、表单重复提交。

可以自己手写实现防抖节流(一定要会 高频考点),但在vuecli脚手架中可以引用Lodash库里的防抖节流函数。

7、利用keep-alive缓存

缓存常见的组件(tab页、导航栏),避免在切换路由时重复渲染相同的组件,提高性能和用户体验

8、图片懒加载、压缩、雪碧图

8.1 图片懒加载

未出现在可视区域内的图片先不加载,等滚动到可视范围再加载,实现方法主要有以下三种:

  • IntersectionObserver专门来检测某个元素是否出现在可视窗口,出现后就设置src,再取消监听。可以将逻辑封装成可重用的指令,在懒加载的图片元素上使用该指令即可

  • 移动端可以直接在img标签添加loading=“lazy”属性,浏览器自动处理图片的懒加载

  • vue中可以安装插件vue-lazyload,通过v-lazy写到对应的元素实现

    • 插件是在main.js中引入的,不会被webpack编译,直接写相对地址是获取不到图片正确地址的
    • 设置了翻页功能,且每页都是请求的数据进行渲染的,发现其他数据都会变,但是图片不变,解决办法就在后面加个key就行
    <img v-lazy="img.src" :key="img.src" >
    
    

IntersectionObserver(浏览器提供的API)实现图片懒加载原理:观察图片与视窗的交叉情况,从而判断是否出现在视窗中。实现图片懒加载步骤大概:

  • 创建一个观察器对象,指定要观察的图片 以及 触发交叉状态变化时的回调函数
  • 在函数中判断是否进入视窗内部
  • 进入的话就触发回调函数,执行图片加载操作,把真实地址赋给src,再停止监听
<!-- HTML -->
<img class="lazy-load" data-src="lazy-image.jpg" alt="Lazy-loaded image">
<script>
  // JavaScript
  // 创建 IntersectionObserver 对象
  const observer = new IntersectionObserver((entries, observer) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) { // 判断目标元素是否进入视窗内
        const lazyImage = entry.target;
        lazyImage.src = lazyImage.dataset.src; // 将真实图片地址赋给src属性
        observer.unobserve(lazyImage); // 停止观察该目标元素
      }
    });
  });
  // 获取所有带有 lazy-load 类的图片元素
  const lazyImages = document.querySelectorAll('.lazy-load');
  // 遍历所有图片元素,开始观察
  lazyImages.forEach(image => {
    observer.observe(image);
  });
</script>

8.2 图片压缩

可以在webpack.base.conf.js中url-loader设置limit大小来处理图片,小于limit的图片转换成base64格式

将图片转成base64格式的原因:

  • 减少HTTP请求:转成base64后,可以直接包含在HTML、CSS或JS文件中,而不用单独的HTTP请求,也就减少了服务器的负载
  • 增加缓存利用率:图片已经在文件中,可以利用浏览器的缓存机制,避免重复加载相同的图片资源

对于一些较大的图片可以用image-webpack-loader压缩,具体配置如下:

module.exports = {
  module: {
    rules: [
      {
        test: /\.(png|jpg|gif)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              limit: 8192,  // 图片小于8KB时转换为base64
              name: '[name].[ext]',
              outputPath: 'images/'  // 输出到指定目录
            }
          },
          {
            loader: 'image-webpack-loader',
            options: {
              mozjpeg: {
                progressive: true,
                quality: 65
              },
              optipng: {
                enabled: false,
              },
              pngquant: {
                quality: [0.65, 0.90],
                speed: 4
              },
              gifsicle: {
                interlaced: false,
              },
              webp: {
                quality: 75
              }
            }
          }
        ]
      }
    ]
  }
};

8.3 雪碧图

针对多个小图标可以利用雪碧图技术,将其合并成一张大图,减少HTTP请求次数

  • 把小图标准备好,放在同一个文件夹下
  • 用webpack插件webpack-spritesmith将其合并成一张雪碧图
  • 可以设置每个图标的样式
  • 通过background-position来显示需要的图标

9、路由懒加载

路由被访问才加载对应的组件,提高首屏显示速度

const Foo = () => import('./Foo.vue')

10、第三方插件按需引入

babel-plugin-component只引入需要的组件,减小项目体积。安装包导入依赖即可,在main.js按需引入组件

项目打包层面

1、提取公共代码

安装分析工具webpack-bundle-analyzer,会生成可视化的文件链路图,根据需求做调整。

CommonsChunkPlugin(webpack内置插件)去提取多个chunk的公共部分

2、减少ES6转换成ES5的冗余代码

babel在每个输出文件中内嵌依赖的辅助函数代码,不让这些代码重复出现,可以用babel-plugin-transform-runtime插件,减小babel编译出来的代码大小。

  • 安装包
  • 修改.babelrc配置文件
"plugins": [
    "transform-runtime"
]

3、压缩和合并JS、CSS文件

使用OptimizeCssnanoPlugin插件来压缩和去重css样式文件,开启optimization.minimize来压缩js代码。

4、tree shaking

tree shaking只能处理ES6模块,消除未使用过的代码,减少文件大小。

使用生产模式,在config.js设置mode: ‘production’来启用生产模式,用usedExports: true来启用tree shaking

项目部署层面

1、开启gzip压缩

前后端都可以压缩,不管在nginx还是webpack压缩,在nginx都要开启gzip压缩,要不然浏览器加载的还是未压缩的资源。

识别gzip压缩是否开启,只需要看响应头部有没有Content-Encoding:gzip这个属性,有就表明开启了。

(1)在vue-cli初始化项目中,默认有这个配置:

  • 先安装插件,再在config/index.js文件开启即可
build: {
    // 其他代码
**前端资料汇总**

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**

![](https://img-blog.csdnimg.cn/img_convert/6e0ba223f65e063db5b1b4b6aa26129a.png)



我一直觉得技术面试不是考试,考前背背题,发给你一张考卷,答完交卷等通知。

首先,技术面试是一个 认识自己 的过程,知道自己和外面世界的差距。



更重要的是,技术面试是一个双向了解的过程,要让对方发现你的闪光点,同时也要 试图去找到对方的闪光点,因为他以后可能就是你的同事或者领导,所以,面试官问你有什么问题的时候,不要说没有了,要去试图了解他的工作内容、了解这个团队的氛围。
找工作无非就是看三点:和什么人、做什么事、给多少钱,要给这三者在自己的心里划分一个比例。
最后,祝愿大家在这并不友好的环境下都能找到自己心仪的归宿。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值