当前位置: 首页 > news >正文

Web 性能优化四:资源体积压缩与加载策略详解:JS / CSS / 图片 / 字体怎么减负?

你页面加载慢,控制台一看,发现:

  • JS 文件 1.2MB

  • 图片加载 2s+

  • 字体压根没用几种字,但文件 400KB

  • 有些模块压根没用,却被打包进首页了

你不是“代码写得慢”,是“资源拖你后腿”。

本篇文章,我们就来一场“前端页面瘦身计划”:

系统讲清 JS / CSS / 图片 / 字体 等资源的优化方法和加载策略,全面提速页面加载体验。

一、JS 体积优化策略

Tree Shaking

  • 自动移除未使用的模块、函数(需使用 ESModule)

  • 工具:Webpack、Rollup、Vite 原生支持

提示:

  • 避免使用 require() 和动态导入路径

  • 使用 lodash-es 替代 lodash,支持按需打包

Code Splitting(代码拆包)

  • 按页面/路由/组件分离代码,避免首屏加载全部 JS

const Editor = React.lazy(() => import('./Editor'));

 页面中按需加载,不加载就不打包。

第三方库优化

场景

替代建议

日期处理

moment.js → dayjs、date-fns

请求库

axios → fetch 或 ky

工具函数

lodash → lodash-es / 自己写

 减少“用了 1 个方法,打包进整个库”的情况。

二、CSS 优化策略

按需加载 + 局部样式

  • 避免引入整个 UI 框架 CSS(如 import 'ant-design.css')

  • 拆分为模块 CSS 或按路由 lazy load

  • 支持样式隔离的 CSS-in-JS 方案如 styled-components、emotion

Unused CSS 清理

  • 工具:PurgeCSS、unplugin-unused-css、tailwind purge 模式

  • 剔除构建产物中未被使用的 CSS 类名,极大减少体积

特别适用于 Tailwind / Utility-first 项目

Critical CSS(关键 CSS 内联)

  • 将首屏必需样式直接插入 <style>,减少阻塞渲染

配合 SSR / SSG 架构效果最佳,如 Next.js、Nuxt.js

三、图片资源优化策略

图片格式选择

格式

特点

适合场景

WebP

体积小、支持透明

通用图像

AVIF

更小、更清晰

静态图、高质量场景

SVG

矢量图、不失真

图标、插图、LOGO

JPG/PNG

老牌支持广

兼容性兜底

使用 srcset + picture 提供格式兼容:

<picture><source srcset="image.avif" type="image/avif" /><source srcset="image.webp" type="image/webp" /><img src="image.jpg" alt="图" />
</picture>

懒加载 + 占位

  • 使用 loading="lazy" 原生支持

  • 配合渐进图片/模糊占位(如 LQIP、blurhash)

四、字体加载优化

字体子集化(Subset)

  • 用工具如 Fontmin、glyphhanger 只保留用到的字符

  • 可以将中文字体从 3MB 减至几十 KB

字体加载顺序优化

<link rel="preload" as="font" href="/fonts/main.woff2" type="font/woff2" crossorigin />
  • 加快字体下载,避免 FOIT(字体空白)

  • 配置 font-display: swap 提前展示备用字体

五、加载顺序与策略建议

资源类型

加载方式

优化建议

JS 脚本

defer / async

非关键 JS 延后执行,关键 JS defer 排序加载

CSS

外链 + preload

关键 CSS 提前加载,非首屏延迟加载

图片

lazy + 预加载

首屏 preload,非首屏 lazy

字体

preload + swap

子集优化 + 抢占加载顺序

 总结:资源优化 = “不加载、少加载、慢加载、压缩加载”

性能优化不是“把所有东西塞得更快”,而是:

  • 能不加载就别加载(懒加载)

  • 要加载就压缩加载(Tree Shaking、图片格式)

  • 加载顺序别乱套(关键先来)

  • 不可控的就兜底(字体、图片占位)

相关文章:

  • 风扇接口
  • 0基础 | L298N电机驱动模块 | 使用指南
  • C语言常见的文件操作函数总结
  • QSS样式表的选择器
  • iVX 图形化编程平台:结合 AI 原生开发的革新与实践
  • 模块化编程
  • 【问题】Watt加速github访问速度:好用[特殊字符]
  • ACM模式手动构建二叉树
  • 精读计算机体系结构基础 第三章 特权指令系统
  • 使用 SHAP 进行特征交互检测:揭示变量之间的复杂依赖关系
  • 豆包:国内 web 辅助开发的领头羊
  • 以党建网为例,深入分析IT技术栈,实战经验
  • 基于多层权重博弈与广播机制的仿生类脑 AI 决策框架
  • 文件(分片)并行上传时计算总的上传进度
  • Linux基础开发工具一(yum/apt ,vim)
  • C++内存管理详解
  • ES 面试题系列「二」
  • HTML难点小记:一些简单标签的使用逻辑和实用化
  • 49.EFT测试与静电测试环境和干扰特征分析
  • RS485和RS232 通信配置
  • 西王食品连亏三年:主业齐“崩”,研发人员多为专科生
  • 沈阳一超市疑借领养名义烹食流浪狗,当地市监局:已收到多起投诉
  • 山东鄄城发生一起交通事故,造成4人死亡、2人受伤
  • 长沙查处疑似非法代孕:有人企图跳窗,有女子被麻醉躺手术台
  • 被流量绑架人生,《人生开门红》能戳破网络时代的幻象吗
  • 竞彩湃|德甲欧冠资格竞争白热化,伯恩茅斯主场迎恶战