网站打开速度慢,用户大概率会直接关掉页面,搜索引擎给出的排名也会随之下降。性能优化并非玄学,而是有章可循的工程实践。本文围绕资源加载、渲染路径、缓存利用和后端响应四个维度,拆解那些能立刻用起来的优化动作。
用户等待时间的长短,很大程度取决于图片、脚本和样式表如何被送达。压缩是第一步:图片优先使用 WebP 格式,画质几乎无损但体积往往能缩小一半以上;CSS 与 JavaScript 文件通过构建工具(如 Vite 或 Webpack)去除空白和冗余注释,并把多个小文件合理合并。
懒加载同样重要。给首屏之外的图片、视频加上 loading="lazy" 属性,让它们等到用户快滚动到附近时才开始下载。但要记住,首屏内的关键视觉元素绝不能懒加载,否则会直接拉长初始绘制时间。
判断标准很简单:打开开发者工具的 Network 面板,看瀑布图里是否有某个大文件长时间霸占带宽。若发现阻塞,就把它拆小或者改为异步加载。一个常见误区是把所有 JS 合并成一个巨型文件,反而拖累首屏解析,按路由或功能拆分才是更稳妥的选择。
从服务器返回 HTML 到屏幕上出现第一个像素,这段路径越短,用户感知的速度就越快。最大的阻碍往往是同步加载的 CSS 和 JavaScript。策略上,把首屏必需的少量关键样式直接内联进 HTML,其余的通过异步方式加载;脚本则尽量放到 body 底部,并利用 defer 或 async 属性控制执行时机。
defer 会等 DOM 解析完再顺序执行,适合操作页面元素的脚本;async 下载完就立即执行且不保证顺序,适合百度统计这类独立代码。动用 Lighthouse 跑一遍,重点看“消除阻塞渲染的资源”和 FCP(首次内容绘制)指标,理想状态应小于 2 秒。内联样式务必克制,一旦超过几十千字节,反而会拖慢首个字节的送达。
将静态资源放到内容分发网络的边缘节点,用户就能从最近的机房取数据,省去跨地域的长途传输。配置 CDN 时,要确保源站返回 ETag 或 Last-Modified 响应头,并配合 Cache-Control 设定合理的缓存时长:图片、字体这类几乎不变的资源可以缓存七天以上,接口响应则控制在几分钟内。
对于动态页面,可以用 Nginx 或 Varnish 做整页缓存,把未登录用户看到的首页或列表页在内存里存一份,命中后直接返回,不用再去查数据库。务必设计好缓存清理机制,例如文章发布或编辑时自动删除对应页面的缓存副本。
避坑提示:购物车、个人中心这类含用户隐私的页面绝不能做公开缓存,否则轻则显示错乱数据,重则泄露他人信息。想验证缓存是否生效,看响应头里的 X-Cache 字段是否返回了 HIT。
服务器处理请求的耗时决定了 TTFB(首字节时间)。先从数据库入手:开启慢查询日志找出耗时最长的 SQL,为高频使用的过滤条件和关联字段添加索引,写查询时避免使用 SELECT *,只取真正用到的列。对于产品详情这类热点数据,还可以在应用层加一层 Redis 或 Memcached 缓存,避免每次请求都穿透到数据库。
另一个思路是页面静态化。访问量大但内容变动不频繁的页面(如活动公告),可以在发布时直接生成静态 HTML 文件,由 Web 服务器直接吐出,省去后端渲染和数据库查询的过程。
先确认是否清空了强缓存再测试,否则浏览器可能直接读取本地副本。其次,把优化前后的指标放在同一网络环境和设备下对比,优先用 Lighthouse 或 PageSpeed Insights 跑一遍,找到当前得分最低的优化项,而不是盲目堆砌手段。
WebP 在同等画质下体积更小,适合照片和复杂渐变背景:JPEG 在兼容性和编辑软件支持上更成熟。若用户群使用较老系统,需要准备 JPEG 作为降级方案。通过 picture 标签进行适配,浏览器会自动选择最合适的格式。
没有统一的答案。静态资源可设长一点,例如图片和字体设七天到三十天;但 CSS 和 JS 文件如果频繁改动,建议文件名带上内容哈希,这样内容更新时就会生成新的文件,缓存自然失效,无需担心用户拿到旧代码。接口数据则控制在几秒到几分钟内比较安全。
性能优化不是一次性的项目,而是持续迭代的过程。优先处理影响最大的环节:先压缩和拆分静态资源,再理顺渲染路径,接着接入 CDN 和缓存,最后优化数据库查询。每次改动后用真实用户指标(如 LCP、INP)做前后对比,把有限的时间投入在收益最明显的瓶颈上。从最小的改动开始,逐步建立起自己站点的性能基准线,体验提升会随着时间积累显现出来。