本文档面向开发者(架构、部署、内容维护)与网站访客(功能与操作),并包含本地开发与构建发布的运行步骤。
本项目是一个以西安地标建筑声景为主题的沉浸式 Web 体验站点,品牌名在界面中呈现为「西安中轴线建筑声景 / City Soundscape」。主要能力包括:
- 多语言叙事:中文 / 英文切换(
react-router-dom与 React 状态配合)。 - 卷轴式城市页:视差滚动、场景分区、可点击「声学热点」弹出详情与音频可视化。
- 全景地图:基于 Leaflet(CDN 动态加载)与 OpenStreetMap 瓦片,展示
places.json中的采样点。 - 声漫步:基于 Three.js 的粒子可视化,按地点列表顺序播放图像与关联音频。
- 开场视频:首次访问可播放全屏介绍视频(本地
intro.mp4),跳过后写入localStorage以免重复播放。 - 全局环境音:城市页与关于页可开关循环背景音(
/background.wav,需置于public目录)。
技术栈:Vite 5 + React 18 + React Router 6 + Three.js;样式为全局 CSS(src/styles.css)。
| 层级 | 说明 |
|---|---|
| 构建工具 | Vite(@vitejs/plugin-react),ESM、import.meta.glob 批量引入内容资源 |
| 路由 | BrowserRouter,路径见下文「路由一览」 |
| 地图 | Leaflet 1.9.4 通过 unpkg.com 注入脚本与样式(需网络访问 CDN) |
| 底图 | OpenStreetMap 标准瓦片 https://{s}.tile.openstreetmap.org/... |
| 3D / 音频 | Three.js 动态 import("three");Web Audio API(Analyser、Gain 等) |
- 入口:
index.html→src/main.jsx(挂载#root,包裹BrowserRouter)。 - 根组件:
src/App.jsx- 管理
lang(zh/en)、bgMuted(背景音静音)、showIntro(开场视频)。 - 城市页热点音频使用
AudioContext+<audio>+ Canvas 频谱条。
- 管理
-
城市叙事页
- 顺序与 slug 定义在
src/content/cities/index.js的cityOrder。 - 每个城市目录(如
daming-palace/)含meta.json(场景、热点、文案、图片路径等)与note.zh.md/note.en.md(构建时解析为块结构,当前主流程以meta.json的text为主)。
- 顺序与 slug 定义在
-
地图与声漫步
src/content/places.json:经纬度、中英文名称、简介、img_address、audio_address文件名。- 图片:
src/content/img/typical/下文件,通过import.meta.glob匹配。 - 音频:
src/content/audio/*.wav,同样通过 glob 引入。
-
占位 / 程序化音频
src/lib/audio.js的createWaveBlob:当热点未配置真实audio时,根据sound.color等生成简易波形 WAV(内存 URL)。
- Vite 打包的资源:
meta.json内可写/assets/...(需文件存在于public/assets/...或构建流程产出)。 - 开发时 public 根路径:
public/background.wav→ 浏览器访问/background.wav。 - 开场视频:
src/content/intro.mp4由源码侧 import,随构建进入 hashed 资源。
xian_soundscape/
├── index.html
├── package.json
├── vite.config.js
├── public/ # 静态文件原样提供(如 background.wav 应放此处)
├── src/
│ ├── main.jsx
│ ├── App.jsx # 路由、开场、背景音、城市页容器
│ ├── MapPage.jsx # 全景地图
│ ├── SoundwalkPage.jsx # 声漫步(Three.js)
│ ├── AboutPage.jsx
│ ├── VideoIntro.jsx # 开场视频
│ ├── Footer.jsx
│ ├── styles.css
│ ├── lib/audio.js
│ └── content/
│ ├── places.json # 地图/声漫步点位数据
│ ├── intro.mp4
│ ├── img/typical/ # 点位配图
│ ├── audio/ # 点位 wav
│ └── cities/
│ ├── index.js # cityOrder + glob 加载各城 meta 与 note
│ ├── locations.js # 地图中心、缩放、导航用名称
│ └── <slug>/
│ ├── meta.json
│ ├── note.zh.md
│ └── note.en.md
└── dist/ # npm run build 输出(部署用)
| 路径 | 页面 | 说明 |
|---|---|---|
/ |
重定向 | 跳转到 /city/<cityOrder[0]>(当前首个为 daming-palace) |
/city/:citySlug |
城市叙事 | citySlug 须为 cityOrder 中已有项,否则重定向到默认城 |
/map |
全景地图 | 不播放全局 BackgroundAudio(与 App.jsx 中 isMapPage 逻辑一致) |
/soundwalk |
声漫步 | Three.js 粒子 + 列表音频 |
/about |
关于 | 项目说明;可控制背景音与语言 |
* |
兜底 | 重定向到默认城市页 |
-
首次打开
- 可能看到全屏介绍视频;可等待播放结束或使用界面上的跳过/进入主站按钮(以实际 UI 为准)。
- 浏览器若拦截自动播放,可能需用户手势后才能有声。
-
语言
- 顶部 「中文 / EN」 切换界面文案(部分页面标题随语言更新)。
-
城市叙事页
- 向下滚动浏览场景;热点按钮在滚入视口一定进度后高亮。
- 点击热点打开侧栏/弹层:图文 + 音频;部分热点为程序化生成音色。
- 「声音:开/关」 控制全站循环背景音(非地图页)。
- 「全景」 进入地图;「声漫步」 进入粒子声漫步;导航可切换大明宫 / 钟楼 / 永宁门等(以
cityOrder为准)。
-
全景地图
- 拖拽、缩放浏览;点击标记弹出简介、图片与音频(数据来自
places.json与content/img、content/audio)。 - 需能访问 OSM 瓦片与 unpkg(Leaflet)。
- 拖拽、缩放浏览;点击标记弹出简介、图片与音频(数据来自
-
声漫步
- 按序列体验各点位;支持静音/音量类控制(以页面控件为准);依赖 WebGL 与音频解码。
-
关于
- 「返回」 优先历史返回,否则回首页。
-
再次观看开场视频
- 清除站点数据或删除浏览器中本站
localStorage键introWatched后刷新(具体以开发者工具为准)。
- 清除站点数据或删除浏览器中本站
- Node.js:建议当前 LTS(如 18.x / 20.x),需含
npm。 - 浏览器:支持 ES Module、WebGL、Web Audio 的现代浏览器(Chrome / Edge / Firefox / Safari 新版本)。
- 网络:开发/运行地图页时需能访问外网 CDN 与 OSM(若离线部署需自行改 Leaflet 与瓦片方案)。
在项目根目录执行:
npm installnpm run dev默认在终端提示的本地 URL(一般为 http://localhost:5173)打开即可。修改 src/ 下文件会热更新。
建议检查:
public/background.wav是否存在;缺失时背景音可能无效。src/content/img/typical/与src/content/audio/与places.json中文件名一致。- 城市页配图路径与
public或构建资源一致,避免 404。
npm run build产物在 dist/。预览构建结果:
npm run preview本项目使用 History 模式(BrowserRouter)。静态托管(如 GitHub Pages、Nginx、OSS)需将所有前端路径回退到 index.html,否则直接访问 /map 等会 404。
- 新增或调整地图/声漫步点位:编辑
src/content/places.json,并放入对应img/audio文件,文件名与字段一致。 - 调整城市顺序或新增城市:在
src/content/cities/index.js修改cityOrder并新增content/cities/<slug>/与meta.json等(需与路由、导航一致)。 - 地图中心与范围:
src/content/cities/locations.js中mapCenter、mapZoom;LeafletmaxBounds在MapPage.jsx内写死为西安一带,若改城市需同步修改。
| 命令 | 作用 |
|---|---|
npm run dev |
启动 Vite 开发服务器 |
npm run build |
生产构建至 dist/ |
npm run preview |
本地预览 dist/ |
- 运行时:
react、react-dom、react-router-dom、three - 开发:
vite、@vitejs/plugin-react
| 现象 | 可能原因 | 处理方向 |
|---|---|---|
| 地图空白或报错 | 无法加载 Leaflet 或 OSM 瓦片 | 检查网络、防火墙;或改为内网托管 Leaflet 与瓦片 |
| 声漫步黑屏或卡顿 | WebGL 不可用或性能不足 | 更新驱动/浏览器;降低粒子等需改源码 |
| 热点无声音 | 音频路径错误或未配置 | 检查 meta.json 的 audio 与 sound;浏览器是否拦截播放 |
| 背景音无声音 | 缺少 public/background.wav 或处于静音 |
补全文件并点击「声音」开关 |
| 部署后子路由 404 | 服务器未配置 SPA 回退 | 配置 try_files 或等价规则指向 index.html |
- 文档随仓库
xian_soundscape维护;若依赖或路径有变,请以当前package.json与src/为准同步更新本文。 - 项目名称在
package.json中为soundscape-city-web,版本0.1.0(仅供参考)。
生成说明:本文件依据仓库源码结构与脚本整理;若与实际运行不一致,以代码为准。