离线支持
AISCouncil 是一个渐进式 Web 应用 (PWA),在首次访问后可离线工作。整个应用程序是一个没有外部依赖项的单个 HTML 文件,因此可以被浏览器的 service worker 完全缓存。
渐进式 Web 应用 (PWA)
应用程序注册一个 service worker (sw.js),在首次加载时缓存所有静态资源。在后续访问中,应用程序立即从缓存加载 —— 即使没有网络连接。
安装为应用
Chrome / Edge(桌面):
- 访问 aiscouncil.net
- 点击地址栏中的安装图标(或转到菜单 > "安装 AISCouncil")
- 应用程序在自己的窗口中打开,有自己的任务栏条目
Chrome / Edge(Android):
- 访问 aiscouncil.net
- 点击浏览器菜单(三个点)
- 选择"添加到主屏幕"或"安装应用"
Safari(iOS / macOS):
- 访问 aiscouncil.net
- 点击分享按钮
- 选择"添加到主屏幕"
作为 PWA 安装时,应用程序以 standalone 模式运行 —— 没有浏览器界面、全屏体验,并在任务切换器中显示为原生应用。
Service Worker 缓存策略
Service worker 使用过期重验证策略:
- 首次访问: 所有预缓存的资源被下载并存储在缓存中
- 后续访问: 缓存版本立即提供(零网络延迟),同时 service worker 在后台获取更新版本
- 更新后的下次访问: 更新版本从缓存提供
这意味着您始终可以获得即时加载时间,更新在后台静默到达。
什么被缓存
Service worker 在安装时预缓存这些文件:
| 文件 | 用途 |
|---|---|
/ | HTML shell(重定向到 /index.html) |
/index.html | 完整应用程序(~所有 JS、CSS 和 HTML 内联) |
/icon.svg | 矢量应用图标 |
/icon-192.png | 192x192 PNG 图标(Android 主屏幕) |
/icon-512.png | 512x512 PNG 图标(启动屏幕、可遮罩) |
/favicon.ico | 浏览器标签页图标 |
/manifest.webmanifest | PWA 清单(名称、图标、主题颜色) |
此外,应用程序发出的任何同源 GET 请求将在首次获取时缓存,并在后续请求时从缓存提供(过期重验证)。
什么不被缓存
| 资源 | 原因 |
|---|---|
| LLM API 调用 | 这些直接发送到提供商 API(Anthropic、OpenAI 等)并需要网络连接 |
| 注册表更新 | 从 GitHub 获取模型注册表需要网络,但应用程序会回退到缓存/捆绑数据 |
| 跨域资源 | 只有同源请求被 service worker 缓存 |
| POST/PUT/DELETE 请求 | 只有 GET 请求被缓存 |
| API 代理调用 | 对 /v1/* 的请求明确排除在缓存之外 |
离线能力
离线时,您可以:
- 浏览现有聊天 —— 所有聊天历史本地存储在 IndexedDB 中
- 管理配置文件 —— 创建、编辑和删除机器人配置文件
- 查看和更改设置 —— 所有设置都在 localStorage 中
- 导出数据 —— 下载您的备份 JSON 文件
- 在机器人之间切换 —— 所有机器人配置本地存储
- 阅读之前的对话 —— 完整的消息历史可用
离线时,您不能:
- 发送新消息 —— 需要对 LLM 提供商进行 API 调用
- 刷新模型注册表 —— 需要从 GitHub 获取
- 登录 —— OAuth 需要网络连接
- 安装小程序 —— 需要获取清单和入口 HTML
拥有本地实例的 Ollama 用户仍然可以离线聊天,因为 Ollama 在 localhost 上运行,不需要互联网访问。
缓存版本控制
Service worker 使用版本化的缓存名称:
const CACHE = "ais-v1.0.0";
当版本字符串更改时(在重大更新时),新的 service worker:
- 使用新名称创建新缓存
- 将所有资源预缓存到新缓存中
- 激活时删除所有旧缓存
- 声明所有打开的客户端
这确保在重大更新后清理过期的缓存代码。
更新应用程序
更新自动发生:
- 当您访问页面时,浏览器检查
sw.js是否已更改 - 如果已更改,新的 service worker 在后台安装
- 在下次页面加载时(或关闭所有标签页并重新打开后),新的 service worker 激活
- 新版本现在从缓存提供
要强制立即更新:打开开发者工具 > 应用程序 > Service Worker,点击已注册的 service worker 上的"更新",然后重新加载页面。或者,按住 Shift 并点击浏览器的重新加载按钮以绕过缓存。
Web 应用清单
manifest.webmanifest 文件定义应用程序安装时的显示方式:
{
"name": "AISCouncil",
"short_name": "AISCouncil",
"description": "Chat with Claude, GPT, or Grok -- no server, no setup.",
"start_url": "/",
"display": "standalone",
"background_color": "#000000",
"theme_color": "#7c3aed",
"categories": ["productivity", "utilities"],
"icons": [
{ "src": "icon.svg", "sizes": "any", "type": "image/svg+xml" },
{ "src": "icon-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "icon-512.png", "sizes": "512x512", "type": "image/png" },
{
"src": "icon-512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
]
}
| 字段 | 值 | 用途 |
|---|---|---|
display | standalone | 无浏览器 UI 运行(地址栏、标签页) |
orientation | any | 纵向和横向都可工作 |
theme_color | #7c3aed | 状态栏和标题栏的紫色强调 |
background_color | #000000 | 应用加载时的启动屏幕背景 |
故障排除
应用程序显示旧版本:
- 打开开发者工具 > 应用程序 > Service Worker
- 点击旧 service worker 上的"注销"
- 重新加载页面
应用程序无法离线工作:
- 确保 service worker 已注册(开发者工具 > 应用程序 > Service Worker)
- 确保您在线时至少访问过页面一次
- 检查缓存是否存在(开发者工具 > 应用程序 > 缓存存储)
- 某些浏览器在隐私/隐身模式下禁用 service worker
安装提示不出现:
- 页面必须通过 HTTPS 提供(或
localhost) - Service worker 必须已注册并处于活动状态
- 清单必须有效并在 HTML
<head>中链接 - 您必须至少访问过页面两次,中间间隔一些时间(浏览器启发式)