一、核心逻辑拆解
1. 条件判断:是否为移动端
if (window.innerWidth <= 768) { ... }
- 通过
window.innerWidth获取浏览器窗口宽度,判断是否为移动端(通常认为宽度 ≤ 768px 为移动设备)。
2. 延迟加载实现
await new Promise(resolve => setTimeout(resolve, 100));
- 创建一个 Promise,使用
setTimeout延迟 100 毫秒后 resolve。 await关键字暂停函数执行,直到 Promise 完成(即 100ms 后)。
二、为什么要延迟加载?
-
移动端性能优化
- 编辑器通常是重型组件(如富文本编辑器),初始化可能消耗较多资源。
- 延迟 100ms 可让页面优先渲染核心内容(如文字、图片),避免用户长时间等待“白屏”。
-
用户体验优化
- 移动端网络和设备性能通常较弱,延迟加载可减少首屏加载时间。
- 100ms 是一个经验值:既不会让用户感知到明显延迟,又能为关键资源争取加载时间。
三、完整代码示例
const loadEditor = async () => {
if (window.innerWidth <= 768) {
// 移动端延迟加载(先渲染页面其他内容)
await new Promise(resolve => setTimeout(resolve, 100));
}
// 加载编辑器组件(如 CKEditor、TinyMCE 等)
const editor = await import('@/components/Editor.vue');
// 或直接初始化编辑器
initEditor();
};
// 在组件挂载后调用
onMounted(() => {
loadEditor();
});
四、其他常见延迟加载场景
-
非关键资源加载
- 如广告组件、统计脚本等,不影响核心功能的资源可延迟加载。
-
按需加载
- 如用户滚动到特定区域时再加载相关组件(懒加载)。
-
避免阻塞主线程
- 复杂计算或大数据处理可通过
setTimeout拆分成小块执行。
- 复杂计算或大数据处理可通过
五、优化建议
-
动态调整延迟时间
- 根据设备性能或网络状况动态调整延迟时间(如 3G 网络延迟更久)。
-
结合骨架屏
- 在延迟期间显示骨架屏(Skeleton Screen),提升用户感知体验。
-
使用 Intersection Observer
- 对于长页面,可在编辑器组件进入视口时再加载,而非固定延迟。
总结
这段代码的核心是在移动端环境下,通过短暂延迟(100ms)优化编辑器组件的加载时机,平衡了页面加载速度和用户体验。这是前端性能优化的常见技巧,尤其适用于资源密集型组件。