dromara/electron-egg 应用设计模式:单例 vs 多实例

dromara/electron-egg 应用设计模式:单例 vs 多实例

【免费下载链接】electron-egg A simple, cross platform, enterprise desktop software development framework 【免费下载链接】electron-egg 项目地址: https://gitcode.com/dromara/electron-egg

在企业级桌面应用开发中,应用程序的实例管理策略直接影响用户体验与系统资源利用率。dromara/electron-egg 作为跨平台桌面软件开发框架,通过灵活的配置项与生命周期管理机制,支持单例(Single Instance)与多实例(Multiple Instances)两种运行模式。本文将深入剖析这两种模式的实现原理、适用场景及切换方法,帮助开发者根据业务需求做出最优选择。

核心概念与应用场景对比

单例模式(Single Instance)

单例模式确保应用程序在系统中仅运行一个实例,新启动的请求会被导向已存在的实例。这种模式适用于需要独占系统资源(如硬件设备访问、数据库连接)或避免数据冲突(如文档编辑锁定)的场景。

典型应用场景

  • 即时通讯工具(如企业内部 IM)
  • 系统监控面板
  • 独占式设备管理软件

多实例模式(Multiple Instances)

多实例模式允许同时运行多个独立的应用实例,每个实例拥有独立的内存空间与进程资源。这种模式适用于需要并行处理不同任务或打开多个独立文档的场景。

典型应用场景

  • 文本编辑器(如同时编辑多个文件)
  • 多账户客户端(如同时登录多个企业账号)
  • 多任务并行处理工具

实现原理与框架支持

配置驱动的模式切换

electron-egg 通过配置文件中的 singleLock 字段控制实例模式,该配置位于 electron/config/config.default.js

// 默认配置:单例模式
module.exports = () => {
  return {
    singleLock: true,  // true=单例模式,false=多实例模式
    windowsOption: {
      // 窗口配置...
    }
    // 其他配置...
  }
}

配置优先级

生命周期管理机制

框架的实例控制逻辑由生命周期管理器 electron/preload/lifecycle.js 实现,通过 getMainWindow() 方法获取主窗口实例:

// 窗口就绪后显示逻辑
async windowReady() {
  logger.info('[lifecycle] window-ready');
  const { windowsOption } = getConfig();
  if (windowsOption.show == false) {
    const win = getMainWindow();  // 获取主窗口实例
    win.once('ready-to-show', () => {
      win.show();
      win.focus();
    })
  }
}

进程通信与实例协调

在单例模式下,新启动的应用实例会通过 Electron 的 app.requestSingleInstanceLock() API 检测现有实例,并通过 IPC(Inter-Process Communication)机制传递启动参数。框架的主进程入口 electron/main.js 负责初始化应用上下文:

const { ElectronEgg } = require('ee-core');
const { Lifecycle } = require('./preload/lifecycle');

// 应用初始化
const app = new ElectronEgg();
app.register("ready", life.ready);
app.register("electron-app-ready", life.electronAppReady);
app.run();

模式切换实战指南

切换为多实例模式

  1. 修改配置文件,设置 singleLock: false
// 多实例模式配置 [electron/config/config.local.js]
module.exports = () => {
  return {
    singleLock: false,  // 禁用单例锁
    openDevTools: true  // 开发环境启用调试工具
  };
}
  1. 启动多个实例验证:
# 终端1:启动第一个实例
npm run dev

# 终端2:启动第二个实例
npm run dev

单例模式下的参数传递

singleLock: true 时,新实例的启动参数会通过 second-instance 事件传递给主实例,可在 electron/main.js 中监听该事件:

// 主进程中监听新实例请求
app.on('second-instance', (event, commandLine, workingDirectory) => {
  // 聚焦到已存在的主窗口
  const mainWindow = getMainWindow();
  if (mainWindow) {
    if (mainWindow.isMinimized()) mainWindow.restore();
    mainWindow.focus();
  }
  // 处理新实例传递的参数
  logger.info('New instance args:', commandLine);
});

多场景应用案例

企业 IM 客户端(单例模式)

企业即时通讯工具需要确保消息接收的实时性与会话状态的一致性,单例模式是最佳选择。框架的单例配置配合 public/images/im-p1.png 所示的会话窗口设计:

企业IM单例界面

多文档编辑器(多实例模式)

代码编辑器类应用需要支持同时编辑多个文件,多实例模式配合窗口复用策略可实现高效开发体验。参考界面设计 public/images/vue-antd.png

多文档编辑界面

混合模式应用

某些复杂应用需要同时支持两种模式,可通过命令行参数动态切换:

// 动态模式切换示例
if (process.argv.includes('--multi-instance')) {
  config.singleLock = false;
}

性能与资源占用对比

指标单例模式多实例模式
内存占用低(共享进程资源)高(每个实例独立占用)
启动速度快(仅首次启动加载资源)慢(每次启动重新加载)
资源竞争无(中央实例协调)有(需手动处理冲突)
崩溃影响范围全局(单个实例崩溃)局部(单个实例不受影响)
进程间通信复杂度低(同一进程内调用)高(需 IPC/共享内存)

最佳实践与注意事项

单例模式最佳实践

  1. 状态集中管理:使用框架提供的全局存储管理应用状态
  2. 实例通信优化:通过 ipcRenderer 实现渲染进程与主进程通信 frontend/src/utils/ipcRenderer.js
  3. 异常恢复机制:实现实例崩溃自动重启逻辑

多实例模式注意事项

  1. 数据隔离:不同实例使用独立的用户数据目录 --user-data-dir
  2. 端口冲突:网络服务(如 socketServer)需动态分配端口
  3. 资源限制:通过操作系统设置进程资源配额,避免系统过载

总结与展望

electron-egg 提供的实例管理机制为企业级桌面应用开发提供了灵活选择:单例模式适合资源独占型应用,多实例模式适合并行任务处理。通过配置驱动的设计,开发者可轻松实现模式切换,并借助框架的生命周期管理与窗口控制能力,构建高质量的跨平台应用。

随着框架的持续演进,未来可能引入更精细化的实例控制策略,如实例池管理、动态资源分配等高级特性。开发者可关注 README.zh-CN.md 获取最新更新。

扩展学习资源

【免费下载链接】electron-egg A simple, cross platform, enterprise desktop software development framework 【免费下载链接】electron-egg 项目地址: https://gitcode.com/dromara/electron-egg

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值