Vercel部署纯静态HTML需显式指定static框架:根目录放index.html(勿含package.json),控制台选Static Site或vercel.json配{"framework":"static"},CLI用vercel --prod --framework=static,资源用相对路径防404,自定义域名需DNS验证。

直接扔上去就能跑,但得满足 Vercel 的静态文件识别规则
Vercel 默认把项目根目录下的 index.html 当作静态入口,但前提是它能“认出”这是个静态站点——不是所有放了 index.html 的文件夹都能自动部署成功。常见失败原因是没加 vercel.json 或没选对框架预设,导致 Vercel 尝试用 Next.js 或其他构建流程去处理纯 HTML,结果报错 Build failed: No build output found。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 确保你的项目根目录只有
index.html(可选:加favicon.ico、style.css、script.js等静态资源,但不要有package.json) - 部署时,在 Vercel 控制台手动选择 Framework Preset → Static Site(千万别选
Create React App或Next.js) - 如果已有
package.json(哪怕只是空的),Vercel 可能强行触发构建;删掉它,或在vercel.json中强制指定输出目录:{"outputDirectory": "."}
用 CLI 部署时,vercel --prod 会跳过构建步骤吗
会,但前提是 Vercel 能确认这是静态站点。CLI 不会自动读你的心思——它靠文件特征和配置推断类型。如果你只运行 vercel,它可能仍尝试检测框架,尤其当目录里有 next.config.js 或 astro.config.mjs 这类残留文件时。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 先运行
vercel link关联项目,再执行vercel --prod --framework=static(显式声明框架) - 或者在项目根目录放一个空的
vercel.json,内容为:{"framework": "static"},之后直接vercel --prod即可 - 检查 CLI 输出里是否出现
Detected static site;如果看到Using defaults defined in vercel.json,说明配置生效了
部署后访问 404?可能是路由或路径写死了
Vercel 静态托管默认支持 / 路由,但如果你的 index.html 里写了相对路径引用资源(比如 <script src="js/app.js">),而实际文件放在根目录下,那没问题;但如果误写成 <script src="/js/app.js">,且你没配重写规则,Vercel 会严格按路径匹配——/js/app.js 就必须真实存在该文件,否则返回 404。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 所有资源引用尽量用相对路径(
js/app.js、./css/main.css),避免开头带/ - 如果必须用绝对路径,就在
vercel.json加重写(仅限 Pro 项目免费额度内也支持):{"rewrites": [{"source": "/js/(.*)", "destination": "/js/$1"}]} - 打开浏览器开发者工具的 Network 标签页,看哪个
.js或.css请求状态码是 404,顺藤摸瓜改路径
自定义域名 + HTTPS 是默认开启的,但需要验证所有权
Vercel 给的 xxx.vercel.app 域名自带 HTTPS,无需配置。但如果你绑自己的域名(比如 myapp.com),Vercel 会自动申请 Let’s Encrypt 证书,不过前提是 DNS 解析已生效且你能通过 CNAME 或 A 记录验证控制权。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 在 Vercel 项目 Settings → Domains 里添加域名后,它会立刻给出要求的 DNS 记录(通常是 CNAME 指向
cname.vercel-dns.com) - 别急着点 Verify —— 先去你域名服务商后台填完记录,等 TTL 过期(通常几分钟到几小时),再回 Vercel 点 Verify
- 如果卡在 “Verifying…” 超过 2 小时,大概率是 DNS 没生效,用
dig myapp.com CNAME或nslookup myapp.com检查解析结果
index.html 最容易翻车的地方,从来不是功能上限,而是它太智能——总想帮你“构建”,结果把简单事搞复杂。盯住 framework=static 这个开关,其余都是路径和 DNS 的体力活。


















