Electron(0) - Hello world
Electron in Action 這本書寫得很不錯,無奈 electron 這個套件更新神速所以書中有些程式碼需要修正。這個系列紀錄 Electron in Action 中的修正供大家參考。
1. 創建專案:
使用npm初始化專案並下載套件:
$ mkdir PROJECT_NAME $ cd PROJECT_NAME $ npm init $ npm install --save-dev electron
2. 專案架構:
Electron in Action 中會將專案所需之程式碼放在 '專案/app/' 中:
app ├── app.js ├── index.html ├── preload.js ├── renderer.js └── style.css
其中 renderer.js 在這篇還不會用到。
3. app.js:
app.js 控制整個 app 的 life cycle,啟動 app 時我們會呼叫 preload.js 取得額外資訊。
const { app, BrowserWindow } = require('electron')
const path = require('path')
function createWindow() {
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js')
}
});
win.loadFile('./app/index.html');
}
app.whenReady().then(() => {
createWindow();
});
4. preload.js:
preload.js 可以使用網頁(e.g. window)及 electron 的物件(e.g. process)。
window.addEventListener('DOMContentLoaded', () => {
const replaceText = (selector) => {
const elementId = `${selector}-version`
const element = document.getElementById(elementId);
console.log(element);
if (element) {
const version = process.versions[selector];
console.log(`${selector}: {version}`);
element.innerText = version;
}
};
for (const type of ['node', 'chrome', 'electron']) {
replaceText(type);
}
});
preload.js 中定義了 'DOMContentLoaded' 的 callback,等到 DOM load 完時會依照 ID 選取特定的 elements 並進行更新。
5. index.html:
在 app.js 中我們有將主頁面設為 index.html,詳細內容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1>Hello world</h1>
<p>We are using node: <span id="node-version"></span></p>
<p>We are using chrome: <span id="chrome-version"></span></p>
<p>We are using electron: <span id="electron-version"></span></p>
</body>
</html>
6. package.json:
因應 app/ 的架構修改入口函數的名稱並新增 start 指令。
{
"name": "electronplayground",
"version": "1.0.0",
"description": "",
"main": "./app/app.js",
"scripts": {
"start": "electron .",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"electron": "^16.0.7"
}
}
執行 'npm start' 啟動應用:
留言
張貼留言