影响网站打开速度的因素很多,可以分成几大类:服务器、网络、页面本身、前端资源和第三方服务。下面按“从最常见到较隐蔽”的顺序给你列出来,并简单说明怎么优化。
表现:访问人数稍多就变慢甚至 502、504。
典型原因:
虚拟主机/低配 VPS(CPU、内存太低)
数据库与应用挤在同一台低配机器上
优化:
升级配置(CPU、内存、磁盘 IOPS)
分离数据库、应用服务器
使用弹性扩容(云服务器、容器)
中国用户访问海外机房、海外用户访问国内机房,中间网络链路长、容易抖动。
优化:
按主要访客地区选择机房(例如做英文站选美国/欧洲/新加坡)
必备:使用 CDN(Cloudflare、Akamai、国内 CDN 等)
传统机械硬盘 I/O 慢,大量并发请求时明显拖慢响应。
优化:
必选 SSD 或 NVMe
关闭或优化大量频繁写日志/缓存到磁盘的行为
所有用户请求都直连源站,海外访问、跨运营商访问容易很慢。
优化:
使用 CDN 做静态资源加速(JS/CSS/图片/视频)
开启 HTTP/2、HTTP/3(CDN 一般支持,浏览器多已支持)
并发访客一多,就挤爆带宽,速度明显下降。
优化:
增大服务器或 CDN 出口带宽
对大文件(视频、下载)单独用对象存储/专门 CDN
未开启 GZIP/Brotli 压缩:HTML/JS/CSS 体积过大;
没设置浏览器缓存头,用户每次都要全量重新请求。
优化:
静态资源(hash 版本的 JS/CSS/图片):cache-control: public, max-age=31536000, immutable
HTML:通常短时间缓存或不缓存,以保证内容更新
服务器或 CDN 开启 GZIP/Brotli 压缩
设置合理的 Cache-Control / Expires 头:
页面要查询很多表、多次远程接口、复杂计算。
典型症状:TTFB(首字节时间)> 500ms 甚至几秒。
优化:
分析慢查询,给数据库加索引
对不常变的数据做缓存(内存缓存:Redis、Memcached)
减少一个请求里需要完成的逻辑(拆分任务)
单表数据量大但没有合适索引,查询时全表扫描。
优化:
使用 EXPLAIN 分析 SQL
对 WHERE / JOIN / ORDER BY 涉及的字段加索引
定期归档历史数据,避免单表无限增大
每次访问都重新渲染模板、查询多张表。
优化:
对文章页、产品页等相对稳定内容启用 页面缓存 / 静态化
只对需要实时更新的部分走动态渲染
这是大多数站点“慢”的直观原因之一。
一堆无意义的嵌套标签、重复 DOM、内联样式;
服务器返回的 HTML 就 300KB+、几 MB。
优化:
精简 DOM 结构
使用模板组件抽象,避免重复 HTML 片段
对不需要首屏出现的模块懒加载
一个页面加载几十个 JS 文件,总体几 MB 以上;
阻塞渲染,JS 执行时间长。
优化:
合并 & 压缩 JS(打包工具:Webpack、Vite、Rollup 等)
拆分按需加载(code splitting)
延迟加载非必要脚本:defer / async
能用 CSS/HTML 解决的交互不要一定上 JS
多套样式、多个框架混用(Bootstrap + Tailwind + 自定义),大量无用 CSS。
优化:
压缩 CSS
使用 PurgeCSS 等工具删除未使用的样式
避免重复引入多个 UI 框架
常见:Banner、轮播图、产品图动辄 1–3MB。
优化:
使用现代格式:WebP、AVIF(兼容时降级到 JPEG/PNG)
通过工具或服务自动压缩(TinyPNG、Squoosh、CI/CD 压图)
控制分辨率:按实际展示大小生成图,不要用 4000px 图缩小展示
首屏只显示部分图片却一次性加载整页所有图片。
优化:
使用 loading="lazy"(现代浏览器原生支持)
对轮播、瀑布流使用 IntersectionObserver 懒加载
自己服务器直传大视频,访客一进来就开始加载。
优化:
用专业视频平台(YouTube、Bilibili、自建流媒体)+ 预览图
仅在用户点击播放时加载视频流
各种:Google Analytics、广告脚本、在线客服、分享按钮、热力图、A/B 测试……
每个都增加 DNS 查询、HTTP 请求、JS 执行时间。
优化:
严格控制数量:能不用的就不用,能合并的合并
对非关键脚本使用延迟加载 / 在用户交互后再加载
尽量使用同一 CDN/同一域的资源,减少 DNS 查询
页面加载时要等待第三方 API 返回数据;
该 API 若在国内/本地区不稳定,会拖死整个页面。
优化:
必须同步依赖的接口尽量放在自己可控的后端,由后端做缓存
能异步加载和延迟展示的就不要在首屏阻塞
没开启 HTTP/2/HTTP/3,仍然只有 HTTP/1.1;
TLS 握手次数过多、证书链过长。
优化:
在服务器/CDN 上开启 HTTP/2/HTTP/3
保持证书链短、配置合理的 TLS(如使用 Let’s Encrypt/主流 CA 默认配置)
访问一个 URL 时,经历:
http:// → https://
www. → 非 www.(或反过来)
再跳一次语言/地区路径
每次 301/302 都增加往返时间。
优化:
统一 URL 策略,最多只保留一次必要的重定向
站内链接尽量直接用最终 URL
整个站都用 SPA(Vue/React 单页应用),需要下载 JS、执行、再生成 DOM。
首屏内容迟迟不出现,感觉很慢。
优化:
对主要页面使用 SSR(服务端渲染)或 SSG(预渲染/静态生成)
首屏尽量少依赖大体积 JS
滚动动画、视差、Canvas、WebGL 等大量使用。
低端设备 CPU/GPU 压力大,卡顿明显。
优化:
避免无意义的重型动画
在移动端降级特效
给你一个简单排查流程:
用 Lighthouse / PageSpeed Insights 测试
TTFB(服务器首字节时间)
LCP(最大内容渲染时间)
JS 执行时间、资源体积
查看:
用浏览器开发者工具(Network 面板)
最先慢的是哪一块?DNS?等待(TTFB)?下载?
是否有单个 JS/CSS/图片文件异常大或加载耗时极长?
看瀑布图:
服务器监控
看 CPU、内存、磁盘 IO、网络带宽是否在高峰被打满;
判断是“后端算不动”还是“网络/带宽不够”。
你可以按这个顺序一条条自查:
服务器:
SSD?配置够用?机房离主要用户近吗?
CDN:
是否启用?是否启用 HTTP/2/3 和压缩?
页面体积:
HTML/JS/CSS/图片总大小控制在合理范围内(一般首屏 < 1–2MB 更好)。
图片与视频:
是否压缩、懒加载?是否用了 WebP/AVIF?
JS & CSS:
是否合并、压缩、按需加载?是否清理了未使用样式?
第三方:
统计/广告/聊天等脚本有没有过多?能删的删、能延迟的延迟。
缓存:
浏览器缓存策略设置了吗?页面/接口有没有适当缓存?
后端:
是否有慢查询?是否用了页面缓存/数据缓存?