---
title: "静态网站国内访问慢怎么办：先诊断再改善，GitHub Pages、Vercel、Cloudflare Pages 通用"
description: "静态网站国内访问慢，先拆开 DNS、TLS、首字节和第三方资源各自的耗时，再决定改什么。附 curl 计时命令、Network 面板判读表、合规改善步骤，以及境内节点必须 ICP 备案的边界。"
url: https://cdnping.org/blog/static-site-slow-in-china-diagnose
language: zh-CN
published: 2026-10-24
category: "性能"
tags: ["静态网站","网站性能","CDN","ICP备案","前端优化"]
source: cdnping.org
license: Free to quote and summarize with a link to the url above.
---
# 静态网站国内访问慢怎么办：先诊断再改善，GitHub Pages、Vercel、Cloudflare Pages 通用

静态网站国内访问慢，很多时候慢的不是托管平台本身，而是页面里引用的外部资源：境外字体、统计脚本、公共 CDN 上的 JS 库。动手改之前，先把一次页面加载拆成 DNS、TLS 握手、首字节、资源下载几段，看清时间花在哪一段，再对症处理。如果确实需要中国大陆境内的节点，就要办 ICP 备案，并且通过持证服务商接入，这一步没有合规的捷径。

下面的步骤对 GitHub Pages、Vercel、Cloudflare Pages 和其他静态托管都适用。本文不讨论“优选 IP”、改 hosts 指向非官方节点这类做法：它们效果不稳定，也可能违反平台条款。

## 为什么“换个平台”往往解决不了问题？

网上 2020–2024 年的帖子结论经常互相矛盾，一篇说某平台快，另一篇说慢。原因很简单：测试者的运营商、地区、时间段不同，而且大多数人只看了“整页打开用了几秒”，没有分段。

一个典型的博客页面，加载过程大致是：

1. 解析你的域名（DNS）
2. 和托管平台的边缘节点建立 TCP 与 TLS 连接
3. 等服务器返回 HTML 的第一个字节（TTFB）
4. 下载 HTML，再并发请求 CSS、JS、图片、字体
5. 加载第三方域名上的资源，每个新域名都要重复第 1、2 步

第 5 步往往最慢。主题模板里自带的字体链接、评论系统、统计代码，各自连一个境外域名，只要其中一个阻塞渲染，页面就会白屏好几秒。这时候换托管平台不会有改善，因为慢的那个请求根本不发往托管平台。

## 第一步：用浏览器 Network 面板看是哪个请求慢

用国内直连网络（关掉代理和加速工具）打开 Chrome 或 Edge 的开发者工具：

1. 打开 Network 面板，勾选 Disable cache。
2. 刷新页面，等加载结束。
3. 看 Waterfall 列里哪几条横条最长。
4. 点开最慢的请求，切到 Timing 标签。

Timing 里的字段可以这样判读：

| Timing 字段 | 含义 | 这一项长说明什么 |
|---|---|---|
| Queueing / Stalled | 浏览器排队等待 | 同域名并发过多，或前面有阻塞资源 |
| DNS Lookup | 域名解析 | 解析服务器远、解析结果异常，或域名解析本身受干扰 |
| Initial connection / SSL | TCP + TLS 握手 | 到边缘节点的网络路径长或丢包 |
| Waiting for server response (TTFB) | 首字节等待 | 回源慢、边缘缓存未命中，或节点离你远 |
| Content Download | 内容下载 | 文件太大，或链路带宽受限 |

有两种情况要特别留意：

- **请求一直 pending，最后失败或超时**：通常是这个域名在你的网络下无法连通。如果它是 `<head>` 里同步加载的 CSS 或 JS，整页都会被拖住。
- **主 HTML 很快，但页面迟迟不显示**：多半是渲染阻塞资源（字体、外链 CSS、同步脚本）的问题，和托管平台无关。

测之前，最好先确认自己确实是国内直连。如果系统里开着全局代理或分流规则，测到的是代理出口的情况。可以用 [/ip](/ip) 的大陆分流检测看当前属于“国内直连”“大陆分流”还是“全局代理”，原理见[国内网站如何看到你的真实 IP](/blog/how-chinese-sites-see-your-real-ip)。

## 第二步：用命令行把主站的时间拆开

Network 面板受浏览器缓存、扩展和连接复用影响。对主站域名，可以用 curl 再测一次，排除这些干扰：

```bash
curl -o /dev/null -s -w \
'DNS:      %{time_namelookup}s\nConnect:  %{time_connect}s\nTLS:      %{time_appconnect}s\nTTFB:     %{time_starttransfer}s\nTotal:    %{time_total}s\nHTTP:     %{http_code}\nIP:       %{remote_ip}\n' \
https://your-blog.example.com/
```

这几个值是累计时间，相邻两项相减才是单段耗时：

- `Connect - DNS` 约等于一次 TCP 往返
- `TLS - Connect` 是 TLS 握手
- `TTFB - TLS` 是发出请求到收到第一个字节的时间，包含一次网络往返和服务器（或边缘缓存）的处理时间

建议在不同时段多跑几次（例如上午和晚高峰各测 5 次），只看一次的结果容易被偶然的波动误导。

再看解析结果是否正常：

```bash
dig +short your-blog.example.com
dig +short your-blog.example.com @223.5.5.5
dig +short your-blog.example.com @1.1.1.1
```

如果不同解析服务器给出的地址差别很大，或者返回了明显不属于托管平台的地址，就要先排查解析问题，方法见 [DNS 污染和 DNS 劫持有什么区别](/blog/dns-pollution-vs-hijacking-detect)。如果握手阶段特别慢、偶尔超时，可以用 mtr 看路径上哪一段开始出现丢包，读法见 [traceroute 和 mtr 结果怎么看](/blog/traceroute-mtr-how-to-read)。

## 第三步：对照第三方资源，看看是不是它们拖慢的

在 Network 面板的表头上右键，勾选 Domain 列，再按这一列排序，就能看到页面引用了哪些外部域名。常见的几类：

- 网页字体：主题模板默认引用的境外字体服务，在大陆网络下经常加载很慢甚至失败。
- 公共前端 CDN：jsDelivr、unpkg、cdnjs 这类公共 CDN 上的库文件，在国内的可用性和速度会随时间变化。
- 统计与广告脚本：境外统计服务的脚本通常不阻塞渲染，但会占连接，也会拖慢 `load` 事件。
- 评论系统、嵌入内容：评论框、视频、社交分享按钮，有时会在首屏同步加载。

公共前端 CDN 在你所在网络的表现，可以直接在 [cdnping 在线测速](/) 里看。它在浏览器里测 9 个公共前端 CDN，给出两个指标：

- 首次连接：包含 DNS 解析和 TLS 握手，对应用户第一次访问时的体验；
- 往返：连接复用后 3 次请求的中位数，对应同一页面里后续资源的加载。

首次连接很慢但往返正常，说明问题主要出在解析或握手，资源合并到少数几个域名、减少新连接就能改善；两个指标都慢，说明这条线路本身质量差，应该换源或自托管。更多数据可以看 [CDN 速度榜](/benchmark/cdn)，选型的思路见[如何选择适合国内访问的公共 CDN](/learn/choose-public-cdn-china)。

## 诊断结果对照表：慢在哪，就改哪

| 诊断现象 | 大概率原因 | 优先尝试的做法 |
|---|---|---|
| 某个第三方请求 pending 后失败，页面白屏 | 外部资源在当前网络不可达，且阻塞渲染 | 自托管该资源，或改成异步加载 |
| 字体请求很慢，文字迟迟不出现 | 境外字体服务慢 | 字体文件放到自己站点下，加 `font-display: swap`，按需子集化 |
| 公共 CDN 上的 JS 库慢 | 公共 CDN 在当前网络表现差 | 换成测速结果更好的源，或打包进自己的构建产物 |
| 主站 DNS 解析慢或结果异常 | 解析链路问题 | 检查 DNS 记录和解析服务商，参考 DNS 排查文章 |
| 主站 TLS 握手慢、TTFB 高 | 到托管平台边缘节点的路径长 | 绑定自定义域名、提高缓存命中率；仍不够再考虑境内节点（需备案） |
| 重复访问依然很慢 | 缓存头没配好，每次都重新下载 | 给带哈希的静态文件设长缓存 |
| 大图片下载时间长 | 图片体积大 | 压缩、转 WebP/AVIF、按屏幕尺寸输出 |

## 不需要备案就能做的改善

这些改动只涉及你自己的代码和配置，在任何托管平台上都能做：

### 1. 把外部依赖收回到自己的域名下

字体、图标库、JS 库下载到仓库里，跟着站点一起部署。这样页面只需要连一个域名，少了好几次 DNS 和 TLS 握手，也不会被某个第三方拖住。注意遵守字体和库的许可证。

### 2. 让渲染不再被阻塞

非关键脚本加 `defer` 或 `async`；统计、评论这类组件放在首屏渲染之后再加载；首屏用到的关键 CSS 可以内联到 HTML 里。

### 3. 配好缓存头

构建工具生成的带内容哈希的文件（如 `app.3f9a1c.js`）可以设 `Cache-Control: public, max-age=31536000, immutable`；HTML 本身设短缓存或 `no-cache`，保证更新能及时生效。各个指令的区别见 [Cache-Control 缓存头怎么配](/blog/cache-control-headers-guide-cdn)。大多数静态托管平台都支持在配置文件里写响应头，具体写法以平台官方文档为准。

### 4. 绑定自定义域名

用自己的域名，以后想换托管平台或接入 CDN 时，只要改 DNS 记录，不用改站内链接和外部引用。如果在托管平台前面再套一层 CDN，要注意 SSL 模式配置，否则容易出现重定向循环，参考 [Cloudflare 重定向次数过多怎么解决](/blog/cloudflare-too-many-redirects-ssl-mode)。

### 5. 减小资源体积

压缩图片，删掉主题里没用的 JS，开启 Brotli 或 gzip（多数平台默认开启，可以在响应头的 `content-encoding` 里确认）。

做完以后，用同一网络、同一时段再跑一遍第二步的 curl 和第一步的 Network 面板，前后对比，确认改动确实有效。

## 什么时候需要境内节点？备案的边界在哪里

如果第三方资源都已经处理干净，主站的 TLS 握手和首字节在国内依然明显偏慢，那么剩下的瓶颈就是物理距离和跨境线路。这一段靠前端优化解决不了，只能让内容由离用户更近的节点提供。

这里有一条明确的边界：在中国大陆境内的服务器或 CDN 节点上提供网站服务，需要先办 ICP 备案，并且要通过持有相应资质的服务商接入。 境外托管平台和境外 CDN 的“亚太节点”通常部署在大陆以外，离用户近一些，但并不等于境内加速。

可以这样判断：

- 个人博客、文档站：多数时候前面那些不备案的改善已经够用。
- 面向国内用户的业务站、对首屏时间有明确要求的站点：建议评估备案，再选用持证服务商的境内 CDN。

cdnping 的 [Edge 边缘加速介绍页](/edge)也写明了这一点：它基于 Cloudflare 全球网络提供边缘加速，而中国大陆境内的加速同样需要 ICP 备案并经由持证服务商。

边缘网络本身也会出故障。cdnping 每 15 分钟同步一次 Cloudflare 官方状态页，记录显示 2026-10-10 04:13（UTC）发布过一条名为 “Elevated Errors in China Network Colos” 的事件，影响等级为 minor。所以如果某天站点在国内突然变慢，在怀疑自己的配置之前，先去平台的官方状态页看一眼，例如 [Cloudflare Status](https://www.cloudflarestatus.com/)，或者 cdnping 的 [API 状态页](/status)。

## 一份可以照着走的排查清单

1. 确认测试网络是国内直连（用 [/ip](/ip) 看分流状态）。
2. Network 面板禁用缓存后刷新，找出最慢的 3 个请求，记下域名和 Timing 中最长的那一段。
3. 对主站域名跑 curl 计时，不同时段至少各测 5 次。
4. 用 `dig` 对比几个解析服务器的结果，排除解析异常。
5. 用 [cdnping 在线测速](/) 看页面依赖的公共 CDN 在当前网络的首次连接和往返。
6. 自托管或异步化阻塞渲染的第三方资源。
7. 配好静态文件的缓存头，压缩图片。
8. 复测并对比改动前后的数据。
9. 主站本身仍然慢、且业务需要时，再评估 ICP 备案和境内节点。

如果你的问题不只出在网站访问上，还包括开发环境整体的网络状况，可以接着看[开发者网络自检清单（2026 版）](/blog/developer-network-self-check-2026)。
