前端首屏渲染性能优化小技巧

` export default defineNuxtPlugin(() => { if (process.client) { const optimizeCSSLoading = () => { const links = Array.from(document.querySelectorAll('linkrel="stylesheet"')) as HTMLLinkElement\[\]

javascript 复制代码
  links.forEach((link) => {
    const href = link.getAttribute('href')
    if (!href) return
    
    if (href.includes('entry') && href.includes('.css')) {
      link.setAttribute('media', 'print')
      link.onload = function() {
        const linkElement = this as HTMLLinkElement
        linkElement.setAttribute('media', 'all')
      }
    }
  })
}

if (document.readyState === 'loading') {
  document.addEventListener('DOMContentLoaded', optimizeCSSLoading)
} else {
  setTimeout(optimizeCSSLoading, 0)
}

} }) `

plugins文件夹下创建async-css.client文件

vue3+ts+nuxt.js+sass+pina+vuetify+unocss+autoprefixer

这是一个用于优化 CSS 加载性能的 Nuxt 插件。 async-css.client.ts 实现了"异步 CSS 加载"优化,用于提升首屏渲染

工作原理

  1. 查找入口 CSS 文件:查找所有包含 entry 和 .css 的样式表链接(通常是 Nuxt 生成的入口 CSS)。
  2. 临时设置为打印媒体:将这些 CSS 的 media 属性设为 print,使其不阻塞渲染。
  3. 加载完成后恢复:CSS 加载完成后,将 media 改回 all,样式生效。

为什么这样做?

  • 问题:CSS 是渲染阻塞资源,会阻塞页面渲染,导致白屏。
  • 解决:通过 media="print" 让浏览器异步加载,不阻塞渲染,加载完成后再应用样式。

注意事项

  • 优点:减少首屏阻塞,提升 FCP/LCP。
  • 风险:可能出现短暂无样式(FOUC),但通常不明显。

建议

如果遇到样式闪烁或加载问题,可以:

  1. 移除该插件(删除文件)
  2. 或调整逻辑,只对非关键 CSS 应用此优化
相关推荐
古茗前端团队40 分钟前
由 key 引发的思考
前端·javascript·react.js
kyriewen1 小时前
我扫了 422 个仓库,近一半 CI 在裸装依赖
前端·javascript·程序员
鹏多多1 小时前
AI 到底能不能独立做个产品?我拿一个小程序验证了
前端·微信小程序·ai编程
火山引擎开发者社区1 小时前
构建专属的飞书群开发助手,AgentKit Studio 一键部署 DeepSeek Harness Super-Agent
前端
啾咪orJIUMI3 小时前
Vue 3 + 高德地图封装实战:点位、区域、Loca 流光与 Vue 信息窗体
前端·vue.js
掘金者阿豪3 小时前
AI数据库不只是向量检索:从数据语义到库内智能计算的技术演进
前端
梦里寻码4 小时前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
FRing034 小时前
vue2干货总结8(路由模块封装、router-link、声明式导航、路由重定向、编程式导航)
开发语言·前端·vue.js·vue2
SameX4 小时前
HarmonyOS ArkUI Dialog 复用 用 @CustomDialog + enum type 做多类型统一管理的做法
前端
AiMan4 小时前
豆包爱学还是不可以导出左侧所有对话,只能单容导出,方法不对吗
前端