Electron

Electron:

  • Electron은 Chromiumκ³Ό Node.jsλ₯Ό μ‚¬μš©ν•˜μ—¬ JavaScript, HTML, CSSλ₯Ό μ΄μš©ν•˜μ—¬ Windows λ˜λŠ” Mac, λ¦¬λˆ…μŠ€μ—μ„œ 직접 μ„€μΉ˜ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 개발 ν•  수 μžˆλ‹€. 크둜슀 ν”Œλž«νΌ μ§€μ›μœΌλ‘œ 이 μ„Έ 개의 μš΄μ˜μ²΄μ œμ—μ„œ build 되고 λ™μž‘ν•œλ‹€

Install Electron

Electron github

$ git clone https://github.com/electron/electron-quick-start 
$ cd electron-quick-start
$ npm i && npm start
  • npm i (npm install의 μ€„μž„λ§) β†’ package.json에 μ •μ˜λœ μ˜μ‘΄μ„± νŒ¨ν‚€μ§€λ“€μ„ μ„€μΉ˜ν•¨

  • npm start β†’ package.json에 μ •μ˜λœ "start" 슀크립트λ₯Ό μ‹€ν–‰

    • 보톡 electron . λͺ…λ Ήμ–΄κ°€ μ‹€ν–‰λ˜μ–΄ Electron 앱이 싀행됨

초기 μ‹€ν–‰ ν™”λ©΄

Electron Debug

  • Electron은 Chromium을 μ‚¬μš©ν•˜μ˜€κΈ° λ•Œλ¬Έμ— Chromeμ—μ„œ 개발 μ‹œ μ‚¬μš©ν•˜λ˜ devToolsλ₯Ό Electronμ—μ„œλ„ μ‚¬μš©

Menu > View > Toggle Developer Tools
λ˜λŠ” Ctrl + Shift + I

Electronκ³Ό Chromium의 관계

Electron은 Chromium을 λ‚΄μž₯ν•œ λΈŒλΌμš°μ € 기반 ν”„λ ˆμž„μ›Œν¬ 즉, Electron 앱을 μ‹€ν–‰ν•˜λ©΄ λ‚΄λΆ€μ μœΌλ‘œ Chromium이 λŒμ•„κ°€λ©΄μ„œ HTML, CSS, JavaScriptλ₯Ό λ Œλ”λ§

πŸ”₯μ •λ¦¬ν•˜λ©΄, Chromium은 μ˜€ν”ˆμ†ŒμŠ€ μ›Ή λΈŒλΌμš°μ € 엔진이고, μ—¬λŸ¬ λΈŒλΌμš°μ €μ™€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜(Electron, Edge λ“±)μ—μ„œ μ‚¬μš©λ˜κ³  μžˆλ‹€


Electron Build

  • Electron μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•œ ν›„, μ‹€μ œ μ‹€ν–‰ κ°€λŠ₯ν•œ ν”„λ‘œκ·Έλž¨(exe, dmg, AppImage λ“±)으둜 λ³€ν™˜ν•˜λŠ” 과정을 λΉŒλ“œ(Build) 라고 ν•œλ‹€

  • Electron 앱은 기본적으둜 HTML, CSS, JavaScript둜 μž‘μ„±λœ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄μ§€λ§Œ, 이λ₯Ό Windows, macOS, Linuxμ—μ„œ μ‹€ν–‰ν•  수 μžˆλŠ” λ°μŠ€ν¬ν†± μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ νŒ¨ν‚€μ§•ν•΄μ•Ό 함

  • Electron λΉŒλ“œλ₯Ό μ‰½κ²Œ λ„μ™€μ£ΌλŠ” νŒ¨ν‚€μ§€λ“€μ΄ μ‘΄μž¬ν•˜λ©°, λŒ€ν‘œμ μΈ λΉŒλ“œ λ„κ΅¬λ‘œ electron-builder μ‚¬μš©

# electron-builder μ„€μΉ˜
npm install --save-dev electron-builder
npm i -D electron-builder

  • κΈ°λ³Έ package.json μƒνƒœ

{
  "name": "electron-quick-start", // νŒ¨ν‚€μ§€(μ•±) 이름. ν”„λ‘œμ νŠΈμ˜ 고유 μ‹λ³„μžλ‘œ μ‚¬μš©λ¨.
  "version": "1.0.0", // μ•±μ˜ 버전. μ—…λ°μ΄νŠΈ 및 배포 μ‹œ μ€‘μš”ν•˜κ²Œ μ‚¬μš©λ¨.
  "description": "A minimal Electron application", // μ•± μ„€λͺ…. npm νŒ¨ν‚€μ§€λ‚˜ λ¬Έμ„œμ—μ„œ 참고용으둜 μ‚¬μš©λ¨.
  "main": "main.js", // Electron μ•±μ˜ μ§„μž…μ  (메인 ν”„λ‘œμ„ΈμŠ€ 파일).

  "scripts": {
    "start": "electron ." // `npm start` μ‹€ν–‰ μ‹œ `electron .`을 μ‹€ν–‰ν•˜μ—¬ 앱을 개발 λͺ¨λ“œμ—μ„œ μ‹€ν–‰.
  },

  "repository": "https://github.com/electron/electron-quick-start", // ν”„λ‘œμ νŠΈμ˜ Git μ €μž₯μ†Œ URL.

  "keywords": [
    "Electron", // Electron ν”„λ ˆμž„μ›Œν¬ κ΄€λ ¨ ν”„λ‘œμ νŠΈμž„μ„ λ‚˜νƒ€λƒ„.
    "quick", // λΉ λ₯΄κ²Œ μ‹œμž‘ν•  수 μžˆλŠ” ν…œν”Œλ¦Ώμ΄λΌλŠ” 의미.
    "start", // μŠ€νƒ€νŠΈμ—… λ˜λŠ” μ‹œμž‘ ν…œν”Œλ¦Ώκ³Ό 관련됨.
    "tutorial", // νŠœν† λ¦¬μ–Όμš© ν”„λ‘œμ νŠΈλΌλŠ” 의미.
    "demo" // 데λͺ¨(μƒ˜ν”Œ) ν”„λ‘œμ νŠΈλΌλŠ” 의미.
  ],

  "author": "GitHub", // ν”„λ‘œμ νŠΈμ˜ μž‘μ„±μž λ˜λŠ” μ†Œμœ μž.
  "license": "CC0-1.0", // ν”„λ‘œμ νŠΈμ˜ λΌμ΄μ„ μŠ€. (CC0-1.0은 퍼블릭 도메인과 μœ μ‚¬ν•˜μ—¬ 자유둭게 μ‚¬μš© κ°€λŠ₯.)

  "devDependencies": {
    "electron": "^34.3.0", // Electron의 개발 버전 μ˜μ‘΄μ„±. (^34.3.0은 34.x.x 버전 μ‚¬μš© κ°€λŠ₯.)
    "electron-builder": "^25.1.8" // Electron 앱을 μ„€μΉ˜ 파일(.exe, .dmg, .AppImage λ“±)둜 λΉŒλ“œν•˜λŠ” 도ꡬ.
  }
}
  • 본인 app등둝을 μœ„ν•΄ μˆ˜μ •ν•œ version

{
  "name": "kitty-player", // μ•±μ˜ 이름 (ν”„λ‘œμ νŠΈ IDλ‘œλ„ μ‚¬μš©λ¨)
  "version": "1.0.0", // μ•±μ˜ ν˜„μž¬ 버전 (μ—…λ°μ΄νŠΈ 및 배포 μ‹œ μ‚¬μš©)
  "description": "A simple Electron-based music player application", // μ•± μ„€λͺ…
  "main": "main.js", // Electron μ•±μ˜ μ§„μž…μ  (메인 ν”„λ‘œμ„ΈμŠ€ 파일)

  "scripts": {
    "start": "electron .", // 개발 λͺ¨λ“œμ—μ„œ μ•± μ‹€ν–‰
    "dist": "electron-builder", // 앱을 νŒ¨ν‚€μ§•ν•˜μ—¬ μ‹€ν–‰ 파일 생성
    "pack": "electron-builder --dir", // μ„€μΉ˜ 파일 없이 디렉토리 ν˜•νƒœλ‘œ λΉŒλ“œ
    "build:win": "electron-builder --win", // Windows용 μ„€μΉ˜ 파일 λΉŒλ“œ
    "build:mac": "electron-builder --mac", // macOS용 μ„€μΉ˜ 파일 λΉŒλ“œ
    "build:linux": "electron-builder --linux" // Linux용 μ„€μΉ˜ 파일 λΉŒλ“œ
  },

  "repository": {
    "type": "git",
    "url": "https://github.com/invisible-bo/kitty_player" 
  },

  "keywords": [
    "Electron", // Electron 기반 μ•±
    "Music Player", // μŒμ•… ν”Œλ ˆμ΄μ–΄ μ•±μž„μ„ λͺ…μ‹œ
    "Audio", // μ˜€λ””μ˜€ κ΄€λ ¨ μ•±
    "Desktop App", // λ°μŠ€ν¬νƒ‘ μ• ν”Œλ¦¬μΌ€μ΄μ…˜
    "Media Player" // λ―Έλ””μ–΄ ν”Œλ ˆμ΄μ–΄ κ΄€λ ¨ κΈ°λŠ₯
  ],

  "author": "invisible-bo", // λ„€ μ΄λ¦„μœΌλ‘œ λ³€κ²½
  "license": "MIT", // λΌμ΄μ„ μŠ€λ₯Ό MIT둜 λ³€κ²½ (μ˜€ν”ˆμ†ŒμŠ€ 배포 κ°€λŠ₯)

  "devDependencies": {
    "electron": "^34.3.0", // Electron ν”„λ ˆμž„μ›Œν¬ (μ•± 싀행에 ν•„μˆ˜)
    "electron-builder": "^25.1.8", // 앱을 배포 κ°€λŠ₯ν•œ μ‹€ν–‰ 파일둜 λΉŒλ“œν•˜λŠ” νŒ¨ν‚€μ§€
    "electron-store": "^8.1.0", // 둜컬 μ„€μ • μ €μž₯을 μœ„ν•œ νŒ¨ν‚€μ§€
    "electron-updater": "^5.5.0", // μžλ™ μ—…λ°μ΄νŠΈ κΈ°λŠ₯ μΆ”κ°€
    "fs-extra": "^11.1.1" // 파일 μ‹œμŠ€ν…œ 관리 κΈ°λŠ₯ κ°•ν™”
  },

  "build": {
    "appId": "com.bo.kittyplayer", // μ•±μ˜ 고유 μ‹λ³„μž (배포 μ‹œ ν•„μš”)
    "productName": "Kitty Player", // λΉŒλ“œλœ μ•±μ˜ ν‘œμ‹œ 이름
    "directories": {
      "output": "dist" // λΉŒλ“œλœ 결과물이 μ €μž₯될 폴더
    },
    "files": [     //앱을 λΉŒλ“œν•  λ•Œ 포함할 파일 및 폴더 λͺ©λ‘μ„ μ •μ˜
      "main.js",   //electron-builderκ°€ 싀행될 λ•Œ, 여기에 λͺ…μ‹œλœ νŒŒμΌλ“€λ§Œ νŒ¨ν‚€μ§•
      "index.html",
      "renderer.js",
      "assets/**/*"  //assets 폴더 μ•ˆμ˜ λͺ¨λ“  파일과 ν•˜μœ„ 폴더 포함
    ],
    "mac": {
      "target": "dmg",
      "icon": "build/icon.icns"
    },
    "win": {
      "target": "nsis",
      "icon": "build/icon.ico"
    },
    "linux": {
      "target": "AppImage",
      "icon": "build/icon.png"
    }
  }
}
  • "pack": "electron-builder --dir",
    κ°œλ°œλ‹¨κ³„μ—μ„œ μ„€μΉ˜νŒŒμΌ 없이 λ§Œλ“€κ³  μ΅œμ’… version이 λ‚˜μ˜¨ 후에 npm run dist둜 μ„€μΉ˜νŒŒμΌ 생성

npm start
  • Electron이 μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜λŠ”μ§€ 확인

  • κ·Έ λ‹€μŒ 본격적인 κΈ°λŠ₯ κ΅¬ν˜„

    • ex)

      • μ˜€λ””μ˜€ μž¬μƒ (Howler.js, Web Audio API λ“± μ‚¬μš©)

      • 둜컬 파일 뢈러였기 (fs λͺ¨λ“ˆ μ‚¬μš©)

      • UI λ””μžμΈ (HTML, CSS, JavaScript)

      • μ„€μ • μ €μž₯ (electron-store ν™œμš©)

      • μžλ™ μ—…λ°μ΄νŠΈ (electron-updater ν™œμš©, 선택 사항)

      β†’ κΈ°λŠ₯을 ν•˜λ‚˜μ”© μΆ”κ°€ν•˜λ©΄μ„œ npm start둜 μ‹€ν–‰ν•˜λ©° ν…ŒμŠ€νŠΈ!


μ„€μΉ˜ 파일 없이 λΉŒλ“œ ν…ŒμŠ€νŠΈ (pack μ‹€ν–‰)

npm run pack

μ‹€ν–‰ ν›„ 확인할 사항

  • dist/ 폴더가 μƒμ„±λ˜μ—ˆλŠ”μ§€ 확인

  • dist/ν”Œλž«νΌ-unpacked/ 폴더 λ‚΄μ—μ„œ μ‹€ν–‰ κ°€λŠ₯ν•œ 파일이 μžˆλŠ”μ§€ 확인

  • 앱이 μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜λŠ”μ§€ 확인

"npm run pack"은 μ„€μΉ˜ νŒŒμΌμ„ λ§Œλ“€μ§€ μ•Šκ³  μ‹€ν–‰ κ°€λŠ₯ν•œ λΉŒλ“œλ§Œ 생성함. πŸ”₯ 이 λ‹¨κ³„μ—μ„œ 파일이 μ •μƒμ μœΌλ‘œ λΉŒλ“œλ˜λŠ”μ§€ λ¨Όμ € ν™•μΈν•˜λŠ” 게 μ€‘μš”


μ΅œμ’… μ„€μΉ˜ 파일 λΉŒλ“œ (dist μ‹€ν–‰)

  • μ•± 개발이 μ™„λ£Œλ˜κ³ , μ‹€ν–‰ ν…ŒμŠ€νŠΈλ„ λ¬Έμ œμ—†λ‹€λ©΄ μ„€μΉ˜ νŒŒμΌμ„ 생성

npm run dist

μ‹€ν–‰ ν›„ 확인할 사항

  • dist/ 폴더에 OS별 μ„€μΉ˜ 파일이 μƒμ„±λ˜μ—ˆλŠ”μ§€ 확인

  • Windows β†’ .exe

  • macOS β†’ .dmg

  • Linux β†’ .AppImage or .deb

πŸ”₯ μ„€μΉ˜ νŒŒμΌμ„ μƒμ„±ν•œ ν›„, 직접 μ‹€ν–‰ν•΄ 보고 μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ 확인


배포 μ€€λΉ„

배포 방법 1: GitHub Release μžλ™ 배포

  1. GitHub μ €μž₯μ†Œλ₯Ό λ§Œλ“ λ‹€.

  2. electron-updaterλ₯Ό μ„€μ •ν•˜μ—¬ GitHub Releaseλ₯Ό ν†΅ν•œ μžλ™ μ—…λ°μ΄νŠΈ 지원

  3. npm run dist μ‹€ν–‰ ν›„ dist/ 폴더에 μƒμ„±λœ μ„€μΉ˜ νŒŒμΌμ„ GitHub Release에 μ—…λ‘œλ“œ

배포 방법 2: μˆ˜λ™ 배포

  • 파일 곡유 방식 dist/ 폴더에 μžˆλŠ” .exe, .dmg, .AppImage νŒŒμΌμ„ 직접 곡유

  • 자체 μ›Ήμ‚¬μ΄νŠΈμ—μ„œ λ‹€μš΄λ‘œλ“œ 링크 제곡


Electron process ꡬ쑰

  1. main process main.js

  • Electron의 핡심 둜직

  • μ•±μ˜ μ°½(Window)을 μƒμ„±ν•˜κ³  관리

  • 파일 μ‹œμŠ€ν…œ μ ‘κ·Ό, λ„€μ΄ν‹°λΈŒ κΈ°λŠ₯ 호좜, IPC 톡신 처리

  • BrowserWindowλ₯Ό 톡해 λ Œλ”λŸ¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰

  1. renderer process renderer.js

  • UIλ₯Ό λ‹΄λ‹Ήν•˜λŠ” ν”„λ‘œμ„ΈμŠ€ (HTML, CSS, JS μ‹€ν–‰)

  • μ‚¬μš©μžμ˜ μž…λ ₯을 κ°μ§€ν•˜κ³  화면을 μ—…λ°μ΄νŠΈ

  • Electron의 ipcRendererλ₯Ό μ‚¬μš©ν•΄ 메인 ν”„λ‘œμ„ΈμŠ€μ™€ 톡신

  • 기본적으둜 λΈŒλΌμš°μ € ν™˜κ²½κ³Ό λ™μΌν•˜κ²Œ λ™μž‘ (단, λ³΄μ•ˆ 섀정에 따라 Node.js κΈ°λŠ₯ μ œν•œ κ°€λŠ₯)

  1. preload.js

  • preload.jsλŠ” "메인 ν”„λ‘œμ„ΈμŠ€(Main)와 λ Œλ”λŸ¬ ν”„λ‘œμ„ΈμŠ€(Renderer) μ‚¬μ΄μ˜ λ³΄μ•ˆ λΈŒλ¦Ώμ§€ μ—­ν• 

  • preload.jsλ₯Ό μ‚¬μš©ν•˜λ©΄ λ³΄μ•ˆμ„ μœ μ§€ν•˜λ©΄μ„œλ„ λ Œλ”λŸ¬μ—μ„œ 메인 ν”„λ‘œμ„ΈμŠ€μ˜ κΈ°λŠ₯(Node.js API, Electron API λ“±)을 μ‚¬μš©ν•  수 μžˆκ²Œν•΄μ€Œ

    • preload.jsκ°€ ν•„μš”ν•œ 이유

      Electronμ—μ„œλŠ” λ³΄μ•ˆμ„ κ°•ν™”ν•˜κΈ° μœ„ν•΄ nodeIntegration: falseλ₯Ό ꢌμž₯ ν•˜μ§€λ§Œ, nodeIntegration: falseλ₯Ό μ„€μ •ν•˜λ©΄ λ Œλ”λŸ¬μ—μ„œ require('electron')을 직접 μ‚¬μš©ν•  수 μ—†μŒ κ·Έλž˜μ„œ λ Œλ”λŸ¬μ—μ„œ 메인 ν”„λ‘œμ„ΈμŠ€ κΈ°λŠ₯을 μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ preload.jsκ°€ ν•„μš”

Last updated