moedict-app 是萌典的原生離線版本,以 Capacitor 將同一套 React 前端打包為 Android、iOS 與 macOS 應用程式。所有辭典資料、筆順動畫與全文檢索索引皆隨 App 一起安裝,不需網路即可使用。
本專案不包含任何 React 原始碼。src/ 是一個 symlink,指向 moedict.tw 的 git submodule:
moedict-app/
src -> moedict.tw/src ← symlink,零重複
moedict.tw/ ← git submodule(淺層 clone)
capacitor.config.ts ← 原生 App 設定
scripts/prepare-data.sh ← 從 submodule 複製辭典資料至 public/
android/ ios/ ← Capacitor 原生專案
macos/ ← Swift WebView 殼(見 scripts/build-macos.sh,非 npx cap sync)
兩個專案共用完全相同的 src/。離線行為由 src/offline-api.ts 以執行環境或 App 建置旗標自動切換:
// offline-api.ts — 在 Capacitor 或 moedict-app build 中攔截 fetch;一般網頁版完全不執行
if (typeof window !== 'undefined' &&
(import.meta.env.VITE_MOEDICT_OFFLINE_APP === '1' || (window as any).Capacitor)) {
// monkey-patch fetch → 從本地檔案服務辭典資料
}| moedict.tw | moedict-app | |
|---|---|---|
| 部署方式 | Cloudflare Workers + R2 | Capacitor 原生 App |
| 資料來源 | R2 bucket(即時) | 本地檔案(打包時固定) |
| API 處理 | Worker fetch handler |
offline-api.ts fetch 攔截 |
| 原始碼 | 此處為 canonical source | symlink → submodule |
| 語言 | 來源 | 條目數 | URL 前綴 |
|---|---|---|---|
| 臺灣華語 | 教育部《重編國語辭典修訂本》 | 160,000+ | / |
| 臺灣台語 | 教育部《臺灣台語常用詞辭典》 | 20,000+ | /' |
| 臺灣客語 | 教育部《臺灣客語辭典》 | 14,000+ | /: |
| 兩岸詞典 | 中華文化總會 | — | /~ |
另含英/法/德文對照(CC-CEDict、CFDict、HanDeDict)及 6,063 字的筆順動畫資料。
git clone --recurse-submodules https://github.com/g0v/moedict-app.git
cd moedict-app
npm install # 也會自動 init submodule
npm run prepare-data # 從 submodule 複製辭典資料至 public/
npm run dev當 moedict.tw 有新功能或修正時:
cd moedict.tw && git pull origin main && cd ..
git add moedict.tw
git commit -m "Update moedict.tw submodule"Capacitor 7 的 Android 層編譯需要 Java 21(JDK 17 會在編譯時報 invalid source release: 21 錯誤)。android/gradlew 與相關建置腳本會自動透過 scripts/env.sh 載入 JDK 21 與專案本機 Android SDK / Gradle 設定:
# 本機專案環境設定 (scripts/env.sh 自動載入)
JAVA_HOME=/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home
ANDROID_HOME=/Users/au/w/moedict-app/.android-sdk
GRADLE_USER_HOME=/Users/au/w/moedict-app/.gradle-user-home
ANDROID_USER_HOME=/Users/au/w/moedict-app/.android-home筆順動畫 JSON(public/stroke-json/,6,063 字)已提交進 repo。預設建置不會自動下載;只有在本機數量與上游 STROKE_CORPUS_EXPECTED_COUNT 不一致、且明確設定 ALLOW_NETWORK=1 時才會同步:
ALLOW_NETWORK=1 sh scripts/download-strokes.sh
# 或:
ALLOW_NETWORK=1 bun run prepare-datanpm run build:android # prepare-data → tsc → vite build → cap sync
cd android && ./gradlew assembleDebug發佈版本可以 Android Studio 開啟 android/ 進行簽章與發佈。
npm run build
npx cap sync ios然後用 Xcode 開啟 ios/(請用 ios/App/App.xcworkspace,不要開 App.xcodeproj)。
本專案沒有安裝 @capacitor/macos,因此 npx cap sync macos 會出現 Platform macos not found。macOS 版是以 macos/main.swift 與腳本直接組出 .app,請改用:
npm run build:macos # prepare-data → build → arm64 + Intel
# 或只建單一架構:
npm run build:macos:arm64
npm run build:macos:intelscripts/build-macos.sh 會自動建立 build/ 並把 Swift module cache 放在專案內,避免因使用者目錄權限造成編譯失敗。預設產物為 build/萌典.app/(arm64);Intel 版可用 sh scripts/build-macos.sh --intel 產生到 build_intel/萌典.app/。簽章與 MAS 流程見腳本檔頭註解。
建置完成後可直接用 Finder / open 啟動成品:
open build/萌典.app
open build_intel/萌典.app若要用 Xcode 編輯或除錯 macOS 原生殼,請開啟專案:
open macos/Moedict.xcodeproj注意:Xcode 專案對應的是 macos/main.swift 這個原生殼;build/萌典.app 仍是由 scripts/build-macos.sh 直接組裝出的成品,而不是由 Xcode 自動同步產生。
moedict.tw/src/(React 19 + TypeScript + Vite 7)
↓ symlink
moedict-app 的 Vite build
↓
Capacitor 7 sync
┌────┼────┐
Android iOS macOS
- React 19 + React Router 7 — UI 與路由
- Vite 7 — 開發與打包
- Capacitor 7 — 原生 App 容器
- Fuse.js — 全文模糊搜尋(Web Worker 背景執行)
- 環境偵測 — 原生 WebView 以
window.Capacitor、App 的 Vite dev/build 以VITE_MOEDICT_OFFLINE_APP=1啟用同一套離線 API 攔截
辭典本文著作權為教育部所有,採用 CC BY-ND 3.0 臺灣 授權。
兩岸詞典由中華文化總會提供,採用 CC BY-NC-ND 3.0 臺灣 授權。
英/法/德文對照表採用 CC BY-SA 4.0 授權。
筆劃資料來源為教育部「國字標準字體筆順學習網」。
程式碼由唐鳳以 CC0 1.0 公眾領域貢獻宣告 釋出。
- moedict.tw — 線上版前端(Cloudflare Workers)
- moedict-webkit — 原始前端實作
- moedict-data — 原始辭典資料
- moedict-process — 資料轉換流程
g0v 零時政府社群專案