electron的一些认识
electron_2">一、electron是什么
Electron 是一个使用 JavaScript、HTML 和 CSS 构建桌面应用的框架,用来创建可在 Windows、mac 和 Linux 上运行的跨平台应用,说白了这个桌面应用就是包含Chromium和nodejs的浏览器套壳
市面上electron开发的软件有vs code、github desktop和markdown工具Typora等等
electron_7">二、electron的应用进程管理
在 Electron 中,应用程序通常由两个主要的进程组成:主进程(Main Process)和渲染进程(Renderer Process)。
-
主进程是 Electron 应用的入口点,通常在 main.js 文件中定义。主进程的主要职责包括:
- 创建窗口:使用 BrowserWindow 模块创建和管理浏览器窗口。
- 管理应用生命周期:使用 app 模块处理应用的启动、关闭、打开文件等事件。
- 处理系统事件:监听系统级别的事件,如窗口关闭、应用激活等。
- 跨进程通信:使用 ipcMain 模块与渲染进程进行通信。
-
渲染进程负责渲染用户界面,通常在 index.html 和 renderer.js 文件中定义。渲染进程的主要职责包括:
- 渲染用户界面:使用 HTML、CSS 和 JavaScript 构建用户界面。
- 处理用户交互:响应用户的点击、输入等事件。
- 跨进程通信:使用 ipcRenderer 模块与主进程进行通信。
- 使用 Node.js API:在渲染进程中直接使用 Node.js API,但需要注意安全性和性能问题。
electron_22">三、关于electron应用进程的一些示例
1、主进程(main.js)
javascript">const { app, BrowserWindow, ipcMain } = require('electron');
const path = require('path');function createWindow() {const win = new BrowserWindow({width: 800,height: 600,webPreferences: {nodeIntegration: true,contextIsolation: false,preload: path.join(__dirname, 'preload.js') // 预加载脚本}});win.loadFile('index.html');
}app.on('ready', createWindow);app.on('window-all-closed', () => {if (process.platform !== 'darwin') {app.quit();}
});app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) {createWindow();}
});// 处理来自渲染进程的消息
ipcMain.on('message-from-renderer', (event, arg) => {console.log('Message from renderer:', arg);event.reply('message-from-main', 'Hello from main process!');
});
2、渲染进程(renderer.js)
javascript">const { ipcRenderer } = require('electron');// 发送消息到主进程
document.getElementById('send-button').addEventListener('click', () => {ipcRenderer.send('message-from-renderer', 'Hello from renderer process!');
});// 接收主进程的消息
ipcRenderer.on('message-from-main', (event, arg) => {console.log('Message from main:', arg);
});
3、预加载脚本(preload.js)
预加载脚本用于在渲染进程中暴露一些安全的 API,同时限制对 Node.js API 的直接访问。
javascript">const { contextBridge, ipcRenderer } = require('electron');contextBridge.exposeInMainWorld('electron', {sendMessage: (channel, data) => {ipcRenderer.send(channel, data);},receiveMessage: (channel, func) => {ipcRenderer.on(channel, (event, ...args) => func(...args));}
});
4、跨进程通信
Electron 提供了 ipcMain 和 ipcRenderer 模块来实现主进程和渲染进程之间的通信。
1. 主进程发送消息到渲染进程:
javascript">// 主进程
const { ipcMain } = require('electron');
ipcMain.on('message-from-renderer', (event, arg) => {event.reply('message-from-main', 'Hello from main process!');
});
2. 渲染进程发送消息到主进程:
javascript">// 渲染进程
const { ipcRenderer } = require('electron');
ipcRenderer.send('message-from-renderer', 'Hello from renderer process!');
3. 渲染进程接收主进程的消息:
javascript">// 渲染进程
ipcRenderer.on('message-from-main', (event, arg) => {console.log('Message from main:', arg);
});