萌典(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):
rclone sync data/dictionary/ r2:<your-dictionary-bucket>/ \
--progress --transfers=16 --checkers=32 --fast-list說明:
- 專案會使用
pack/pcck/phck/ptck,也會讀取a/、c/與根目錄下@*.json、=*.json等檔案。 - 只上傳部分目錄會導致部首表、分類索引或搜尋功能不完整。
本 repo 的範本檔名是 wrangler.jsonc.examaple(注意拼字)。
cp wrangler.jsonc.examaple wrangler.jsonc接著修改以下欄位:
r2_buckets[*].bucket_namer2_buckets[*].preview_bucket_namevars.ASSET_BASE_URLvars.DICTIONARY_BASE_URL
範例:
npm install
wrangler auth login
npm run dev部署:
npm run deploy
# 或
npx wrangler deploycommands/upload_assets.shcommands/upload_dictionary.sh
這兩支腳本可作為參考,但若你使用自訂 bucket 名稱,請先調整腳本中的 bucket 設定,或直接使用上面的 rclone sync 指令。
{ "r2_buckets": [ { "binding": "MOEDICT_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>" } }