C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

Electron アプリに electron-store で設定ファイル機能を追加する場合の example & tips 的なメモ

GitHub - sindresorhus/electron-store: Simple data persistence for your Electron app or module - Save and load user preferences, app state, cache, etc を使うメモです。

public/conf.js とか適当に作る例:

const path = require("path");
const store = require("electron-store");

const store_conf = {
 // https://www.npmjs.com/package/electron-store#schema
 schema: {
  // 'foo'でアクセスできる
  foo: {
   type: typeof 0,
   maximum: 100,
   minimum: 1,
   default: 50,
  },
  // 'bar'でアクセスできる
  bar: {
   type: typeof "",
   format: "url",
   default: "https://example.com/",
  },
  // 'window' でアクセスできる Object
  window: {
   type: typeof {},
   // Object は明示的に default: {} を与えておかないと子要素のdefaultがあっても取り出せないとか起こるので注意します
   default: {},
   // Object の子要素は properties で定義します
   properties: {
    // 'window.width' でアクセスできる
    width: {
     type: typeof 0,
     maximum: Number.MAX_SAFE_INTEGER,
     minimum: 480,
     default: 960,
    },
    // 'window.height' でアクセスできる
    height: {
     type: typeof 0,
     maximum: Number.MAX_SAFE_INTEGER,
     minimum: 270,
     default: 540,
    },
   },
  },
 },
 // https://www.npmjs.com/package/electron-store#migrations
 migrations: {},
};

module.exports = new store(store_conf);
  • Note:
    • schamaJSON で表現できるけれど、JSONで分離すると key にわざわざ " を付けなければならないとか Number.MAX_SAFE_INTEGERtypeof ''のような定義方法を使えない制限が生じて不便かもしれません。分離する場合も .js にしておくと便利が良さそうです。
    • schema に Object を入れ、その子要素へ default を設定したい場合は親となる Object で default: {} しておかないと子要素の default を取り出せなくなるので注意する必要があります。

public/conf.js を使う例( public/electron.js エントリーポイントを想定 ):

const electron = require("electron");
const app = electron.app;
const browser_window = electron.BrowserWindow;

const conf = require("./conf.js");

let main_window;

function createWindow() {
 app.allowRendererProcessReuse = false;

 main_window = new browser_window({
  width: conf.get("window.width"),
  height: conf.get("window.height"),
  webPreferences: { preload: `${__dirname}/preload.js` },
 });

 // (...abbr...; 後略)