Back

如何在没有后端的情况下为网站添加搜索功能

如何在没有后端的情况下为网站添加搜索功能

你已经构建了一个静态网站或 JAMstack 应用。它速度快、托管成本低且易于维护。但现在用户需要搜索功能,你开始疑惑:我真的需要仅仅为了这个功能就启动服务器或数据库吗?

简短的答案是不需要。现代方法允许你在没有后端基础设施的情况下实现客户端搜索,同时保持网站完全静态。本指南涵盖三种实用选项:使用 Pagefind 的静态站点搜索、浏览器内 JavaScript 库以及托管搜索 API 解决方案。

核心要点

  • 静态站点搜索不需要运行时服务器——索引作为静态文件与 HTML 一起部署
  • Pagefind 是大多数静态站点的现代默认选择,使用分块索引和 Web Workers 实现高效性能
  • 像 Lunr.js 和 Fuse.js 这样的浏览器内库适合小型站点,但在大型索引规模下会遇到困难
  • 托管搜索 API 提供高级功能,但需要考虑定价、隐私和供应商依赖等成本

”无后端”的真正含义

当我们谈论静态站点搜索或无后端的客户端搜索时,我们指的是没有需要你维护的运行时服务器。你的网站仍然是从 CDN 或简单托管服务提供的静态文件集合。

然而,大多数方法仍然需要构建步骤。在部署期间,你从内容生成搜索索引。该索引作为静态文件与 HTML 一起部署——运行时没有服务器处理查询。

搜索要么完全在用户的浏览器中进行,要么通过 API 调用托管的第三方服务。

Pagefind:静态站点的现代默认选择

Pagefind 已成为静态站点的首选搜索解决方案。它在网站构建后运行,爬取你的 HTML,并生成分块搜索索引。

Pagefind 的工作原理

与创建单个大型索引文件的旧工具不同,Pagefind 将索引拆分为片段。当用户搜索时,他们的浏览器通过 Web Workers 仅下载相关的块。这使得初始页面加载保持快速,同时支持包含数千页面的站点。

Pagefind 包含即插即用的 UI 组件,能很好地处理多语言内容,并且适用于任何静态站点生成器——Hugo、Eleventy、Astro 或纯 HTML。

何时选择 Pagefind

Pagefind 适合大多数静态站点。它可以处理文档站点、博客和营销页面,无需复杂配置。权衡之处在于构建步骤:你的 CI 流水线必须在生成 HTML 后运行 Pagefind。

对于拥有数千页面的站点,Pagefind 通常能以可管理的索引大小良好运行。

客户端库:Lunr、Fuse 及其局限性

在 Pagefind 出现之前,开发者经常使用 Lunr.jsFuse.js 等库。这些库仍然可用,但存在实际限制。

索引大小问题

这些库需要将整个搜索索引加载到浏览器内存中。对于小型博客来说,这没问题——可能只有 50KB。但对于较大的站点,索引可能膨胀到几兆字节,在移动设备和慢速连接上影响性能。

浏览器内库的适用场景

在以下情况下考虑使用 Lunr 或 Fuse:

  • 你的站点少于几百个页面
  • 你需要模糊匹配或自定义评分逻辑
  • 你希望零外部依赖

对于更大规模的站点,Pagefind 的分块方法或托管搜索 API 将更好地服务用户。

托管搜索 API:Algolia 及其替代方案

有时你需要静态索引无法提供的功能——错别字容错、个性化、分析或频繁更新内容的实时索引。

托管搜索的工作原理

Algolia(包括用于文档站点的 DocSearch)和 Orama Cloud 这样的服务维护搜索基础设施。你上传内容索引,然后从前端 JavaScript 查询他们的 API。

你没有运行后端——他们在运行。你的站点保持静态,同时获得强大的搜索能力。

需要考虑的权衡

定价:大多数服务提供有使用限制的免费套餐。随着站点增长或流量增加,预计需要付费。

隐私:第三方脚本可能涉及 GDPR 合规问题。搜索查询通过外部服务器路由,这在某些使用场景中很重要。

供应商依赖:你依赖于他们的正常运行时间和持续服务。

对于大型站点、动态内容或高级功能,托管 API 通常能证明这些权衡是值得的。

选择正确的方法

方法最适合主要权衡
Pagefind大多数静态站点需要构建步骤
Lunr/Fuse小型站点、自定义逻辑索引大小限制
托管 API大型/动态站点成本、隐私、依赖性

对于典型的静态站点搜索需求,从 Pagefind 开始。当你超出静态索引的能力范围或需要高级功能时,转向托管解决方案。

结论

在没有后端的情况下为网站添加搜索功能是完全可行的。Pagefind 优雅地处理大多数静态站点,浏览器内库适用于较小的项目,而托管搜索 API 解决方案在需要时可以扩展。

关键是根据站点的规模、更新频率和功能需求来匹配你的选择。对于大多数 JAMstack 站点,Pagefind 在简单性和功能性之间提供了最佳平衡,同时不会影响你的静态托管设置。

常见问题

是的,Pagefind 适用于任何静态站点生成器,包括 Hugo、Eleventy、Astro、Jekyll 和纯 HTML。它作为构建后步骤运行,爬取你生成的 HTML 文件,因此与这些文件的创建方式无关。你只需在构建完成后将其指向输出目录即可。

对于频繁更新的内容,像 Algolia 或 Orama Cloud 这样的托管搜索 API 是最佳选择。它们支持通过 webhooks 或 API 调用在内容更改时进行实时索引。像 Pagefind 这样的静态解决方案需要完全重建和重新部署才能更新搜索索引。

性能因方法而异。Pagefind 通过按需仅加载相关索引块来最小化影响。像 Lunr 和 Fuse 这样的库将整个索引加载到内存中,对于拥有数百页面或索引超过几百千字节的站点,这可能在移动设备上造成明显延迟。

可以,但有限制。托管搜索 API 允许你单独索引内容并通过 JavaScript 查询,无需修改构建过程。或者,你可以手动创建 JSON 索引文件,尽管这对于较大的站点来说变得不切实际。对于大多数静态站点,构建时索引步骤提供了最佳平衡。

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay