初识Electron,谈谈感悟

最近,想弥补自己在桌面端应用这块的空白,去了解了一下相关的应用技术,最后调研出了如下结果

桌面端框架选型对比

框架 性能 包体积 安全性 开发效率 跨平台能力 学习成本 生态与社区
Native 非常高 非常小 非常安全 不跨平台 很高
Qt 非常高 跨平台
Tauri 很小 跨平台 中等偏小
Flutter 跨平台
NW.js 跨平台 较小
Electron 非常高 跨平台 非常强

最后,经过评估,最终还是选择Electron作为我在这个领域的第一次试手 架构:Chromium + Node.js 优点:Web开发及其友好、生态巨大,成熟稳定 缺点:包体积大、内存占用高

典型应用:Visual Studio Code,桌面端微信,桌面端钉钉等.

一、框架分析

其技术组成如下: Electron=Chromium+Node.js+Native API 整体框架图大概如图下所示

Electron是多进程架构,架构具有以下特点:

  • 由一个主进程和N个渲染进程组成
  • 由主进程承担主导作用,用于完成各种跨平台和原生交互
  • 渲染进程可以是多个,使用Web技术开发,通过浏览器内核渲染页面
  • 主进程和渲染进程通过进程间通信(IPC)来完成各种功能

二、使用

纸面信息介绍完了,来实战跑一个小demo,当然出于个人兴趣爱好,我没有跑一个helloworld就止步了,而是做了一个小小的价格监控模块(最近美伊打仗,黄金涨的还挺高,所以写了一个小功能用来监控黄金的价格)

下面是我的项目目录

是不是还挺像那么回事哈哈,其实核心要点就是

main文件夹下核心index.ts主文件进程

import 复制代码
import path from 'path'
import { initDB } from './db'
import { registerIPC } from './ipc'
import { startScheduler } from './scheduler'
import { readConfig } from './config'

export async function applyProxy(): Promise<void> {
  const { proxyUrl } = readConfig()
  if (proxyUrl) {
    await session.defaultSession.setProxy({ proxyRules: proxyUrl })
    console.log(`[Proxy] Applied: ${proxyUrl}`)
  } else {
    await session.defaultSession.setProxy({ proxyRules: 'direct://' })
    console.log('[Proxy] Direct connection (no proxy)')
  }
}

let mainWindow: BrowserWindow | null = null

function createWindow(): void {
  mainWindow = new BrowserWindow({
    width: 1000,
    height: 700,
    webPreferences: {
      preload: path.join(__dirname, '../preload/index.js'),
      contextIsolation: true,
      nodeIntegration: false
    }
  })

  mainWindow.setTitle('Web3 Monitor')

  // electron-vite: dev 时加载 dev server,production 时加载打包文件
  if (process.env['ELECTRON_RENDERER_URL']) {
    mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
  } else {
    mainWindow.loadFile(path.join(__dirname, '../renderer/index.html'))
  }

  mainWindow.webContents.setWindowOpenHandler((details) => {
    shell.openExternal(details.url)
    return { action: 'deny' }
  })
}

app.whenReady().then(async () => {
  // 1. 初始化数据库
  initDB()

  // 2. 应用代理设置
  await applyProxy()

  // 3. 注册 IPC handlers
  registerIPC()

  // 4. 创建窗口
  createWindow()

  // 5. 启动定时监控
  startScheduler()

  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow()
    }
  })
})

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

preload文件夹下核心的ipc通信文件,index.ts/ (我个人的心里体会哈:这块就像标准的前后端连调,接口层这,不同的是,这里的通信不需要发http,)

js 复制代码
import { contextBridge, ipcRenderer } from 'electron'

const api = {
  // Token CRUD
  getTokens: () => ipcRenderer.invoke('getTokens'),
}
contextBridge.exposeInMainWorld('electronAPI', api)

render代码我这里就不贴出来了,毕竟就是常规的前端代码

最后启动项目后就是一个新开了一个桌面应用一样

三、打包

就如调研的时候,打包真的是个诟病,同一套代码,我试过了mac,windows双平台打包, mac打包的dmg,大小为102.1MB,windows也差不多是这个大小./

如果追求跨端,高性能,低打包体积,建议技术选型还是选择tarui,但就是需要对rust有所了解,下一个桌面端框架笔者就会去研究用用,毕竟打包体积真的很香(嘿嘿)

相关推荐
前端Hardy5 分钟前
前端工程师必备的 10 个 AI 万能提示词(Prompt),复制直接用,效率再翻倍!
前端·javascript·面试
BioRunYiXue9 分钟前
Nature Methods:CellVoyager 自主 AI 智能体开启生物数据分析新时代
大数据·开发语言·前端·javascript·人工智能·数据挖掘·数据分析
再玉米地里吃过亏1 小时前
ONENET平台API鉴权错误
前端
网络点点滴1 小时前
Vue3中Suspense的使用
前端·javascript·vue.js
饼干哥哥1 小时前
搭建一个云端Skills系统,随时随地记录TikTok爆款
前端·后端
酉鬼女又兒2 小时前
零基础快速入门前端Web存储(sessionStorage & localStorage)知识点详解与蓝桥杯考点应用(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·职场和发展·蓝桥杯·html
DanCheOo2 小时前
# 从"会用 AI"到"架构 AI":高级前端的认知升级
前端·ai编程
社恐的下水道蟑螂2 小时前
前端面试必问 Git 通关指南:常用命令速查 + merge/rebase 深度辨析,看完再也不慌
前端·git·面试
None3212 小时前
NestJS 流式文件上传实践:从 Multer 到 Busboy 的进阶之路
前端·后端
海浪浪2 小时前
Symbol 产生的背景以及应用场景
前端·javascript