别用 all.css 和全量 fontawesome.js——90% 性能问题源于此;仅引入实际使用的图标类型(solid/brands)、改用 svg with javascript、避免 fa-spin 隐性开销、配好缓存与预加载。

直接结论:别用 all.css,也别全量引入 fontawesome.js —— 90% 的性能问题都出在这一步。
只加载实际用到的图标类型(solid/regular/brands)
Font Awesome 的图标按语义分三类,每类对应独立 CSS 文件。全量加载 all.min.css(约 150KB+)等于把没用的图标也拖进页面。
- 如果只用实心图标(比如
fa-home、fa-user),就只引入css/solid.min.css - 若还用品牌图标(如
fa-github、fa-twitter),再加一个css/brands.min.css - 避免同时引入
solid.css和regular.css,除非真有线框+实心混用场景
这个动作能立刻砍掉 60–80% 的 CSS 体积,且无需改 HTML class 写法。
用 SVG with JavaScript 替代 Web Font 方案
Web Font 加载会触发 FOIT(空白闪动),而 SVG 是 DOM 元素,可控制加载时机、支持 Tree-shaking。
- 引入最小运行时:
js/fontawesome.min.js - 只导入项目真正用到的图标,例如:
import { faSearch, faBell } from '@fortawesome/free-solid-svg-icons' - 调用
library.add()注册,后续用<fa-icon :icon="['fas', 'search']"></fa-icon>(Vue)或等价写法
构建工具(Vite/Webpack)会自动剔除未引用的图标代码 —— 这比任何手动子集化都可靠。
警惕 fa-spin 类带来的隐性开销
fa-spin 看似只是个旋转动画,但它依赖 @keyframes fa-spin,而该关键帧定义在完整 CSS 包里。如果你只引入了 solid.min.css,但 HTML 里写了 fa-spin,浏览器仍会尝试渲染动画,却因缺少关键帧而降级为 layout thrashing。
- 确保动画类所依赖的 CSS 已加载:要么统一用
all.min.css(不推荐),要么把css/animated.min.css单独引入 - 更轻量的替代方案:用纯 CSS 实现旋转,例如
transform: rotate(360deg); animation: rotate 1s linear infinite; - 弱网下慎用多个
fa-spin同时存在,CPU 占用会明显上升
动画不是免费的 —— 它不增加体积,但会持续消耗渲染线程,尤其在低端移动设备上。
缓存策略和预加载不能跳过
即使你精简了资源,没配好缓存,用户每次访问还是得重新下载。
- 给 Font Awesome 静态资源配
Cache-Control: public, max-age=31536000(1 年),并启用文件哈希(如solid.abc123.min.css) - 关键图标 CSS 加
<link rel="preload" href="css/solid.min.css" as="style">,避免阻塞渲染 - 不要把图标 JS 放在
底部 —— 它会影响首屏图标渲染时机
最常被忽略的一点:CDN 返回的字体文件(OTF/WOFF2)如果没有正确设置 crossorigin 属性,document.fonts.load() 检测会失败,导致你写的加载状态逻辑完全失效。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











