Vue3——首屏加载速度过慢解决方案

文章介绍了如何利用requestAnimationFrame和cancelAnimationFrame实现延迟函数,结合Vue3的ref和onUnmounted,控制组件渲染的帧数,以优化首屏加载速度。通过设置最大帧数,当达到特定帧数时执行特定操作,如显示登录表单和其他SVG元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

requestAnimationFrame和cancelAnimationFrame

requestAnimationFrame

与setTimeout相比,requestAnimationFrame最大的优势是由系统来决定回调函数的执行时机。具体一点讲,如果屏幕刷新率是60Hz,那么回调函数就每16.7ms被执行一次,如果刷新率是75Hz,那么这个时间间隔就变成了1000/75=13.3ms,换句话说就是,requestAnimationFrame的步伐跟着系统的刷新步伐走。它能保证回调函数在屏幕每一次的刷新间隔中只被执行一次

cancelAnimationFrame

取消一个先前通过调用window.requestAnimationFrame()方法添加到计划中的动画帧请求。

这里需要注意下兼容性:

在这里插入图片描述

import {ref,onUnmounted} from 'vue';
export function useDefer(maxCount = 100){
    const frameCount = ref(0);
    let rafId;
    function updateFrameCount(){
        rafId=requestAnimationFrame(()=>{
            frameCount.value ++;
            if (frameCount.value >= maxCount) {
                return;
            }
            updateFrameCount()
        })
    }
    updateFrameCount()
    onUnmounted(() => {
      cancelAnimationFrame(rafId)  
    })
    return function defer(n) {
        return frameCount.value >= n;
    }
}

用于实现一个延迟函数。具体来说,它使用了Vue 3中的ref和onUnmounted函数,以及JavaScript中的requestAnimationFrame和cancelAnimationFrame函数。
函数接受一个maxCount参数,用于指定最大的帧数。在函数内部,创建了一个frameCount ref对象,并定义了一个updateFrameCount函数,用于递增frameCount的值,并在达到maxCount时停止递增。updateFrameCount函数使用requestAnimationFrame函数来实现帧数的递增,并在达到maxCount时停止递增。

最后,函数返回一个defer函数,用于检查当前帧数是否达到指定的值n。如果达到了,defer函数返回true,否则返回false。在组件中使用defer函数可以实现一些需要延迟执行的操作,例如我们这里可以用到的首屏加载速度优化。同时,因为这里是使用了onUnmounted函数,可以确保在组件销毁时停止帧数的递增,也能避免内存泄漏和性能问题。
使用方法:我可以将此方法放入初始启动的页面中,例如登录(如果页面速度快的话可以不用,我这里是因为登录页面特效较多)

// 首屏优化处理方案
import {useDefer} from '@/utils/useDefer';
const defer = useDefer()
 <el-form ref="loginFormRef" v-if="defer(1)" :model="ruleForm" label-width="auto" :rules="rules">
	<el-form-item label="用户名" prop="username">
		<el-input v-model="ruleForm.username" clearable placeholder="请输入用户名" />
	</el-form-item>
	<el-form-item label="密码" prop="password">
		<el-input v-model="ruleForm.password" show-password placeholder="请输入密码" />
	</el-form-item>
	<el-row class="flex-button">
		<el-button plain type="primary" :loading="isLoading" @click="submitForm(loginFormRef)">登录</el-button>
		<el-button plain type="success" @click="resetForm(loginFormRef)">重置</el-button>
	</el-row>
</el-form>
<div class="svg" v-if="defer(2)"></div>
<div class="svg" v-if="defer(3)"></div>
<div class="svg" v-if="defer(4)"></div>
<div class="svg" v-if="defer(5)"></div>
<div class="svg" v-if="defer(6)"></div>
...
### 如何下载并安装 Vue 3 #### 使用 npm 或 yarn 安装 Vue 3 Vue 3 可通过 `npm` 或 `yarn` 进行安装,这是官方推荐的方式之一。以下是具体操作: 1. **确保 Node.js 和 npm 已经安装** 需要确认本地环境已正确配置 Node.js 和 npm。可以通过以下命令验证其版本号: ```bash node -v npm -v ``` 2. **使用 npm 安装 Vue CLI** 如果尚未安装 Vue CLI,则可以执行以下命令来全局安装它: ```bash npm install -g @vue/cli ``` 此外,如果之前已经安装过旧版本的 Vue CLI(如 1.x 或 2.x),建议先将其卸载以避免冲突[^3]: ```bash npm uninstall vue-cli -g ``` 3. **使用淘宝 NPM 镜像加速安装(可选)** 对于国内开发者来说,由于网络原因可能导致安装速度较,因此可以选择使用淘宝 NPM 镜像作为替代方案[^2]。设置方式如下: ```bash npm config set registry https://registry.npmmirror.com/ ``` 4. **验证 Vue CLI 版本** 成功安装后,可通过以下命令检查当前使用的 Vue CLI 是否为最新稳定版: ```bash vue --version ``` #### 创建一个新的 Vue 3 项目 完成上述步骤之后,即可基于 Vue CLI 初始化新项目。 1. **初始化项目结构** 执行以下命令启动交互式向导程序,按照提示输入相关信息来自动生成所需的文件夹和依赖项: ```bash vue create my-vue-app ``` 2. **手动选择功能模块(高级模式)** 当被询问是否启用预设配置时,可以选择 “Manually select features”,从而灵活定制开发环境中所需的功能组件,比如 TypeScript 支持、路由管理器以及状态管理模式 Vuex 等。 3. **进入项目目录并运行服务** 切换到刚刚创建好的工作空间路径下,并启动内置服务器以便实时调试效果: ```bash cd my-vue-app npm run serve ``` #### 基于 Vite 构建更高效的现代前端工程 除了传统的 Vue CLI 外,另一种新兴的选择是采用 Vite 来快速搭建现代化 JavaScript 应用程序骨架。相比 Webpack 而言,Vite 提供更快冷启动时间与热更新机制,在处理大型代码库时表现尤为突出。 1. **安装 Vite 并生成模板** 开始前需保证拥有最新的 Node.js LTS 发布分支;接着利用下面指令克隆官方样板仓库至本地磁盘位置处: ```bash npm create vite@latest my-vue3-app --template vue ``` 2. **切换至目标站点根部并激活依赖包加载流程** 推荐继续沿用 pnpm 或 Yarn 替代默认工具链实现更高性能的表现形式: ```bash cd my-vue3-app npm install # or &#39;pnpm i&#39; / &#39;yarn&#39; ``` 3. **测试部署成果展示页面** 启动本地实例化副本观察实际渲染状况: ```bash npm run dev # or &#39;pnpm dev&#39; / &#39;yarn dev&#39; ``` --- ### 总结 以上介绍了两种主流途径帮助用户顺利完成 Vue 3 的引入过程——无论是借助成熟的脚手架解决方案还是轻量级框架支持下的探索实践均能有效满足不同场景需求。希望这些指引对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Southern Wind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值