0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

Electron 核心概念

修罗 2022-11-28 718 0条评论 electron

首页 / 正文

Electron 核心概念

Electron 主进程与渲染进程

主进程:启动项目时运行的 main.js 脚本就是我们说的主进程。主进程只有一个。

渲染进程:每个 Electron 的页面都在运行着自己的进程,这样的进程称之为渲染进程(基于Chromium的多进程结构)。

image-20221128165951711.png

主进程事件生命周期

main process modules/app/event:https://www.electronjs.org/zh/docs/latest/api/app
const { app, BrowserWindow } = require('electron')

const createWindow = () => {
    const win = new BrowserWindow({
        height:600,
        width:900
    })
    win.loadFile('./index.html')
}

// 所有窗口关闭触发
app.on('window-all-closed', () => {
  console.log('window-all-closed')
  // Mac系统关闭窗口时,不要直接退出,mac关闭窗口会在dock栏显示,点击会激活窗口
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

// 退出应用执行
app.on('quit', () => {
  console.log('quit')
})

app.whenReady().then(() => {
  createWindow()
  // 在MacOS下,当全部窗口关闭,点击 dock 图标,窗口再次打开。
  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow()
    }
  })
})

渲染进程如何使用 Node 模块

在渲染进程用node模块,报错:

image-20221128173619299.png

1、通过 webPreferences/nodeIntegration

const win = new BrowserWindow({
  width: 600,
  height: 900,
  webPreferences: {
      nodeIntegration: true,
      contextIsolation: false
  }
})

image-20221128173801164.png

2、通过 webPreferences/preload 实现

https://www.electronjs.org/docs/latest/tutorial/sandbox

const win = new BrowserWindow({
    width: 800,
    height: 400,
    webPreferences: {
      // 在启动应用时在渲染进程里预加载 js
      preload: path.join(__dirname, './preload.js')
    }
  })

有node模块使用限制,比如不能访问fs模块

image-20221128174817242.png

主进程与渲染进程通信

预加载preload.js

定义发送消息函数发送消息给主进程

const { contextBridge, ipcRenderer } = require('electron')

// 定义发送消息函数
const handleSend = async (data) => {
    console.log('渲染进程发送: '+data);
    let fallback = await ipcRenderer.invoke('send-event', data)
    console.log('渲染进程收到: '+fallback);
}

// 暴露给html使用,这里运行完window会有handleSend函数
contextBridge.exposeInMainWorld('exposeVar', {
    handleSend,
})

main.js

const { ipcMain } = require('electron')

// 主进程监听消息并返回消息给发送者
ipcMain.handle('send-event',(event, data)=>{
  // console.log(event,data);
  console.log('主进程收到: '+data);
  return '主进程收到后发送消息'
})

index.html

页面显示

<body>
    <button id="btn">send</button>
    <script src="./script.js"></script>
</body>

script.js

点击按钮发送

document.querySelector('#btn').onclick = (e)=>{
    exposeVar.handleSend('我是渲染进程')
}

image-20221128183339485.png

评论(0)


最新评论

  • https://www.studyglobus.com/author/carroll34a5552/

    Ценники на вывоз мусора сейчас космос, любые лайфхаки по экономии в тему.

  • Richardgrold

    1xbet onlayn kazino platforması ilə vaxtınızı daha səmərəli və maraqlı keçirin. Saytın canlı kazino bölməsi istifadəçilərə fərqli bir dünya təklif edir. Burada canlı dilerli kazino oyunlarının hər bir növünü sınaqdan keçirə bilərsiniz. Krupyelərin peşəkarlığı oyunun dinamikasını və marağını artırır. Müntəzəm olaraq yenilənən oyun siyahısı cansıxıcılığa yol vermir. Hesabınızı artırmaq üçün onlarla fərqli və etibarlı üsul mövcuddur. Qazanılan pullar cəmi bir neçə dəqiqə ərzində şəxsi hesabınıza köçürülür. Aktiv fəaliyyətinizə görə fərdi bonuslar və hədiyyələr qazana bilərsiniz. Dəstək xidməti həm çat, həm də e-poçt vasitəsilə kömək göstərir. 1xbet ailəsinə qoşulun və böyük uduşlar üçün ilk addımı atın. onlayn kazino

  • 砂岩白丘

    我一直梦想, 看到你们相册那样的地方。真棒。

  • 城市地標

    我喜欢, 这里分享真实经验。你的项目 就是 属于这里的。请继续。

  • 宗教地標

    我热爱这样的想法, 去那么多国家。真的很鼓舞。

  • 觀景高地

    能感受到热爱。继续保持 感受。

  • 最佳季節

    我关注这样的资源, 写得很实在。你的网站 就是 属于这里的。加油。

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

日历

2026年07月

   1234
567891011
12131415161718
19202122232425
262728293031 

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis