はじめに
- Electron + Vue.js + NeDB でデスクトップアプリを開発しています(
Vuex
は現時点では未導入) - フォームから入力したデータを
NeDB
にてローカルファイルに永続化します
やりたいこと
- いわゆる常駐型アプリ化で、ウィンドウを閉じてもトレイアイコン が残り、バックグラウンドで動作し続ける機能を追加したいです(また、トレイアイコン のコンテキストメニューから、任意にウィンドウを復元できるようにします)
- ウィンドウ(renderer)でデータを入力し、それを元にバックグラウンド(main)で処理を行いたいです(main 〜 renderer間でのストアの共有)
問題点
- 開発当初は、何も考えずに renderer 側で NeDB をストアとして利用していましたが、
ウィンドウからNeDBに登録したデータをバックグラウンド側で取得できないことに気付きました。(アプリを再起動すれば、バックグラウンドからも取得出来ましたが、再度ウィンドウからデータを登録したデータは、やはり次回再起動時まで、バックグラウンドからは取得出来ませんでした)
- 恐らくこれはNeDBの仕様で、起動時に1つのインスタンスにファイルから読みだしたデータをオンメモリで展開し、起動中は全てオンメモリで操作。終了時にファイルに初めてファイルに書き出す。といった処理をしているからだと思います。
やってみたこと
- 実際には細かくコンポーネント化してたりするので実際のコードとは異なりますが、大体下記の様なイメージです。現時点では
Vuex
は未導入です。 - また、
Vuex
とipcMain
、ipcRenderer
を使ってごにょごにょ出来ないかと模索中なのですが、行き詰まったので今回質問させて頂きました。
renderer.js
js
1import Datastore from 'nedb' 2import path from 'path' 3import { remote } from 'electron' 4const db = new Datastore({ 5 autoload: true, 6 filename: path.join(remote.app.getPath('userData'), '/data.db') 7}) 8const data = { 9 name: 'hogehoge' 10} 11// データを保存 12db.insert(data, function(err, newData) { 13 if (err) { 14 console.error(err) 15 } 16})
main.js
js
1 2import Datastore from 'nedb' 3import path from 'path' 4import { app } from 'electron' 5const db = new Datastore({ 6 autoload: true, 7 filename: path.join(app.getPath('userData'), '/data.db') 8}) 9// トレイアイコン のコンテキストメニューより、任意のタイミングで実行 10db.find({}, function(err, data) { 11 console.log(data) // 空っぽ(renderer.jsから登録した“hogehoge”が見つからない) 12})
あなたの回答
tips
プレビュー