用 antigravity 製作中文部件查詢網頁

AI 太神奇了, 在開發的過程, 會測試的過程也是全自動的, 驗證的過程也會自動去截圖檢查.

目前版本就可以執行的很順暢, 如果持續與 AI 對話, 應該系統的執行效率可以再大大的改善, 不過可以動動手指就寫出來好專業的網站, 現在的 AI 非常厲害.

新的工具(antigravity) 對程式小白(不懂寫程式的麻瓜) 非常友善.

遇到的問題, 建議先在外部的瀏覽器, 用不會浪費額度的 AI 問, 瀏覽器 AI 沒辦法處理的與程式高度相依性高的問題, 才在 antigravity 的 IDE 裡提問.

antigravity 運算的額度剩下多少與額度重置時間剩下多久, 可以在 extension 的安裝視窗輸入關鍵字 quota, 安裝好 extension 之後, 想檢視運算額度, 啟動方式在 antigravity IDE 的最右下角。


製作出來的結果: https://dictionary.max-everyday.com/

在 antigravity 輸入的對話:

生成一個查詢中文字 "部件" 查詢用網站, 使用者輸入部件的關鍵字, 可以查詢放置在 web server 上的 dictionary.json 中的所有符合部件的文字清單顯示在網頁上, 點擊查詢結果的字之後, 可以觀看該字在 dictionary.json 中的完整資訊. 
如何使用該 dictionary.json 可以參考 chinese_dictionary.py 與 find_component.py

YouTube 解說: https://youtu.be/2H79xUDXaSE


antigravity 的規畫:

中文部件查詢網站 – 完成報告

成功建立了一個中文部件查詢網站,使用者可以輸入部件關鍵字來搜尋包含該部件的所有漢字,並查看每個漢字的完整資訊。

建立的檔案

網站架構

c:\Max\dictionary\web\
├── index.html      # 主頁面結構
├── styles.css      # 樣式表 (暗色主題)
├── app.js          # 應用程式邏輯
├── server.py       # 本地 HTTP 伺服器
└── Dictionary.json # 字典資料 (自動從上層目錄複製)

功能展示

1. 首頁介面

網站採用現代暗色主題設計,包含搜尋框和熱門部件快捷按鈕:

2. 搜尋結果

輸入部件「木」後,搜尋到 966 個包含該部件的漢字:

3. 漢字詳細資訊

點擊任意漢字可查看完整資訊,包括:

  • 基本資訊(Unicode、部首、筆畫數)
  • 部件組成
  • 普通話發音(拼音 & 注音)
  • 粵語、閩南語、客家話發音
  • 異體字和語義變體

技術特點

特性說明
響應式設計支援桌面和行動裝置
效能優化搜尋結果限制顯示 500 個以確保流暢性
動畫效果卡片淡入、懸停效果、彈窗動畫
字典規模支援 81,052 個漢字,其中 19,823 個有部件資料

如何使用

啟動伺服器

cd c:\Max\dictionary\webpython server.py

伺服器會自動:

  1. 複製 Dictionary.json 到 web 目錄
  2. 在 http://localhost:8000 啟動服務
  3. 自動開啟瀏覽器

搜尋操作

  1. 在搜尋框輸入部件(如「木」、「水」、「火」)
  2. 點擊搜尋按鈕或按 Enter
  3. 點擊結果中的任意漢字查看詳情

驗證結果

  • ✅ 網站成功載入 81,052 個漢字的字典資料
  • ✅ 搜尋「木」找到 966 個符合的漢字
  • ✅ 漢字詳情正確顯示所有欄位
  • ✅ UI 動畫和互動效果正常運作

優化執行效率

這個專案有一個約 31.6 MB 的 Dictionary.json 檔案,目前在 app.js 的 loadDictionary() 方法中是一次性完整載入整個 JSON 檔案。這會導致:

  1. 初始載入時間長 – 整個 31MB 的 JSON 需要完全下載並解析
  2. 記憶體佔用高 – 所有資料都存在記憶體中

以下是我建議的優化方案:

優化方案

1. 使用 Gzip 壓縮 (最簡單有效)

讓伺服器啟用 gzip 壓縮,JSON 可以壓縮到原本的 10-20%

2. 索引預處理 (需要後端支援)

將 JSON 拆分成索引檔和資料檔,先載入索引,按需載入資料

3. Web Worker 解析 (前端優化)

將 JSON 解析移到 Web Worker,避免阻塞主線程

4. 建立部件索引 (搜尋優化)

預先建立部件到漢字的映射,加速搜尋


如果只針對前端修改,我可以實作以下優化:

  1. 使用 Web Worker 解析大型 JSON,避免 UI 凍結
  2. 建立部件索引結構,將 O(n) 搜尋優化為 O(1) 查表
  3. 增加載入進度提示,改善使用者體驗

你希望我實作哪些優化?或者你有其他想法?


上面的運算都是透過 client side compute, 改成使用 server side comput.

JSON Loading Optimization – Server-Side Processing

Move search and decompose logic to PHP backend. Frontend no longer loads the 31MB dictionary.

User Review Required

IMPORTANT

Architecture Change: Frontend becomes a thin client. All dictionary operations happen on the server via API calls.

Proposed Changes

Backend (PHP)

[NEW] api.php

Endpoints:

ActionParametersResponse
searchkeywordMatching characters with data
decomposetextDecomposed components
detailcharFull character data

Features:

  • Load dictionary once per request (PHP opcache can optimize)
  • Use search_index.json for O(1) search
  • Gzip output via ob_gzhandler

Frontend

[MODIFY] app.js

- this.dictionary = await response.json();  // Load 31MB- const results = this.searchByComponent(keyword); // Client-side search+ const response = await fetch(`api.php?action=search&keyword=${keyword}`);+ const results = await response.json(); // Server returns results only

Changes:

  • Remove loadDictionary() – no longer needed
  • Remove client-side searchByComponent() – moved to PHP
  • Remove client-side decomposeInput() logic – moved to PHP
  • Add API calls for search, decompose, detail

Data Preprocessing

[KEEP] optimize_data.py

  • Still generates search_index.json for PHP to use

Verification Plan

  1. Deploy to Apache/Ubuntu
  2. Test API endpoints via browser/curl
  3. Verify search response time < 200ms
  4. Verify gzip Content-Encoding in response headers

已完成實作。

系統架構已更改為 Server-Side Rendering (Logic) 模式:

  1. 後端 (api.php):
    • 負責讀取 Dictionary.json 和 search_index.json
    • 處理 search (搜尋部件)、decompose (拆解漢字) 和 detail (顯示詳情) 的請求。
    • 支援 Gzip 輸出以節省頻寬。
  2. 前端 (app.js):
    • 不再下載巨大的字典檔。
    • 搜尋與拆解功能改為發送 fetch 請求至 api.php。
    • 大幅提升 index.html 的初始載入速度。
  3. 資料預處理:
    • 已執行 optimize_data.py 產出 search_index.json,供 PHP 快速查詢使用。

請參考 DEPLOYMENT.md 將檔案部署至您的 Ubuntu Apache 伺服器。


下一個遇到的問題是 json 檔太大, 又沒效率,

The memory exhaustion error was caused by api.php trying to load the entire 33MB Dictionary.json file into memory.

To resolve this, I have:

  1. Converted Data to SQLite: Updated optimize_data.py to generate an SQLite database (dictionary.db) from Dictionary.json. I ran this script, and the database file (approx. 35MB) has been created.
  2. Optimized api.php: Rewrote the backend script to strictly use the new SQLite database.
    • It no longer loads Dictionary.json.
    • It uses search_index.json (small, ~600KB) for fast searching.
    • It queries dictionary.db only for the specific characters needed (for search results, details, or decomposition).

This approach drastically reduces memory usage, as PHP now only holds the data for the few characters being displayed at any one time, rather than the entire dictionary. The error should be resolved.

Facebook網友回應

您可能也會感興趣的文章...

台灣或海外用戶註冊百度帳號、手機驗證教學

生活小事

由於百度雲上的資源太多,目前台灣地區申請需要使用下面的隱藏版超連結: https://passport.baidu.com/v2/?reg&u=http://pa […]

Read More

LINE 免費貼圖 2022-02-22

生活小事

瘋狂的古人們,畫風好酷哦! 寒流來襲房間內太冷也可能有猝死風險,使人的身體血管收縮,血壓升高,心率加快,心臟工作負荷增大,耗氧量增多,嚴重時心肌就會缺血、缺氧猝死。其二是 […]

Read More

看蟲走路也可以很開心

生活小事

小孩和蠶寶寶玩,時間流逝的速度跟著蠶寶寶的動作一樣變慢。 我好奇的是,為什麼小孩覺得看一隻蟲走來走來走去很好玩?大部份的大人卻不會想去看蟲走路?是不是大人在長大的過程裡, […]

Read More

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *