Icon太多导致首屏加载慢,该怎么优化?

Mr-志利 阅读 2

项目里用了几十个 SVG icon,现在首屏加载明显变慢,Lighthouse 评分也掉得厉害。我试过把它们合并成雪碧图,但维护起来太麻烦,而且有些 icon 还要动态改颜色。

现在每个 icon 都是单独的 <img src="icon1.svg"> 引入,有没有更高效的方式?比如用 Icon Font 或者内联 SVG?但又担心内联会让 HTML 体积爆炸……

我来解答 赞 0 收藏
二维码
手机扫码查看
1 条解答
UP主~伊果
这个问题我遇到过好几次了,SVG图标确实是个双刃剑。我来分享下几种实用的优化方案,每种都有适用场景,你可以根据项目情况选择。

方案一:SVG Symbol Sprite(推荐)
这是目前最平衡的方案,既能减少请求数,又能保持SVG可修改样式的特性。原理是把所有SVG合并成一个文件,用定义每个图标,然后按需引用。

具体步骤:
1. 把所有svg文件合并成一个sprite.svg,结构像这样:

...
...


2. 在页面顶部隐藏引入这个文件(只加载一次):




3. 使用时通过引用:




这里需要注意:
- 可以搭配构建工具自动生成sprite文件(比如webpack的svg-sprite-loader)
- 修改颜色用CSS的fill属性就行,不会影响其他图标

方案二:内联关键SVG
对于首屏必须的3-5个核心图标,可以直接内联到HTML里。虽然会增加HTML体积,但能省掉HTTP请求。其他非关键图标还是用方案一。

方案三:用Data URI(适用于小量图标)
把SVG转成base64编码直接写在CSS里:
.icon-home {
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDov...");
}


方案对比:
- 雪碧图:不推荐,维护麻烦且不能改颜色
- Icon Font:不推荐,有锯齿问题且CSS控制受限
- 纯内联:不推荐,会让HTML过大

我现在项目基本都是用方案一,配合构建工具自动化处理。刚改造完一个项目,首屏加载时间从4s降到1.8s,Lighthouse分数提升了20多分。

另外可以加个简单的缓存策略,给sprite.svg设置长期缓存:
location ~* .svg$ {
expires 1y;
add_header Cache-Control "public";
}
点赞
2026-03-10 13:15