萌典(moedict)前端重構專案,使用 React + TypeScript + Vite,部署於 Cloudflare Workers。
目前最需要的協助是幫忙實測、發現 bug、提出 issue。
字典牽涉四種語系與多種複雜功能,很多問題必須靠實際跑流才會發現。
所以想參與協作,不一定要先建立完整開發環境;像啄木鳥一樣持續實測與提報錯誤,也非常有幫助。
- 請先確認是否已有相同 issue。
- 問題描述請包含:重現步驟、預期結果、實際結果、截圖(可選)、瀏覽器與作業系統版本。
- 資料相關問題(如部首、詞條、分類)請盡量附上對應詞條與 URL。
- 建議流程:
- Fork 專案並開新分支(例如:
fix/radical-qing、feat/sidebar-keyboard)。 - 完成修改後送出 Pull Request。
- PR 內容請包含:變更摘要、測試方式、風險/相容性說明。
- Fork 專案並開新分支(例如:
npx tsc -b --pretty falsenpm run lint
本專案啟動前,必須先將靜態資源與字典資料上傳到自己的 R2。
若未上傳,頁面會出現樣式缺失、查詢不到資料或 API 404。
- Node.js(建議
>= 20.19) - npm
- Wrangler CLI
- rclone
- Cloudflare 帳號(可建立 R2 bucket 與 Worker)
可自訂名稱,以下為範例:
wrangler r2 bucket create <your-fonts-bucket>
wrangler r2 bucket create <your-fonts-bucket-preview>
wrangler r2 bucket create <your-assets-bucket>
wrangler r2 bucket create <your-assets-bucket-preview>
wrangler r2 bucket create <your-dictionary-bucket>
wrangler r2 bucket create <your-dictionary-bucket-preview>rclone config完成後可先確認:
rclone listremotesrclone sync data/assets/ r2:<your-assets-bucket>/ \
--progress --transfers=8 --checkers=16 --fast-list請先產生全文檢索索引,再同步整個 data/dictionary(不是只傳 pack):
npm run build-search-index接著上傳:
rclone sync data/dictionary/ r2:<your-dictionary-bucket>/ \
--progress --transfers=16 --checkers=32 --fast-list說明:
search-index/不是原始資料的一部分,而是由npm run build-search-index根據data/dictionary/*ck/*.txt動態產生。- 專案會使用
pack/pcck/phck/ptck,也會讀取a/、c/與根目錄下@*.json、=*.json等檔案。 - 若未先產生
search-index/就直接同步data/dictionary/,正式環境的右上角全文搜尋會缺資料。 - 只上傳部分目錄會導致部首表、分類索引或搜尋功能不完整。
- 全文檢索索引現在會產生在
data/dictionary/search-index/,並由 Worker 透過/api/search-index/*.json從DICTIONARYbucket 讀取。 - 因此部署前除了字典資料本體,也必須把
search-index/一起上傳到DICTIONARYbucket;若漏傳,右上角全文搜尋會失效。
專案根目錄已附帶 wrangler.jsonc,clone 後不必再從範本複製。預設已對應 g0v 萌典慣用的 bucket 名稱與公開網域;若你要用自己的 R2 與網域,請只編輯該檔內:
r2_buckets[*].bucket_name與preview_bucket_name(含FONTS、ASSETS、DICTIONARY)vars.ASSET_BASE_URLvars.DICTIONARY_BASE_URL
範例(僅示意需替換的欄位;完整結構以 repo 內檔案為準):
npm install
wrangler auth login
npm run dev補充:
npm run dev與npm run build會先根據data/dictionary/*ck/*.txt自動產生data/dictionary/search-index/*.json。- 這些索引檔不會打包進 Workers assets,避免單一檔案超過 Cloudflare Workers 靜態資產 25 MiB 限制。
- 正式部署前若字典資料有更新,請先執行
npm run build-search-index,再執行sh commands/upload_dictionary.sh上傳最新的search-index/。
部署:
npm run deploy
# 或
npx wrangler deploycommands/upload_assets.shcommands/upload_dictionary.sh
這兩支腳本可作為參考,但若你使用自訂 bucket 名稱,請先調整腳本中的 bucket 設定,或直接使用上面的 rclone sync 指令。
其中 commands/upload_dictionary.sh 目前也會一併上傳 data/dictionary/search-index/;若沒有先產生該目錄,腳本會提示先執行 npm run build-search-index。
若未來要從教育部同步最新資料,建議先閱讀下列三個專案的 README.md,確認資料來源、處理流程與產物格式後再進行更新:
- https://github.com/g0v/moedict-webkit
- https://github.com/g0v/moedict-process
- https://github.com/g0v/moedict-data
建議更新順序可先從 moedict-data(原始/整理資料)→ moedict-process(資料轉換流程)→ moedict-webkit(前端與打包整合)開始檢查。
{ "r2_buckets": [ { "binding": "FONTS", "bucket_name": "<your-fonts-bucket>", "preview_bucket_name": "<your-fonts-bucket-preview>", "remote": true }, { "binding": "ASSETS", "bucket_name": "<your-assets-bucket>", "preview_bucket_name": "<your-assets-bucket-preview>", "remote": true }, { "binding": "DICTIONARY", "bucket_name": "<your-dictionary-bucket>", "preview_bucket_name": "<your-dictionary-bucket-preview>", "remote": true } ], "vars": { "ASSET_BASE_URL": "https://<your-assets-public-domain>", "DICTIONARY_BASE_URL": "https://<your-dictionary-public-domain>" } }