๋ชฉ์ฐจ
JS ๊ธฐ๋ฐ์ผ๋ก ํฌ๋ก์คํ๋ซํผ ๋ฐ์คํฌํฑ ์ฑ์ ๊ฐ๋ฐํ ์ ์๋ ํ๋ ์์ํฌ์ธ
Electron์ ๋ํด ์์๋ณด์!
1. ์๊ฐ
Electron์ JS, HTML, CSS๋ฅผ ํ์ฉํด์ ํฌ๋ก์คํ๋ฉํผ ๋ฐ์คํฌํฑ ์ฑ์ ๊ฐ๋ฐํ ์ ์๋ ํ๋ ์์ํฌ์ด๋ค.
2013๋ Atom Editor๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์์๋ Atom Shell์์ ์์ํ์๊ณ 2015๋ ๊ทธ ๋ช ์นญ์ด ํ์ฌ์ Electron์ผ๋ก ๋ณ๊ฒฝ๋์๋ค.
Electron์ ์ํคํ ์ณ๋
๋ฐฑ์๋์ ๊ฒฝ์ฐ Node.js, ํ๋ก ํธ์๋์ ๊ฒฝ์ฐ Chromium ์ด๋ผ๋ ๊ตฌ๊ธ Chrome ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ฐ์ด ๋๋ ์คํ์์ค ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํ๋ค.
๋ฐ๋ผ์ Web ๊ธฐ๋ฐ์ ๊ธฐ์ ์ Chromium์์ ์ฒ๋ฆฌํ๊ณ OS ๊ธฐ๋ฐ ๊ธฐ๋ฅ์ Node.js์์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
์ด๋ฅผ ์ด์ฉํ๋ ๋ํ์ ์ธ ์์๋ Atom Editor, VSCode, Slack, Discord ๋ฑ์ด ์๋ค!
Electron์ ์ฅ์
1) ๊ธฐ์กด์ ์น๊ธฐ์ ์ ๊ทธ๋๋ก ํ์ฉํ ์ ์๋ค. React, Vue ๋ฑ ๋ค์ํ js๊ธฐ๋ฐ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
2) ํ ๊ฐ์ ์ฝ๋๋ก Window, MacOS, Linux ๋ฑ์ ๋ค์ํ ํ๋ซํผ์์ ํ์ฉํ ์ ์๋ ์ฑ์ ๋ง๋ค ์ ์๋ค.
3) NPM์ ์ด์ฉํด ๋ค์ํ node package๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
2. ์ด๊ธฐ์ค์
1) Node.js ์ค์น
์ผ๋ ํธ๋ก ๊ฐ๋ฐ์ ์ํด์๋ Node.js๊ฐ ํ์ํ๋ค.
https://nodejs.org/en/download
node -v
npm -v
์ค์น๋ฅผ ์งํํ ํ ๋ฒ์ ํ์ธ์ ํตํด ์ค์น๋ฅผ ํ์ธํ๋ค.
2) ๋๋ ํ ๋ฆฌ ์์ฑ
ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ํด๋น ์์น์ ์ ๊ทผํ๋ค.
3) ํ๋ก์ ํธ ์์ฑ
npm init
์์ ๋ช ๋ น์ด๋ฅผ ํฐ๋ฏธ๋์ ์ ๋ ฅํ์ฌ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ค.
ํ๋ก์ ํธ๋ช , ๋ฒ์ , ์ค๋ช , ์ํธ๋ฆฌํฌ์ธํธ, ์์ฑ์, ๋ผ์ด์ผ์ค ๋ฑ์ ์ค์ ํ๋ค.
์ค์ ์ ํ๋ฉด package.json ํ์ผ์ด ์์ฑ๋๋ค.
{
"name": "electron-app",
"version": "1.0.0",
"description": "first-app",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Kassid",
"license": "ISC"
}
main : ํ๋ก๊ทธ๋จ ์์์ ์ ์๋ฏธํ๋ ์ํธ๋ฆฌํฌ์ธํธ์ด๋ค. (์๋ ๊ฒฝ๋ก ์ ๋ ฅ ๊ฐ๋ฅ)
4) Electron ํจํค์ง ์ถ๊ฐ
npm install --save-dev electron
electron์ ์ฌ์ฉํ๊ธฐ ์ํด์ ํจํค์ง๋ฅผ ์ถ๊ฐํ๋ค.
์ ์ค์น๋ ๊ฒฝ์ฐ ์๋์ ๋ด์ฉ์ด ์ถ๊ฐ๋๋ค.
"devDependencies": {
"electron": "^24.1.3"
}
๋ํ package-lock.json ํ์ผ๋ ์์ฑ๋๋ค.
5) ํ๊ฒฝ๋ณ์ ํ์ผ ์์ฑ
.env / .env.development / .env.production ํ์ผ์ ์์ฑํ๋ค.
- .env
HOST=localhost
PORT=3000
BROWSER=none
- .env.development
NODE_ENV=development
- .env.production
NODE_ENV=production
GENERATE_SOURCEMAP=false
6) index.html & main.js ์์ฑ
์คํ ์คํฌ๋ฆฝํธ ๋ฐ ํ์ผ์ ์์ฑํ๋ค.
ํฌ์คํ ์์๋ ํ์ผ์ ๊ด๋ฆฌ๋ฅผ ์ํด ๋๋ ํ ๋ฆฌ๋ฅผ ๋ฐ๋ก ๊ตฌ์ฑํ์ฌ ๋ง๋ค์ด๋ณด์๋ค.
์ด๋ ์ฃผ์ํ ์ ์ ์์์ ์ธํ ํ๋ package.json์์์ entry point๋ฅผ ๋ณ๊ฒฝํด์ผํ๋ค.
"main": "src/js/main.js",
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hello World</title>
</head>
<body>
<h1>Hello World!</h1>
This is Kassid.
</body>
</html>
main.js
const { app, BrowserWindow } = require('electron')
const path = require('path')
const url = require('url')
function createWindow () {
const win = new BrowserWindow({
width: 800,
height: 600,
// webPreferences: {
// preload: path.join(__dirname, 'preload.js')
// }
})
// win.loadFile('../html/index.html')
const startUrl = process.env.ELECTRON_START_URL || url.format({
pathname: path.join(__dirname,'..', 'html','index.html'),
protocol: 'file:',
slashes: true
});
win.loadURL(startUrl);
}
app.whenReady().then(() => {
createWindow()
//for MacOS
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
})
//for Window, Linux
//when close
app.on('window-all-closed', function () {
if (process.platform !== 'darwin') app.quit()
})
์์ ์ฝ๋๋ฅผ ํ๋์ฉ ๋ฏ์ด๋ณด์!
(1) ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ
const { app, BrowserWindow } = require('electron')
html ํ์ผ์ ์์ฉํ๋ก๊ทธ๋จ ์ฐฝ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ์ํ 2๊ฐ์ง Electron ๋ชจ๋์ด๋ค.
- app : ์์ฉํ๋ก๊ทธ๋จ์ ์ด๋ฒคํธ ์๋ช ์ฃผ๊ธฐ ์ ์ด ๋ชจ๋
- BrowserWindow : ์์ฉํ๋ก๊ทธ๋จ ์ฐฝ ์์ฑ ๋ฐ ๊ด๋ฆฌ ๋ชจ๋
Node.js์์ ์คํ๋๋ฏ๋ก ์์ฒ๋ผ CommonJS ๋ชจ๋๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค.
(2) ๋ฉ์ธ์ฐฝ ์์ฑ
function createWindow () {
const win = new BrowserWindow({
// ์ฐฝ ํฌ๊ธฐ ์ค์
width: 800,
height: 600,
// ์ฌ์ ์ ๋ก๋ํด์ผํ๋ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ๋ก๋๋ฅผ ํ๋ค.
// webPreferences: {
// preload: path.join(__dirname, 'preload.js')
// }
})
// ํ์ผ ๊ฐ์ ธ์ค๊ธฐ
// 1. ์ง์ ๊ฐ์ ธ์ค๊ธฐ
// win.loadFile('../html/index.html')
// 2. url๋ก ํ์ผ ๊ฐ์ ธ์ค๊ธฐ
// ํ๊ฒฝ๋ณ์์ URL ์กด์ฌํ ๊ฒฝ์ฐ์ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์๋ ๊ฒฝ๋ก๋ก ๊ฐ์ ธ์ค๊ธฐ
const startUrl = process.env.ELECTRON_START_URL || url.format({
pathname: path.join(__dirname,'..', 'html','index.html'),
protocol: 'file:',
slashes: true
});
// ์์ ํฌ์ธํธ ์คํ
win.loadURL(startUrl);
}
(3) ์ ํ๋ฆฌ์ผ์ด์ ์คํ ๋ฐ ์ข ๋ฃ
// ์ด๊ธฐํ๊ฐ ๋๋๊ฒ ๋๋ฉด ์คํ
app.on('ready', () => {
// ๋ฉ์ธ ์ฐฝ ์์ฑ
createWindow();
});
// ๋ชจ๋ ์ฐฝ์ด ๋ซํ๋ฉด ์๋์ผ๋ก ์ฑ ์ข
๋ฃ
app.on('window-all-closed', () => {
app.quit();
});
7) ํจํค์ง๊ณผ ๋ฐฐํฌ๋ฅผ ์ํ ํจํค์ง ์ค์น
npm install --save-dev @electron-forge/cli
npx electron-forge import
ํจํค์ง๊ณผ ๋ฐฐํฌ๋ฅผ ์ํด์ Electron Forge๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด package.json์ ์๋์ ๊ฐ๋ค.
{
"name": "electron-app",
"version": "1.0.0",
"description": "first-app",
"main": "src/js/main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "electron-forge start",
"package": "electron-forge package",
"make": "electron-forge make"
},
"author": "Kassid",
"license": "ISC",
"devDependencies": {
"@electron-forge/cli": "^6.1.1",
"@electron-forge/maker-deb": "^6.1.1",
"@electron-forge/maker-rpm": "^6.1.1",
"@electron-forge/maker-squirrel": "^6.1.1",
"@electron-forge/maker-zip": "^6.1.1",
"electron": "^24.1.3"
},
"dependencies": {
"electron-squirrel-startup": "^1.0.0"
}
}
8) ์คํฌ๋ฆฝํธ ์ถ๊ฐ
package.json์ scripts์ ๋ด์ฉ์ ์ถ๊ฐํด๋ณด์.
"electron": "electron ."
"electron:window": "SET ELECTRON_START_URL=http://localhost:3000 && npm electron",
"electron:xos": "ELECTRON_START_URL=http://localhost:3000 npm electron",
"prebuild": "react-scripts test --watchAll=false",
"build": "react-scripts build",
"deploy:xos": "electron-builder --mac",
"deploy:win32": "electron-builder --win --ia32",
"deploy:win64": "electron-builder --win --x64",
"deploy:win": "yarn deploy:win32 && yarn deploy:win64",
"test": "react-scripts test",
"package": "electron-forge package",
"make": "electron-forge make"
electron ์คํ ๋ช ๋ น์ด, build ๋ช ๋ น์ด, OS๋ณ builder ๋ช ๋ น์ด, ํจํค์ง ๋ฐ ๋ฐฐํฌ์ ๋ํ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ๋ค.
9) ์คํ
npm start
๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ค.
'๐ | WEB DEV > Electron' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Electron] 1. Electron์ React ํ์ฌํ๊ธฐ! (0) | 2023.05.02 |
---|
๋๊ธ