Electron 项目开机自启动

app.setLoginItemSettings 与 auto-launch 对比分析

一、稳定性对比

1. app.setLoginItemSettings

  • 优点:作为Electron官方API,有官方维护和支持
  • 缺点
    • 在某些Windows版本上存在已知问题
    • 部分Windows 10/11更新后可能失效
    • 在macOS权限更严格的版本上可能需要额外授权
    • 不支持Linux

2. auto-launch

  • 优点
    • 针对各平台做了特殊适配(Windows用注册表,macOS用Launch Services,Linux用.desktop文件)
    • 对系统权限问题有更好的处理和反馈
    • 经过多年实践验证,在各种系统环境下更稳定
  • 缺点
    • 依赖第三方库,理论上有维护风险(但该库活跃度良好)

二、易用性对比

1. app.setLoginItemSettings

typescript 复制代码
// 设置自启动
app.setLoginItemSettings({
  openAtLogin: true,
  openAsHidden: false
})

// 检查状态 - 没有Promise支持
const status = app.getLoginItemSettings()
console.log('是否自启动:', status.openAtLogin)

2. auto-launch

typescript 复制代码
// 创建实例
const autoLauncher = new AutoLaunch({
  name: app.getName(),
  path: app.getPath('exe')
})

// 检查状态 - 支持Promise
const isEnabled = await autoLauncher.isEnabled()

// 启用/禁用 - 链式调用友好
autoLauncher.isEnabled()
  .then(isEnabled => {
    if (!isEnabled) return autoLauncher.enable()
  })
  .then(() => console.log('自启动已启用'))
  .catch(err => console.error('操作失败', err))

三、功能对比

功能 app.setLoginItemSettings auto-launch
Windows支持
macOS支持
Linux支持
Promise支持
错误处理 有限 完善
状态检查 简单 完善
隐藏启动 ✅ (macOS 已弃用)
维护状态 官方维护 社区活跃

四、实际使用

1. auto-launch.ts 文件

shell 复制代码
pnpm install auto-launch
typescript 复制代码
import AutoLaunch from 'auto-launch'
import { app } from 'electron'
import log from 'electron-log/main'

/**
 * 设置应用开机自启动
 * @param enable 是否启用自启动,默认为true
 */
export function setupAutoLaunch(enable: boolean = true): void {
  const autoLauncher = new AutoLaunch({
    name: app.getName(),
    path: process.execPath,
  })

  if (enable) {
    autoLauncher.isEnabled()
      .then((isEnabled) => {
        if (!isEnabled) {
          autoLauncher.enable()
            .then(() => log.info('已启用自启动'))
            .catch(err => log.error('启用自启动失败:', err))
        }
        else {
          log.info('自启动已经启用')
        }
      })
      .catch(err => log.error('检查自启动状态失败:', err))
  }
  else {
    autoLauncher.isEnabled()
      .then((isEnabled) => {
        if (isEnabled) {
          autoLauncher.disable()
            .then(() => log.info('已禁用自启动'))
            .catch(err => log.error('禁用自启动失败:', err))
        }
        else {
          log.info('自启动已经禁用')
        }
      })
      .catch(err => log.error('检查自启动状态失败:', err))
  }
}

2. 在 main/index.ts 文件中使用

typescript 复制代码
import { setupAutoLaunch } from './utils/auto-launch'

async function electronAppInit() {
  log.info('主进程已启动')
  
  // 设置应用自启动
  setupAutoLaunch(true)

  app.on('window-all-closed', () => {
    if (process.platform !== PLATFORM.DARWIN) {
      log.info('主进程已关闭')
      app.quit()
    }
  })
}

3. 体验

实际开发中,auto-launch 提供了更一致的开发体验:

  1. 错误处理更清晰 :当遇到权限问题时,auto-launch 提供明确的错误信息,而 app.setLoginItemSettings 可能静默失败
  2. Windows兼容性更好 :Windows系统更新频繁,auto-launch 通过直接操作注册表提供了更稳定的行为
  3. 跨平台一致性 :如果你的应用需要支持Linux,只能选择 auto-launch
  4. 代码组织更清晰:Promise支持让异步操作处理更优雅

五、结论

综合稳定性和易用性考虑,推荐使用 auto-launch,特别是:

  1. 如果你的应用需要支持Linux
  2. 如果你重视更好的错误处理和用户反馈
  3. 如果你的应用在Windows平台有较多用户(Windows更新可能影响原生API)

app.setLoginItemSettings 更适合简单场景,或者你特别关注减少依赖项的情况。但整体而言,auto-launch 提供了更可靠和一致的开发体验。

相关推荐
paopaokaka_luck5 分钟前
基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
前端·javascript·vue.js·spring boot·后端·小程序·uni-app
患得患失94938 分钟前
【前端】【vscode】【.vscode/settings.json】为单个项目配置自动格式化和开发环境
前端·vscode·json
飛_41 分钟前
解决VSCode无法加载Json架构问题
java·服务器·前端
YGY Webgis糕手之路3 小时前
OpenLayers 综合案例-轨迹回放
前端·经验分享·笔记·vue·web
90后的晨仔3 小时前
🚨XSS 攻击全解:什么是跨站脚本攻击?前端如何防御?
前端·vue.js
Ares-Wang3 小时前
JavaScript》》JS》 Var、Let、Const 大总结
开发语言·前端·javascript
90后的晨仔4 小时前
Vue 模板语法完全指南:从插值表达式到动态指令,彻底搞懂 Vue 模板语言
前端·vue.js
德育处主任4 小时前
p5.js 正方形square的基础用法
前端·数据可视化·canvas
烛阴4 小时前
Mix - Bilinear Interpolation
前端·webgl
90后的晨仔4 小时前
Vue 3 应用实例详解:从 createApp 到 mount,你真正掌握了吗?
前端·vue.js