Electron ์ด๋?
๐ก - JavaScript, HTML ๋ฐ CSS๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์คํฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ํ๋ ์์ํฌ
- Chromium ๊ณผ Node.js ๋ฅผ ๋ฐ์ด๋๋ฆฌ์ ๋ด์ฅ
- Electron์ ์ฌ์ฉํ๋ฉด ํ๋์ JavaScript ์ฝ๋ ๋ฒ ์ด์ค๋ฅผ ์ ์งํ๊ณ
- Windows, macOS ๋ฐ Linux์์ ์๋ํ๋ ํฌ๋ก์ค ํ๋ซํผ ์ฑ์ ๋ง๋ค ์ ์์
ํต์ฌ ๊ตฌ์ฑ ์์
๐ก ํ๋ก ํธ์๋ : ํฌ๋ก๋ฏธ์ ๋ฐฑ์๋ : ๋ ธ๋JS ํฌ๋ก๋ฏธ์ ๋ ๋๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ ธ๋JS์ ๊ฒฐํฉ - V8์ ๊ณต์
โณ์คํ์์ค ์น๋ธ๋ผ์ฐ์ ํฌ๋ก๋ฏธ์(Chromium)
โณ๋ธ๋ผ์ฐ์ ๋ฐ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐํ์ ํ๊ฒฝ์ธ ๋ ธ๋JS
โณ์คํ์์ค ์๋ฐ์คํฌ๋ฆฝํธ ์์ง V8
ํ์ฉ ์ฌ๋ก
- Atom Editor
- VScode
- Slack
์ฅ์
- ๋ฎ์ ์ง์
์ฅ๋ฒฝ
- JavaScript ์น ๊ฐ๋ฐ์๊ฐ ์๋ก์ด ๊ธฐ์ ์ด๋ ์ธ์ด๋ฅผ ๋ฐฐ์ธ ํ์ x
- ๊ฐ๋ฐ ์๋ ํฅ์
- JavaScript๋ ํ ์ค์ฉ ํด์ํ๋ ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ ์ฌ์ฉ
- ๊ฐ๋ฐ์๊ฐ ์์ฝ๊ฒ ๋๋ฒ๊น ํ ์ต์ ํ ๊ฐ๋ฅ → ๋น ๋ฅธ ๊ตฌํ
- ๋น์ง๋์ค ๋ก์ง, ๋์์ธ ๋ฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์ ์์๋๋ ์๊ฐ๊ณผ ๋น์ฉ์ด ์ค์ด๋ฆ
- ํฌ๋ก์ค ํ๋ซํผ ์ง์
- OS์ ๋ํ ๋น๋๋ฅผ ์ง์ํ๊ณ ์ค์นํ ์ ์์
- ๋ธ๋ผ์ฐ์ ๋ฒ์ ๋ณ๋ก ๊ธฐ๋ฅ์ ์ ์ฝํ๊ฑฐ๋ ํ๊ฒ ํ๋ ํผ์ ๋ฐ๋ผ ๋ณ๋์ ๋ฒ์ ์ ใ ์ฅฌใ ฃํ ํ์ ์์
- ํ๋ถํ OS ๋ค์ดํฐ๋ธ API๋ฅผ ๊ฐ์ง ๋ฐํ์ ์ ๊ณต
- ์จ๋ํํฐ ์ง์
- ๋ ธ๋JS์ ๋ชจ๋ ๋นํธ์ธ ๋ชจ๋๊ณผ ์จ๋ํํฐ ๋ชจ๋์ ์ฌ์ฉ ๊ฐ๋ฅ
- npm ๋ ์ง์คํธ๋ฆฌ์ ๋ฑ๋ก๋ ๋๋ถ๋ถ์ ๋ชจ๋๋ ์ด์ฉ ๊ฐ๋ฅ
- ๋ ธ๋JS๋ฅผ ํตํด ํ์ผ ์์คํ ์ ์ ๊ทผํ๊ณ ๋คํธ์ํฌ ๋ฆฌ์์ค๋ฅผ ์ ์ฝ ์์ด ์ฌ์ฉ ๊ฐ๋ฅ
- ๋
ธ๋ ์ ๊ทผ ๊ถํ ๊ด๋ฆฌ
- ์น๋ทฐ์์ ๋ ธ๋JS์ ๋ํ ์ ๊ทผ ๊ถํ์ ๊ณ ๋๋ฆฌ ํ ์ ์์
- ์น๋ทฐ ํ์ด์ง ๋ด์์ Require์ด๋ Process์ ๊ฐ์ ๋ ธ๋JS API๋ฅผ ์ง์ ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ค๋ง, ๋ ธ๋JS ๋ชจ๋ ์์ฒด๊ฐ ์์ ํ์ง ์์ ์ ์์ด์ ๋ณด์์ ์ ์
- ๋น๋ ํด๊ณผ ์ธ์คํจ๋ฌ ์ ๊ณต
- ๋น๋ ํด์ ์ ๊ณตํ์ฌ ์ผ๋ ํธ๋ก ๋ฐ์คํฌํฑ ์ดํ๋ฆฌ์ผ์ด์ ์ ์์ฝ๊ฒ ํจํค์งํ ์ ์์
- autoUpdater ๊ตฌ์ฑ์์๋ฅผ ์ด์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์๋ ์ ๋ฐ์ดํธ ๊ธฐ๋ฅ๋ ์ฌ์ฉ ๊ฐ๋ฅ
๋จ์
- ํฐ ์ค์น ํ์ผ ์ฉ๋
- ํฌ๋ก๋ฏธ์๊ณผ ๋ ธ๋JS๊ฐ ํฌํจ๋๊ธฐ ๋๋ฌธ์ ์ผ๋ ํธ๋ก ์ผ๋ก ๊ฐ๋ฐํ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ธฐ๋ณธ 100MB ์ด์ ( ์ด๊ธฐ ์ค์น ํ์ผ ์ฉ๋์ด ํผ)
- ์๋์ ์ผ๋ก ๋๋ฆฐ ์๋
- ์์คํ ๋ฆฌ์์ค, RAM์ ๋ง์ด ์ฐจ์ง
- ์ค๋๋ ์ปดํจํฐ์์ UI๊ฐ ์ฝ๊ฐ ๋๋ ค์ง ์ ์์
- ๋ค์ํ ํ๋ซํผ์ ์ํ ์ผ๋ ํธ๋ก ์ ํจ์จ์ฑ์ด ๋ค์ ๋จ์ด์ง
- ๋ณด์์ ๊ฐ๋ฐ์์ ์ฑ
์
- ๋ ธ๋JS ํตํฉ์ผ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ๋ ํฐ ๊ถํ์ ๊ฐ๊ฒ๋จ
- ๋ฐ๋ผ์, ์ ๋ขฐํ ์ ์๋ ์์์ ์ฝํ ์ธ ๋ฅผ ํ์ํ๋ฉด ๋ ธ๋JS ๋ชจ๋ ์์ฒด๊ฐ ์์ ํ์ง ์์ ์ ์์
- ํฌ๋ก์ค ํ๋ซํผ ๋น๋
- ์ผ๋ ํธ๋ก ์ ํฌ๋ก์ค ํ๋ซํผ์ ์ง์ฐ๋
- ํ๋์ ํ๋ซํผ์์ ๋ชจ๋ ํ๋ซํผ์ฉ ๋ฐ์คํฌํฑ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ ์ ์์
- ๋ฐ์คํฌํฑ ์ดํ๋ฆฌ์ผ์ด์
์ด ๊ธฐ๋ณธOS์ ๋ํ ์ข
์์ฑ ๊ฐ์ง ๊ฒฝ์ฐ → ํด๋น ํ๋ซํผ์์๋ง ์ปดํ์ผ ๊ฐ๋ฅ
- ex) ๋งฅ OS ์ฝ๋ ์๋ช ์ ๋งฅ OS์์๋ง ๊ฐ๋ฅ
Electron ์์ํ๊ธฐ
- Electron์ ์ฌ์ฉํ๋ ค๋ฉด ํ์์ ์ผ๋ก Node.js๋ฅผ ์ค์นํด์ผํจ
- ๊ฐ๋ฅํ LTS ์ต์ ๋ฒ์ ์ ์ด์ฉํ ๊ฒ์ ๊ถ๊ณ
node -v
npm -v
Scaffold Project
mkdir my-electron-app && cd my-electron-app
# ํจํค์ง ์ด๊ธฐํ
npm init
# ์์กด์ฑ ์ถ๊ฐ
npm install --save-dev electron
- package.json ์ถ๊ฐ
{
"scripts": {
"start": "electron ."
}
}
# ์คํ
npm start
Electron ๋์ ์๋ฆฌ
๐ก Electron์ 2๊ฐ์ง ํ๋ก์ธ์ค ์กด์ฌ
- ๋ฉ์ธ(Main) ํ๋ก์ธ์ค์ ๋ ๋๋ฌ(Renderer) ํ๋ก์ธ์ค Electron ์ฑ์ ๋จ ํ๋์ ๋ฉ์ธ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ง
- ๋ฉ์ธ ํ๋ก์ธ์ค์ ๋ ๋๋ฌ ํ๋ก์ธ์ค ๊ฐ์ ํต์ ์ด ์ด๋ค์ ธ์ผํจ
- ์ผ๋ ํธ๋ก ์์๋ ์ด๋ฅผ ipcMain๊ณผ ipcRenderer์ ๊ฐ์ IPC ๋ชจ๋์ ํตํด ํ๋ก์ธ์ค ๊ฐ์ ํต์ ์ ์ด๋ฃธ
๋ฉ์ธ ํ๋ก์ธ์ค
- Node.js๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์
- ๋ ๋๋ฌ ํ๋ก์ธ์ค๋ฅผ ๊ด๋ฆฌ
๋ ๋๋ฌ ํ๋ก์ธ์ค
- ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ๋์
Electron ์ฌ์ฉ
๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ
- main.js - ๋ฉ์ธ ํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ
const { app, BrowserWindow } = require('electron');
const path = require('path');
//์ฐฝ์ ์ ์
/* webPreferneces
ํ์ด์ง๊ฐ ํ์ ๋๊ธฐ ์ ์คํํ ์ ์ฒ๋ฆฌ ์ฝ๋ ์ง์ .
์คํฌ๋ฆฝํธ๋ ๋ฐ๋์ ์ ๋ ๊ฒฝ๋ก๋ก ์ ๋ฌ๋์ผ ํจ.
*/
/*
win.loadFile => ์ฐฝ์์ ๋ถ๋ฌ๋ค์ผ HTML ๋ฌธ์ ์ง์
*/
const createWindow = () => {
//create the browser window!
const win = new BrowserWindow({
width: 640,
height: 480,
webPreferences: { preload: path.join(__dirname, 'preload.js') }
});
win.loadFile('index.html');
};
// Application์ด ์ค๋น๋ ํ ์คํํ ์คํฌ๋ฆฝํธ๋ฅผ ์ง์
app.whenReady().then(() => {
createWindow();
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit();
});
- preload.js - ์ฌ์ ์ ๋ก๋ ๋์ด์ผ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
//์ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ๋ฃ์ ์ ์๋ค๋ ๊ฒ์ ๋ณด์ด๊ธฐ ์ํ ์์
window.addEventListener('DOMContentLoaded', () => {
const replaceText = (selector, text) => {
const element = document.getElementById(selector)
if (element) element.innerText = text
}
for (const type of ['chrome', 'node', 'electron']) {
replaceText(`${type}-version`, process.versions[type]);
}
});
- index.html - ๋ฉ์ธ ํ๋ฉด
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
We are using Node.js <span id="node-version"></span>,
Chromium <span id="chrome-version"></span>,
and Electron <span id="electron-version"></span>.
</body>
</html>
Referenece
'Development > Electron' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Electron] ipcRenderer.invoke & ipcMin.handle (0) | 2023.06.15 |
---|---|
[Electron] dialog.showOpenDialog() (0) | 2023.06.15 |
[Electron] electron ์์ด์ฝ ๋ฃ๊ธฐ (0) | 2023.01.25 |
[Electron] Electron + React ์ฐ๋ํ๊ธฐ (0) | 2023.01.13 |
[Electron]Electron-forge (0) | 2023.01.12 |
๋๊ธ