首页 > 解决方案 > 在我的 Electron 应用程序中,我在哪里执行我的首次启动功能?

问题描述

我正在使用 Electron 9,我有一个主进程和一个渲染进程。在我的应用程序第一次启动时,我想执行一些在第二次运行时未执行的代码。

Electron 是否有专门的位置我应该这样做?非常感谢任何帮助!

标签: node.jselectron

解决方案


  1. 使用app.getPath('userData')- 它是当前用户的应用程序数据的专用位置(例如,在 Windows 中它将指向类似的东西AppData/Roaming/app-name/
  2. 启动时使用:
app.on('ready', () => {
  const firstTimeFilePath = path.resolve(app.getPath('userData'), '.first-time-huh');
  let isFirstTime;
  try {
    fs.closeSync(fs.openSync(firstTimeFilePath, 'wx'));
    isFirstTime = true;
  } catch(e) {
    if (e.code === 'EEXIST') {
      isFirstTime = false;
    } else {
      // something gone wrong
      throw e;
    }
  }

  // ...
});
  1. 利润!

https://nodejs.org/api/fs.html#fs_file_system_flags - 为什么使用wx标志 https://nodejs.org/api/fs.html#fs_fs_opensync_path_flags_mode - fs.openSync() https://www.electronjs.org/docs/api/app #appgetpathname -app.getPath()

如果您想在第一次运行时写出默认首选项并在下次运行时读取它们,请尝试以下操作:

import defaults from './default_preferences.json'; // will work for plain js objects too

let prefs = defaultPrefs;

app.on('ready', () => {
  const prefsPath = path.resolve(app.getPath('userData'), 'prefs.json');
  let isFirstTime;
  try {
    fs.writeFileSync(prefsPath, JSON.stringify(defaultPrefs), { flag: 'wx' });
    isFirstTime = true;
  } catch (e) {
    if (e.code === 'EEXIST') {
      // slight posibility of races, you can eleminate it by using `singleInstanceLock` or waiting loop for `write` flag
      prefs = require(prefsPath);
      isFirstTime = false;
    } else {
      // something gone wrong
      throw e;
    }
  }

  ...
});

推荐阅读