跳至主要内容

Relive React 套件與跨框架整合

如果網站使用 React,現在可以直接嵌入 <Relive />,不必為旅程回放改用 Docusaurus。獨立套件 @kywk/react-relive 包裝既有播放器,沿用 GPX 主時間軸、照片與事件停留、Leaflet 2D 和 3D 切換。

這個分層參考 Geo Story Map:共用資料處理與播放器,讓 Obsidian、Docusaurus 與 React 各自負責資料來源和畫面生命週期。它不會把 Vault API 或 Docusaurus 路由帶進 React 應用程式。

選擇適合的入口​

使用場景入口資料由誰準備
Obsidian 筆記relive 外掛外掛讀取區塊與 Vault 附件
Docusaurus 發布筆記@kywk/relive/integrationremark 在建置時解析附件
React 應用程式@kywk/react-relive應用程式傳入解析完成的旅程

React 套件支援 React 19.x,應用程式提供 React。此處說的跨框架是能使用 React 元件的 host;純 Vue 或 Svelte 不會因安裝此套件就直接得到原生元件。

安裝來源與範例​

@kywk/react-relive 0.1.2 已發布至 npm,依賴共用播放器 0.2.2,可在 React 19 專案執行:

npm install @kywk/react-relive

需要驗證原始碼變更時,在 Relive repository 執行 npm run release:pack 與 npm run react:release:pack,取得 .release/docusaurus/ 和 .release/react/ 的 tarball,於應用程式同時安裝兩者。React 套件依賴共用 @kywk/relive;一般 npm 安裝會一併安裝它,使用本機 tarball 時則須讓 CI 也能取得兩個套件。

原始碼中的 examples/react 是獨立 Vite 範例;根目錄執行 npm run react:demo 啟動、npm run react:build 建置。官方 Demo 的原始碼也改以 React 元件掛載播放器。

最小旅程元件​

以下是合成軌跡,沒有外部 GPX 或照片依賴:

import {Relive, makeTrack, parseGpx} from '@kywk/react-relive';
import '@kywk/react-relive/styles.css';

const journey = {
title: '示範散步',
duration: 30,
stopDuration: 3,
timezoneOffset: '+08:00',
renderer: 'leaflet',
track: makeTrack(parseGpx(`<gpx version="1.1" creator="demo"><trk><trkseg>
<trkpt lat="25.05" lon="121.50"><time>2026-10-30T00:00:00Z</time></trkpt>
<trkpt lat="25.06" lon="121.51"><time>2026-10-30T00:10:00Z</time></trkpt>
</trkseg></trk></gpx>`)),
photos: [],
events: [],
warnings: [],
};

export default function App() {
return <Relive journey={journey} />;
}

單一樣式入口包含 Leaflet、MapLibre 與 Relive CSS。journey 放在模組常數中,避免每次 React render 都換成新物件;動態資料可保存在 state 或 useMemo。換一個旅程物件會清理舊播放器、重新掛載並重置進度。

元件僅於瀏覽器 effect 載入地圖,卸載時清理地圖、動畫與事件。可選傳入 className、style、onReady、onError,以及 Google 3D 使用的 googleMapsApiKey。

GPX、照片與 SSR 的責任​

元件接收已解析的旅程,不會自行掃描 Vault、讀取檔案或抓 EXIF。應用程式負責取得 GPX XML,再以 parseGpx、makeTrack 建立軌跡;照片提供公開 URL 和已知時間或 GPS,再用 matchPhoto 配對。原有 YAML 可由 parseBlock 解析,但來源設定不等於可直接播放的旅程。

照片 URL 必須能被訪客瀏覽器存取。若應用程式 fetch 跨來源 GPX,也需要處理 CORS、載入失敗與取消請求。Docusaurus 的 assetRoots、gpxSlim 是建置整合選項,不是 <Relive /> 的 props。

在 Next.js App Router,使用元件的檔案需要 'use client' 邊界,全域 CSS 放在框架允許的入口。SSR 階段不建立地圖,瀏覽器掛載後才顯示播放器。目前專案提供的可執行範例以 Vite 為主;其他框架仍應驗證各自的樣式、部署子路徑與切頁行為。

Google key 是瀏覽器端設定,會交付給訪客,需設定 API 與網站來源限制。一般 2D 和 MapLibre 3D 不需要 Google key,相關差異見 03 Relive 照片定位與 3D 旅程回放。

系列導覽​

  1. 01 Relive 專案介紹
  2. 02 Relive 安裝與旅程筆記語法
  3. 03 Relive 照片定位與 3D 旅程回放
  4. 04 Relive Docusaurus 整合與公開附件
  5. 05 Relive GPX 瘦身與分享工作流程
  6. 06 Relive React 套件與跨框架整合

參考資料​

MapLibre Worker 與部署​

0.1.2 使用已封裝 Worker 的共用播放器,無需為 Vite、Webpack 等框架另設 Worker URL。Worker 由套件內建程式透過本機 Blob URL 啟動;有 CSP 的網站需允許 worker-src blob:。地圖資料仍需網路及 WebGL,載入失敗會保留 2D。