[note] electron 筆記
概念
在 Electron 中分成 main process 和 renderer process:
- renderer process:就像是作用在瀏覽器中的頁面一樣,它沒辦法直接取用到 Node.js 提供的 API
- main process:就如同在 Node.js,它也沒辦法直接取用 DOM API
- preload:另外有一個特別的橋樑, 稱作
preload
,可以透過webPreferences.preload
來設定,它能夠同時存取 Node.js API(main process)和 DOM(renderer process)
main process
一般取名為 main.js
會是 electron 自己執行的檔案:
- 在 Node.js 的環境中執行,可以控制 App 的生命週期、作業系統有關的 UI 和操作、管理 renderer process 等等
main process
const { app, BrowserWindow } = require('electron');
const path = require('path');
// Opening your web page in a browser window
const createWindow = () => {
const win = new BrowserWindow({
width: 800,
height: 600,
// 載入 preload script
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
},
});
// 載入 renderer process
win.loadFile('index.html');
};
app.whenReady().then(() => {
// Browser windows can only be created after the app module's ready event is fired
createWindow();
// Open a window if none are open (macOS)
// Because windows cannot be created before the ready event,
// you should only listen for activate events after your app is initialized
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
});
// On Windows and Linux, exiting all windows generally quits an application entirely.
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit();
});
renderer
在 index.html
中載入的 JavaScript scripts 只能使用瀏覽器的功能,不能使用 Node.js 的操作:
main process
// main.js
const createWindow = () => {
// ...
const win = new BrowserWindow({
/* ... */
});
// 載入 renderer process
win.loadFile('index.html');
};
renderer process
<!-- index.html -->
<!doctype html>
<html>
<!-- ... -->
<body>
<!-- 這裡載入的 scripts 屬於 renderer process -->
<script src="renderer.js"></script>
</body>
</html>