系列:用 JavaScript 打造可長期經營的記帳 App:StrawMoneyBook 實戰
賽組:2026 iThome 鐵人賽 · 主題競賽 · JavaScript 組
產品: StrawMoneyBook · 開發者 Wiki
如果記帳 App 只做「新增一筆 → 列表顯示 → 統計本月」,用任何語言都能很快做完。
真正難的是:這份帳本還要在一年、三年後仍然正確、可還原、可升級、可在手機與網頁之間繼續活著。
本系列會以真實產品 StrawMoneyBook 為主線,說明為什麼我會用 JavaScript(Vue 3 + Capacitor + Node.js) 去做這件事,以及「可長期經營」跟「又一個 Todo 記帳器」差在哪裡。
很多入門專案的記帳器,本質上是 Todo List 換皮:
| 特徵 | Todo 記帳器 | 可長期經營的金流工具 |
|---|---|---|
| 資料單位 | 一筆文字 + 數字 | 交易、帳戶、分類、預算、借貸、報銷… 一組關聯 |
| 金額 | Number / 字串隨便存 |
固定用最小貨幣單位(minor),禁浮點 |
| 時間 | 「本月」就好 | 曆月、發薪週期、訂閱週期、跨年遷移 |
| 升級 | 改 schema 就清庫重來 | migration、降版防護、禁止 silent wipe |
| 平台 | 單一網頁 demo | 同一套邏輯要上 Web + Android |
| 失敗模式 | 重整頁面資料沒了 | 備份、還原、共同帳本、完整性掃描 |
Todo 記帳器追求的是「今天能 demo」。
長期經營追求的是「明天使用者升級 App 後,三年前的帳還在,而且語意沒被偷偷改寫」。
後者才是本系列要寫的戰場。
以 StrawMoneyBook 來說,使用者不是只記「今天午餐 120」。真實金流通常會串成流程:
一筆支出
├─ 進入預算與分析
├─ 可報銷 → 進入報銷狀態 → 導入請款單 → 完成後回寫
├─ 借出/借入 → 還款/結清
└─ 預算剩餘 → 自動或手動進存錢罐(不混入可支配餘額)
再加上:
這些需求一出現,App 就不再是「CRUD 列表」,而是一套有不變式(invariants)的作業系統。
所謂不變式,舉幾個本系列後面會反覆出現的例子:
1,234.56,儲存必須是整數 minor(例如分)。Todo 記帳器通常沒有這些不變式;有的話也只寫在 README,沒寫進程式與測試。
坦白說:金流核心邏輯用任何語言都能做。我選 JavaScript,是因為它剛好對上「長期經營」需要的三個現實條件。
StrawMoneyBook 的前端是 Vue 3 + Vite + Pinia + Vue Router,再用 Capacitor 包成 Android App。
這代表:
對小團隊(甚至個人開發)來說,減少「同一功能寫兩次」,比追求某種語言的理論效能更重要。
長期記帳一定會碰到兩種資料場景:
sql.js/sqlite-wasm;Android 端原生 SQLite前後端都在 JS 生態時,型別約定、錯誤碼、測試腳本、發版流程比較容易收斂成同一套工程文化。
本系列後面會寫:哪些該放 Pinia、哪些該進 Service/Repository、哪些絕對不能只活在元件裡。
JS 對金流開發者不算友善:
0.1 + 0.2
Date 時區與跨月邊界這些不是讓我放棄 JS 的理由,反而是系列要正面處理的題目:
用紀律把動態語言做成可維護系統。
如果你只會用 JS 做 Todo,這個系列會刻意把你往「系統」推一把。
這不是從零教 Vue 語法的入門課,也不是純產品行銷文。
StrawMoneyBook 在這裡是:
目前技術棧摘要:
| 區域 | 技術 |
|---|---|
| Frontend | Vue 3、Vite、Pinia、Vue Router |
| App Runtime | Capacitor 8、Android |
| Local Data | SQLite / sql.js / WASM |
| Backend | Node.js、better-sqlite3 |
| 品質 | Node test runner、Playwright、版本閘門 |
你不需要先裝好整套環境也能讀;但每篇都會盡量給「可對應回真實專案決策」的程式碼與架構說明。
粗分五個階段:
起手(架構與狀態)
為什麼帳本是上下文、Pinia/Service 怎麼切、Vite monorepo 怎麼撐開發體驗。
本機資料與不變式
minor 金額、migration、降版防護、recovery backup、完整性掃描。
金流業務建模
三種記帳入口、發薪週期預算、借貸、報銷請款、存錢罐、訂閱。
跨端與同步
Capacitor 邊界、共同帳本 API、Drive/WebDAV、銀行/載具同步的分層。
品質與收斂
Playwright、版本號策略、更新鏈、以及「治本不治標」的工程文化總結。
每一篇會盡量固定這個寫法:
今日問題 → 設計取捨 → 程式碼/流程 → 踩坑 → 可複用結論
明天開始會進入產品地圖:從「活動帳本」看 StrawMoneyBook 的功能切分,以及前端路由/Store 如何反映這個世界觀。
| 項目 | 內容 |
|---|---|
| 問題 | 為什麼不要再做 Todo 式記帳器? |
| 答案 | 真實金流是流程與不變式,不是單筆 CRUD |
| 技術立場 | Vue 3 + Capacitor + Node.js,用 JS 覆蓋跨端與後端 |
| 系列目標 | 用 StrawMoneyBook 示範可長期維護的 JavaScript 實戰 |
如果你也在用 JS 做「會活很久」的產品,歡迎之後在文章底下留言你最怕的坑:金額、同步、還是升級。
我們下篇見。