Skip to content

a958330481/electron-app

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

electron 事件循环

  • chromium 集成到Node.js:用libuv 实现message pump(nw)
  • Node.js 集成到chromium

为什么开发桌面端

  • 更快捷的入口
  • 离线可用
  • 调用系统能力(通知、硬件...)
  • 安全需求

技术对比

  • 使用Native(C++/C#/OBJECT-C)开发

    • 高性能
    • 原生体验
    • 包体积小
    • 门槛高
    • 迭代速度慢
  • QT

    • 基于C++
    • 跨平台(Mac\Windows\IOS,Android\linux\嵌入式)
    • 高性能
    • 原声体验
    • 门槛高
    • 迭代速度一般
  • NW.js

    • 跨平台
    • 迭代快,web技术构建
    • 源码加密、支持chrome扩展
    • 不错的社区
    • 包体积大
    • 性能一般
  • Electron

    • 跨平台(Mac\Windows\Linux\不支持XP)
    • web技术构建
    • 活跃的社区
    • 大型应用案例
    • 包体积大
    • 性能一般
    • 产品(Atom,slack,vscode,whatsapp,大象)

技术准备

  • 编辑器 vscode
  • nvm 安装node
  • 安装electron

Electron 架构

image

主进程

  • Electron 运行package.jsonmain脚本的进程被称为主进程
  • 每个应用只有一个主进程
  • 管理原生GUI,典型的窗口(BrowserWindow,Tray,Dock,Menu)
  • 获取底层能力:clipboard剪切板, globalShortcut 全局快捷键, desktopCapture获取桌面, shell打开文件、URL
  • 创建渲染进程
  • 控制应用生命周期(app)
  • 常用模块 app, BrowserWindow, ipcMain, Menu, Tray, MenuItem, dialog, Notification, webContents, autoUpdater, globalShortcut, clipboard, crashReporter,shell,nativeImage

image

渲染进程

  • 展示web页面的进程称为渲染进程
  • web页面运行在沙盒环境中,需要通过Node.jsElectron 提供的API跟系统底层交互
  • 一个Electron应用可以有多个渲染进程
  • 常用模块 ipcRenderer, remote, desktopCapture, webFrame, clipboard,crashReporter, shell

📞 通讯模式

  • 目的

    • 通知事件
    • 数据传输
    • 共享数据
  • IPC通信模块

    • 主进程 ipcMain
    • 渲染进程 ipcRenderer
    • ipcMain 和 ipcRenderer 都是EventEmitter对象
    • 用法

    渲染进程 -> 主进程

    // callback写法
    
    // 渲染进程 发送
    ipcRenderer.send(channel,...args)
    
    // 主进程 监听
    ipcMain.on(channel,handler);
    // promise 写法(Electron7.0之后,处理请求 + 响应模式)
    // 使用场景:和主进程通信后,希望能获取到返回结果
    
    // 渲染进程 发送
    ipcRenderer.invoke(channel,...args)
    
     // 主进程 监听
     ipcMain.handle(channel,handler);

    主进程 -> 渲染进程

    // 主进程和渲染进程是一对多的关系:1 -> N
    // 所以需要找到具体的窗体内容(webContents)来发送给指定的渲染进程
    // 主进程 发送
    webContents.send(channel);
    
    // 渲染进程 监听
    ipcRenderer.on(channel,handler)

    渲染进程 -> 渲染进程

    • 通知事件
      • 通过主进程转发(Electron5.0之前)
      • ipcRenderer.sendTo(Electron5.0之后)
    • 数据共享
      • web技术(localStorage、sessionStorage、indexedDB)

    注意事项

    • 少用remote 模块
      • 每次使用remote会触发底层的同步IPC事件,对性能影响较大,有造成进程卡死的风险
    • 不要用sync模式
    • 在请求 + 响应的通信模式下,需要自定义超时限制

对比web开发的优势

- 无浏览器兼容问题
- 最新浏览器Feature
- No PolyFill
- Es 高级语法
- 无跨域问题
- Powered by Node.js

💻 项目实战

  • 番茄时钟

    使用定时器分割出一个一般为25分钟工作时间和5分钟休息时间

    • 流程

      • 应用启动 -> 工作倒计时25分钟 -> 弹出交互通知,询问是否休息 -> 休息倒计时5分钟 -> 弹出通知

🚀 进阶

基础部分

工程部分

原理深入

项目参考

About

🌊🌊🌊 Electron 从0到1

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published