This commit is contained in:
Kevin
2026-04-28 10:41:48 +08:00
parent 482b016872
commit 15884bd68e
60 changed files with 2092 additions and 1994 deletions

View File

@@ -0,0 +1,70 @@
"""以 livereload 提供静态资源目录:保存 HTML/JS/CSS 时浏览器自动刷新。
需 dev 依赖:``uv sync --group dev````livereload``)。
用法:
uv run --group dev python scripts/dev_static_livereload.py --root web/voice-confirmation
uv run --group dev python scripts/dev_static_livereload.py --root web/voice-confirmation -p 8080 --host 127.0.0.1
"""
from __future__ import annotations
import argparse
import sys
from pathlib import Path
def main() -> None:
try:
from livereload import Server
except ImportError as exc: # pragma: no cover
print(
"需要安装 dev 依赖: uv sync --group dev (需含 livereload",
file=sys.stderr,
)
raise SystemExit(1) from exc
p = argparse.ArgumentParser(description="Static site + browser live reload (livereload)")
p.add_argument(
"--root",
type=Path,
required=True,
help="要托管的目录(如 web/voice-confirmation",
)
p.add_argument("--host", default="127.0.0.1")
p.add_argument("-p", "--port", type=int, default=8080)
p.add_argument(
"--extra-watch",
type=Path,
action="append",
default=[],
help="额外监视路径(可重复),变更时触发自动刷新",
)
args = p.parse_args()
root: Path = args.root.resolve()
if not root.is_dir():
print(f"不是目录: {root}", file=sys.stderr)
raise SystemExit(2)
server = Server()
server.watch(str(root))
for w in args.extra_watch:
wp = w.resolve()
if wp.exists():
server.watch(str(wp if wp.is_file() else wp))
url = f"http://{args.host}:{args.port}/"
print(f"Livereload 静态根目录: {root}")
print(f"访问: {url} (编辑目录内文件后应自动刷新浏览器;首次请手动打开)")
print("按 Ctrl+C 停止。")
server.serve(
host=args.host,
port=args.port,
root=str(root),
open_url=False,
debug=False,
)
if __name__ == "__main__":
main()