1167 字
3 分钟
SkyWeather · 云际天气
2026/09/12 23:42:34

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 动画
  • 天气数据源:
  • 图片源:随机背景图通过 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.git
cd tianqi

2. 配置 API Key#

复制 .env.example 为 .env:

cp .env.example .env

按需填入以下 Key:

变量名用途是否必填
AMAP_KEY高德地图 Web 服务 Key,用于中国地区天气与地理编码推荐
QWEATHER_KEY和风天气 Key,用于 AQI 空气质量数据可选
IPNEWS_KEYIPnews 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 check

4. 本地预览#

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 提交到仓库。


环境变量说明#

构建时配置来源优先级(高 → 低):

  1. 系统环境变量(process.env)
  2. .env 文件

这样设计可以同时兼容本地开发与 EdgeOne Pages / Vercel 等 CI/CD 平台。


浏览器支持#

  • Chrome / Edge / Firefox / Safari 最新版
  • 支持移动端浏览器与 PWA 添加到主屏
  • 尊重 prefers-reduced-motion 媒体查询,减少动态效果

许可证#

本项目仅用于学习与交流,请遵守各数据提供方的使用条款。


致谢#

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

SkyWeather · 云际天气
https://blog.sylv.top/posts/20260620-skyweather/
作者
Sylvy
创建于
2026/06/20 18:00:00
许可协议
CC BY-NC-SA 4.0
修改历史

最后一次修改于 2026/09/12 23:42:34

2 次修改