SkyWeather · 云际天气
一个简洁、现代的纯前端天气应用,支持城市搜索、IP / GPS 定位、实时天气、24 小时预报、7 天预报、空气质量 AQI 以及沉浸式动态天气背景。 项目地址:https://weather.sylv.top
项目以
index.html为入口,已从单文件演进为多文件工程:WebGL 渲染独立为weather-renderer.js,服务端代理为server.js与edge-functions/,Three.js 通过本地 vendor 加载,可离线使用。
功能特性
- 多方式定位:支持城市搜索、GPS 定位、IP 自动定位(IPv4 / IPv6 兼容)。
- 实时天气:当前温度、体感温度、天气现象、风速、湿度、气压、紫外线等。
- 空气质量 AQI:PM2.5、PM10、NO₂、O₃ 等污染物数据;未配置和风天气 Key 时由 Open-Meteo 兜底(线上即此状态)。
- 24 小时预报:逐小时温度、天气、降水概率、风速。
- 7 天预报:每日最高 / 最低温度、天气、降水概率、日出日落。
- 生活建议:穿衣、紫外线、运动、洗车、感冒、过敏 6 项。
- 日出日落:日照时长弧线展示。
- 动态天气背景:以 WebGL(Three.js)为主渲染,Canvas 2D 降级,覆盖雨雪、雷暴、雾气等沉浸式效果,并尊重
prefers-reduced-motion。 - 自适应主题:根据天气状态自动切换晴、多云、雨、雪、雷暴、雾霾等 7 套主题。
- 搜索历史:本地存储最近搜索城市,最多 8 条,支持一键清空;另有 9 城快捷入口。
- 随机背景图:可切换 Bing / 随机风景背景(随机风景经
https://pic.api.sylv.top/image获取)。 - PWA:仅 meta 级适配(theme-color、
apple-mobile-web-app、viewport-fit),无 manifest,不宜当作完整 PWA 使用。
技术栈
- 纯前端:HTML5 + CSS3(自定义属性 / 玻璃拟态)+ 原生 JavaScript(ES6+)
- 动画:WebGL(Three.js ^0.160.1,唯一运行时依赖,本地 vendor)主渲染 + Canvas 2D 降级 + CSS 动画
- 天气数据源:
- Open-Meteo:全球天气,免 API Key,作为默认兜底。
- 高德地图 Web 服务:中国地区地理编码 / 天气 / IP 定位。
- 和风天气:AQI 空气质量与城市天气。
- IPnews:IPv6 网络 IP 定位。
- GeoDB Cities:城市搜索与 IP 定位兜底。
- 图片源:随机背景图通过
https://pic.api.sylv.top/image获取。
目录结构
.├── index.html # 主页面(入口,内联样式与业务逻辑)├── weather-renderer.js # WebGL 天气渲染器(ES module)├── server.js # 自建服务端代理(同源 /api/*)├── build.js # 构建脚本:根据环境变量生成 config.js(布尔标志,不含 Key)├── copy-vendor.js # 本地 vendor 拷贝(postinstall)├── edge-functions/api/[[path]].js # EdgeOne 边缘函数代理├── edgeone.json # EdgeOne Pages 部署配置├── package.json # 项目脚本定义(含 three)├── .env.example # 环境变量模板├── .gitignore # Git 忽略规则└── README.md # 项目说明(目录树与 Android 章节已落后,以此处为准)快速开始
1. 克隆仓库
git clone https://github.com/zzrliu8421/tianqi.gitcd tianqi2. 配置 API Key
复制 .env.example 为 .env:
cp .env.example .env按需填入以下 Key:
| 变量名 | 用途 | 是否必填 |
|---|---|---|
AMAP_KEY | 高德地图 Web 服务 Key,用于中国地区天气与地理编码 | 推荐 |
QWEATHER_KEY | 和风天气 Key,用于 AQI 空气质量数据 | 可选 |
IPNEWS_KEY | IPnews Key,用于 IPv6 IP 定位 | 可选 |
3. 生成配置
npm run build# 或node build.js构建脚本会读取 .env 或系统环境变量,生成只含布尔标志的 config.js。真实 Key 只留在服务端,经同源 /api/* 注入,不会进入前端。线上实测 /api/status 为 {"amap":true,"qweather":false,"ipnews":true},即 AQI 走 Open-Meteo 兜底。
检查配置是否生效:
npm run check# 或node build.js check4. 本地预览
index.html 为静态入口,可直接用任意静态服务器预览,例如:
npx serve .纯静态下仅 Open-Meteo 等免 Key 源可用;高德、和风、IPnews 需要经
server.js或边缘函数代理。
部署
项目支持 4 种方式:自建服务器、静态 + 独立代理、纯静态、EdgeOne 边缘函数(推荐)。
部署
EdgeOne Pages
项目已包含 edgeone.json,构建命令为:
node build.js输出目录为 ./,Node 版本 20.18.0。
其他平台
由于真实 Key 只在服务端使用,部署前运行 node build.js 生成布尔标志配置,或在 CI/CD 中注入环境变量后运行构建。不要将 .env 提交到仓库。
环境变量说明
构建时配置来源优先级(高 → 低):
- 系统环境变量(
process.env) .env文件
这样设计可以同时兼容本地开发与 EdgeOne Pages / Vercel 等 CI/CD 平台。
浏览器支持
- Chrome / Edge / Firefox / Safari 最新版
- 支持移动端浏览器与 PWA 添加到主屏
- 尊重
prefers-reduced-motion媒体查询,减少动态效果
许可证
本项目仅用于学习与交流,请遵守各数据提供方的使用条款。
致谢
最后一次修改于 2026/09/12 23:42:34