性能优化与调试技巧---图片优化| 豆包MarsCode AI 刷题

114 阅读4分钟

性能优化与调试技巧---图片优化| 豆包MarsCode AI 刷题

最近小编在部署网页的时候就发现了问题,租了一个免费的服务器,结果带宽只有1M,那么多的照片,如果同时访问的话,服务器可吃不消,结果就是服务器崩掉咯,那怎么解决这样的问题呢?

方法1:运用图片懒加载技术

通过自己封装图片懒加载插件,进行多次重复的利用

解决流程

用户进入网站=>检测用户是否访问=>进行图片加载=>开发中进行绑定

检测用户是否访问

通过vueuse实用函数合集API,我们可以找到 useIntersectionObserver(vueuse.nodejs.cn/core/useInt…)*,它可以监听用户是否访问到指定的区域,然后进行反馈。

下面是 useIntersectionObserver的用法

xml 代码解读复制代码<script setup>
import { useIntersectionObserver } from '@vueuse/core' //进行方法导入
import { ref } from 'vue'const target = ref(null)
const targetIsVisible = ref(false)
​
const { stop } = useIntersectionObserver(
  target, //target是你需要检测的元素
  ([{ isIntersecting }], observerElement) => {
    targetIsVisible.value = isIntersecting
  },
    //isTntersecting是检测该元素是否出现在视图=>如果出现返回"True",否则"false"
)
</script><template>
  <div ref="target">
    <h1>Hello world</h1>
  </div>
</template>

通过上述例子的分析,你将可以知道,它拥有访问对象target,判断是否浏览的isIntersecting 以及,停止监听的stop() ,掌握这三种,你将可以简单的监听用户是否访问到指定的元素。

下面是 useIntersectionObserver的例子

xml 代码解读复制代码<script setup lang="ts">
import { vIntersectionObserver } from '@vueuse/components'
import { ref } from 'vue'const root = ref(null)
​
const isVisible = ref(false)
​
function onIntersectionObserver([{ isIntersecting }]: IntersectionObserverEntry[]) {
  isVisible.value = isIntersecting
}
</script><template>
  <div>
    <p>
      Scroll me down!
    </p>
    <div v-intersection-observer="onIntersectionObserver">
      <p>Hello world!</p>
    </div>
  </div>
​
  <!-- with options -->
  <div ref="root">
    <p>
      Scroll me down!
    </p>
    <div v-intersection-observer="[onIntersectionObserver, { root }]">
      <p>Hello world!</p>
    </div>
  </div>
</template>
进行图片懒加载

到这一步,你已经可以检测用户是否访问到图片区域了,剩下的就是如何进行图片加载了

图片加载我们将利用vue的自定义指令

我们命名一个名为lazyPlugin的插件,并将其导出。

javascript 代码解读复制代码//lazyPlugin.vue
import { useIntersectionObserver } from '@vueuse/core'
export const lazyPlugin={
  install(app){
//自定义全局指令
//el是目标元素,bindling类似于:src="" =右边的赋值
app.directive('img-lazy',{
  mounted(el,bindling){
    const {stop}=useIntersectionObserver(
      el,
      ([{ isIntersecting }]) => {
        if(isIntersecting){
          el.src=bindling.value
          stop()//加载完后停止监听=>性能优化
        }
      },
    )
  }
})
  }
}

提醒: 在代码中,我们可以发现stop()。因为useIntersectionObserver会一直进行监听,所以无论加载是否,只要访问一次指定区域就会触发相对于的事件,所以避免性能浪费,我们在第一次加载结束时候,就可以停止它的监听,优化性能

在主文件中进行挂载
javascript 代码解读复制代码//main.js
import {lazyPlugin} from '@/directives/index'
app.use(lazyPlugin)
在具体开发中进行绑定
javascript 代码解读复制代码 //xxx.vue
 <img v-img-lazy="item.picture" alt="">

那么到这一步,你将拥有了图片懒加载的功能,成功让浏览器性能得到了优化!!!

方法2:通过CSS引入图片

  1. 直接使用background-image属性: 这是最常用的方法之一。你可以在一个CSS规则中,使用background-image: url('图像的路径');来为一个元素设置背景图像。
  2. 使用CSS Sprite: 这是一种将多个小图像合并成一个大的图像文件的技术。然后,你可以使用background-position属性来显示你需要的那部分图像。这样可以减少服务器的请求次数哦!
  3. 使用Base64编码: 将图像转换为Base64编码的字符串,然后直接嵌入到CSS文件中。这样也可以减少服务器请求,但可能会增加CSS文件的大小哦。

方法3:通过调用GPU,缓解服务器压力

  1. 利用GPU硬件加速: 现代的浏览器和CSS都支持GPU硬件加速。通过使用CSS的某些属性,如transform、opacity和filter等,可以触发GPU加速,从而减轻CPU的负担,提高渲染效率。
  2. 优化图像资源:使用合适的图像格式(如WebP),以及压缩图像文件的大小,可以减少服务器的带宽消耗和传输时间。同时,也可以降低GPU的渲染负担哦。
  3. 减少重绘和回流: 频繁的DOM操作会导致浏览器的重绘和回流,这会增加CPU和GPU的负担。因此,应该尽量减少不必要的DOM操作,或者使用一些技术来合并和优化DOM操作。

不过要注意哦,虽然GPU加速可以带来性能上的提升,但也要合理使用,避免过度消耗GPU资源导致设备过热或其他问题。

至于服务器能耗方面呢,其实主要是通过优化网站的整体性能和资源使用来降低的。比如使用高效的服务器硬件、优化网站代码和图像资源、实施缓存策略等,都可以有效地减少服务器的能耗。