经过一番折腾,我的 Hugo 博客正式从本地搬到了 Vercel。这次部署不仅仅是简单的代码上传,还涉及到 Pagefind 全文搜索、私有主题子模块以及基于 Vercel Edge Middleware 的文件夹密码保护。
为了方便以后查阅,也为了给有类似需求的朋友提供参考,特整理此文。
1. 为什么选择 Vercel?
相比于 GitHub Pages 或 Cloudflare Pages,Vercel 的优势在于其强大的 Edge Middleware (边缘中间件)。这让我能够轻松实现“文件夹级别”的访问控制(比如 protected 目录),而不需要维护复杂的后端服务器。
2. 部署前的项目结构调整
为了让 Vercel 能够顺利执行构建任务,我在根目录下补充了一个关键文件:
package.json:虽然 Hugo 本身不依赖 Node.js,但我们需要通过它来管理 Pagefind(搜索索引工具)以及 Middleware 运行所需的@vercel/edge依赖。有了它,Vercel 才能在构建时自动安装正确的工具链。
|
|
3. Vercel 导入与配置
在 Vercel 导入 GitHub 仓库时,关键配置如下:
基本信息
- Application Preset:
Hugo - Root Directory:
./
构建命令 (Build Command) 🚀
这是一个核心点。因为我们要同时完成 Hugo 构建和 Pagefind 索引生成,所以命令需要连起来写:
|
|
环境变量 (Environment Variables) 🔑
在部署界面的 Environment Variables 栏目添加以下变量,可以极大减少构建失败的概率:
| Key | Value | 说明 |
|---|---|---|
HUGO_VERSION |
0.157.0 |
建议与本地版本一致,防止构建语法不兼容 |
HUGO_BASEURL |
https://your-domain.com/ |
设置你的真实域名,或者使用相对路径 / |
AUTH_DURATION |
86400 |
(可选) 加密文章验证后的有效期(秒),默认 1 天 |
4. 进阶:基于 Middleware 的路径保护
我实现了一个功能:所有放在 content/posts/protected/ 下的文章,在访问时都会被拦截并要求输入密码。
核心逻辑:
middleware.js:在边缘节点拦截请求,校验 Cookie。password.html:一个简约的毛玻璃视觉风格验证页面。
5. Pagefind 搜索适配
由于 Pagefind 是在静态文件生成后才运行的。我们在构建命令中加入了 npx pagefind,它会自动扫描 public 文件夹并生成索引。
注意:在搜索页面的模板中,要确保引用的是 /pagefind/pagefind-ui.js,路径必须与构建命令中的 --output-path 保持一致。