什么是 數據持久化?
數據持久化其實就是指期望把數據長期存儲下來,而這個問題被拆分成很多場合,用這篇記錄一下一些細節和過程。
起因
起因 electron-vue-serialport 使用的 electron-vue 基礎 vue-admin-template 在 yarn run dev 下 js-cookie 正常使用,但 build 后無法獲取存放在 Cookie 中的 token 數據,經過寫入后讀取的測試返回仍然是 undefined 。
這也就說明它可能並非真正的同步模式,考慮到有太多組件的融合,最初判斷是 electron 的 Cookies 炸了,例如需要時間連接本地數據,但可能加載過程過快,無法在獲取 token 前完成數據的載入,也有可能是本來就存在的版本 bug 之類的。
准備解決方案
既然存在 bug ,然后也沒法通過更新環境解決的情況下,就直接改寫之。
- 既然是要 cookie 數據,那就用其他數據模擬一個接口送回即可。
- 既然要持久化數據,考慮到之后也有小型數據庫需求,不妨一起考慮。
於是選取了 pouchdb 和 nedb 做長期存儲,不過此時將失去 Cookies 的過期功能,但好像也並非所要的功能。
實踐結論
為什么我在做儀器類客戶端還需要這個登錄的功能是因為,設備機型的登錄表示你所使用的配置版本,這樣的好處就是統一入口,然后分發不同的功能接口,對於一個公司來說相對規范化整體框架。
最早懷疑是 mock 在 electron 無法工作的原因,后來經過檢查是 build 后的 electron 的 js-cookie 無法工作,然后觀察 js-cookie 的設計模式是同步的,這與上述的數據庫的使用相違背,不得已修正為異步調用。
其中 pouchdb 存在的問題是 electron 的 Windows 32 bit 無法編譯通過,而 pouchdb-browser 存在於 瀏覽器 的 local storage 中無法滿足我需要的本地化文件,就換了 nedb ,辛苦寫了模型對上去后,一切正常工作后。
又產生新的問題,就是 Cookies 數據沒有先於 login 驗證前加載完成,導致需要重新登錄,這是因為 electron 關閉后,要加載數據回來需要的一些異步時間,而頁面啟動后,不可能會允許寫一段毫無意義的延時同步數據(下下策),那么如何解決呢?
回到原點
最后放棄寫垃圾代碼注入其中,改用 vuex 的 vuex-persistedstate 插件,自動在框架內部同步數據,強組件綁定關系。
很意外的是,如果一開始我就想清楚我想要的效果,可能就會少走這些彎路,但實際上也是由於,我並不了解 electron vue nodejs 等數據持久化組件的選取,所以要預先了解和學習一波才能應用到其中。
最后代碼反而刪減了,基本沒有做任何改動,也沒有添加多余的模擬接口注入。
更新在 remove auth Cookies and use vuex-persistedstate
個人感悟
在現代 Javascript 的設計模式上可能要緩存+同步數據,但實際上深度綁定組件的話,可以避開不必要的異步數據同步的問題。
最后,關聯上一篇博文,因為在實踐過程中分析了一下 js 的 import 機制,如果有 python 經驗的可能會有些疑惑是否一致,當然答案是基本一致,可以放心的到處 import 。