diff --git a/README.md b/README.md
index 41a51a4..8513caa 100644
--- a/README.md
+++ b/README.md
@@ -85,8 +85,8 @@ Linux 服务器可使用 `deploy.sh` 一键下载并部署 `main` 分支的最
bash <(curl -fsSL https://gitea.tohub.top/Share/AI_English/raw/branch/main/deploy.sh) deploy
```
-脚本会将 `src/index.html`、`src/js/` 和 `src/styles/` 部署到 `/root/data/docker_data/Nginx/html/english/ai/`,清理目标目录中的其他内容,但保留已有的 `data/` 目录。运行前请确认目标路径符合服务器配置;脚本需要 root 权限以及 `curl`、`tar`、`find` 命令。
+脚本会将 `src/index.html`、`src/sw.js`、`src/js/` 和 `src/styles/` 部署到 `/root/data/docker_data/Nginx/html/english/ai/`,清理目标目录中的其他内容,但保留已有的 `data/` 目录。运行前请确认目标路径符合服务器配置;脚本需要 root 权限以及 `curl`、`tar`、`find` 命令。
-`src/index.html` 通过 CSS 和 JavaScript URL 的 `v` 查询参数控制静态资源缓存。每次发布修改了 `src/styles.css` 或 `src/script.js`,请同步递增对应版本号。服务器应优先为 `index.html` 设置 `Cache-Control: no-cache`;带版本号的静态资源可长期缓存。
+缓存策略分两层:`src/index.html` 通过 CSS 和入口 JavaScript URL 的 `v` 查询参数(`ASSET_VERSION`)控制静态资源缓存,每次发布请同步递增该版本号;`src/sw.js`(Service Worker)对同源请求采用「网络优先、离线回退缓存」——未带版本号的请求以 `cache: 'no-cache'` 强制向服务器做条件校验,绕过浏览器启发式缓存(iOS Safari 卡旧版本的根因),带 `?v=` 的资源则走默认 HTTP 缓存;对 CDN 上带版本号的静态库(Font Awesome、Chart.js)采用「缓存优先」,首次取回后离线也能显示图标与图表,其余跨域请求(AI / TTS 接口)不拦截。服务器应优先为 `index.html` 与 `sw.js` 设置 `Cache-Control: no-cache`;带版本号的静态资源可长期缓存。
-设置页的“获取最新版本”仅清理应用资源缓存,不应改为清除 `localStorage`,以免丢失学习数据和 AI 配置。
+设置页的“获取最新版本”会检查并更新 Service Worker,再通过带时间戳的 URL 重新加载;重新取得的资源会更新对应 URL 的缓存,带版本号的资源会保留独立条目以避免并发页面互相覆盖,且不会清除 `localStorage`,以免丢失学习数据和 AI 配置。
\ No newline at end of file
diff --git a/deploy.sh b/deploy.sh
index dee503a..8e50bb6 100644
--- a/deploy.sh
+++ b/deploy.sh
@@ -85,18 +85,18 @@ deploy() (
fi
source_dir=$(find "$temp_dir" -mindepth 2 -maxdepth 2 -type d -name src -print -quit)
- if [[ -z "$source_dir" || ! -f "$source_dir/index.html" || ! -d "$source_dir/js" || ! -d "$source_dir/styles" ]]; then
- print_error "仓库中缺少 src/index.html、src/js 或 src/styles,已取消部署"
+ if [[ -z "$source_dir" || ! -f "$source_dir/index.html" || ! -f "$source_dir/sw.js" || ! -d "$source_dir/js" || ! -d "$source_dir/styles" ]]; then
+ print_error "仓库中缺少 src/index.html、src/sw.js、src/js 或 src/styles,已取消部署"
return 1
fi
clear_target
print_info "正在拷贝网站文件到 $TARGET_DIR ..."
- cp -a "$source_dir/index.html" "$source_dir/js" "$source_dir/styles" "$TARGET_DIR/"
+ cp -a "$source_dir/index.html" "$source_dir/sw.js" "$source_dir/js" "$source_dir/styles" "$TARGET_DIR/"
print_success "部署完成"
- print_info "已部署: index.html、js/、styles/"
+ print_info "已部署: index.html、sw.js、js/、styles/"
print_info "已保留: $TARGET_DIR/$PRESERVED_NAME/"
)
diff --git a/docs/smoke-test.md b/docs/smoke-test.md
index 28503f0..7376071 100644
--- a/docs/smoke-test.md
+++ b/docs/smoke-test.md
@@ -46,4 +46,4 @@
- [ ] AI、Azure TTS 配置保存与连接测试正常;Azure 失败后语音回退正常。
- [ ] 内置词库切换、自动加载、手动加载、过滤词增删/搜索/复制正常。
- [ ] 清除收藏、清空数据的双重确认及保留收藏单词行为与原版一致。
-- [ ] “获取最新版本”只清应用缓存并刷新,不清 localStorage。
+- [ ] “获取最新版本”会检查更新并刷新,更新当前版本的应用缓存且不清 localStorage。
\ No newline at end of file
diff --git a/src/index.html b/src/index.html
index c32c847..3a11862 100644
--- a/src/index.html
+++ b/src/index.html
@@ -15,7 +15,7 @@
integrity="sha384-t1nt8BQoYMLFN5p42tRAtuAAFQaCQODekUVeKKZrEnEyp4H2R0RHFz0KWpmj7i8g"
crossorigin="anonymous" referrerpolicy="no-referrer">
+