Concept
- OpenJS Foundation μ°νμμ μ μ§Β·κ΄λ¦¬λλ μ€νμμ€ νλ μμν¬
- λͺ©μ : λ°μ€ν¬ν± μ±μ μΉ κΈ°μ (HTML/CSS/JS/TS) λ‘ κ°λ°νκ³ , ν¬λ‘μ€νλ«νΌ(Windows/macOS/Linux) μΌλ‘ λ°°ν¬
- ν΅μ¬ ꡬμ±
- UI λ λλ§: Chromium
- μ ν리μΌμ΄μ λ°νμ/μμ€ν μμ : Node.js
- μμ¬
- μ΅μ΄μλ GitHubμ Atomμ μν΄ λ§λ€μ΄μ§
- μ΄ν GitHub Desktop, Light Table, WordPress Desktop λ± λ€μν λ°μ€ν¬ν± μ±μμ μ¬μ©
Architecture (ꡬ쑰)
- Electron μ±μ βμ± λ΄λΆμ Chromium + Node.js λ°νμμ ν¬ν¨βνλ νν
- ν° νλ¦
- Chromium: νλ©΄ λ λλ§κ³Ό μΉ νλ«νΌ μ€ν(HTML/CSS/SVG/JS)
- Node.js: νμΌ/λ€νΈμν¬/νλ‘μΈμ€ λ± μμ€ν μμ μν
- Native layer & bindings: μ€μ OS API νΈμΆμ λ΄λΉνλ λ€μ΄ν°λΈ μ½λ(C++/Objective-C λ±) + JS λ°μΈλ©
κ°λ°μκ° μ€μ λ‘ κ°λ°νλ μμ
- μΌλ°μ μΈ μ± κ°λ°μλ Electron App μμ(Main/Renderer + νμ μ preload) μ JS/TS μ½λλ₯Ό μμ±νλ€.
- Native layer & bindingsλ λ³΄ν΅ Electron νλ μμν¬ λ΄λΆ ꡬν(νλ«νΌλ³ λ€μ΄ν°λΈ μ½λ + JS λ°μΈλ©)μ΄λΌ μ± κ°λ°μκ° μ§μ μμ νμ§ μλλ€.
- μμΈμ μΌλ‘ κ°λ°μκ° Native μͺ½μ λ€λ£° μ μλ κ²½μ°
- Electron/Nodeλ‘λ λΆμ‘±ν κΈ°λ₯μ΄ μμ΄ λ€μ΄ν°λΈ νμ₯(Native Node Addon, λ€μ΄ν°λΈ λͺ¨λ) μ μ§μ λ§λ€κ±°λ λΆμΌ λ
- Electron μ체μ 컨νΈλ¦¬λ·°μ /ν¬ν¬νμ¬ νλ μμν¬ λ 벨μ μμ ν λ
Process model (νλ‘μΈμ€)
- Main / Renderer νλ‘μΈμ€ λͺ¨λΈμ μ¬μ©
Main process
- μ± μλͺ μ£ΌκΈ°μ μμ€ν μ°λμ βμ€μβ
- μ°½ μμ±/κ΄λ¦¬, λ©λ΄/νΈλ μ΄/λ€μ΄μΌλ‘κ·Έ λ± OS μ°λ κΈ°λ₯μ μ£Όλ‘ λ΄λΉ
BrowserWindowλ‘ Renderer νλ‘μΈμ€λ₯Ό μμ±/κ΄λ¦¬- Rendererμλ IPCλ‘ ν΅μ (
ipcMainλ±)
Renderer process
- κ° μ°½(μΉ νμ΄μ§) λ¨μλ‘ μ€νλλ νλ‘μΈμ€
- Chromiumμμ UI(HTML/CSS/SVG)λ₯Ό λ λλ§νκ³ , νλ‘ νΈμλ λ‘μ§μ μ€ν
- Mainκ³Ό IPCλ‘ ν΅μ (
ipcRendererλ±)
μ°Έκ³ : Node ν΅ν© μ¬λΆ(μ:
nodeIntegration)μ 보μ μ΅μ μ μ€μ μ λ°λΌ λ¬λΌμ§ μ μλ€.
API / ꡬν λ°©μ
- κ°λ°μκ° μ¬μ©νλ Electron APIλ λλΆλΆ JavaScriptλ‘ λ ΈμΆλμ§λ§,
- λ΄λΆ ꡬνμ νλ«νΌλ³λ‘ C++ / Objective-C(νΉν macOS) λ± λ€μ΄ν°λΈ μ½λλ‘ μμ±λκ³ JS λ°μΈλ©μ ν΅ν΄ μ 곡λλ€.
- μ¦, κ°λ°μλ JS/TSλ‘ APIλ₯Ό νΈμΆνκ³ , μ€μ OS API νΈμΆμ λ€μ΄ν°λΈ λ μ΄μ΄κ° μννλ€.
Mermaid μκ°ν (Top: Electron β Bottom: OS)
flowchart TB subgraph E[Electron App] direction TB subgraph MP[Main process] direction TB MJS[App logic JS TS] EAPI[Electron JS API\napp BrowserWindow ipcMain] MNode[Node runtime\nfs net child_process] MJS --> EAPI MJS --> MNode end subgraph RP[Renderer process] direction TB UI[UI HTML CSS SVG] RJS[Renderer logic JS TS] Chromium[Chromium renderer and V8] IPC[IPC bridge\nipcRenderer to ipcMain] UI --> Chromium RJS --> Chromium RJS <--> IPC end IPC <--> MP end subgraph NL[Native layer and bindings] direction TB NativeModules[Native modules\nC++ and Objective-C\nJS bindings] end subgraph OS[Operating system] direction TB Win[Windows APIs] Mac[macOS APIs] Lin[Linux APIs] end EAPI --> NativeModules MNode --> NativeModules NativeModules --> Win NativeModules --> Mac NativeModules --> Lin
Usage
- Electronμ λ€μν λ°μ€ν¬ν± μ ν리μΌμ΄μ μμ μ¬μ©λ¨
- (Wikipedia βUsageβ μΉμ
κΈ°μ€) μμ:
- Slack
- Discord
- GitHub Desktop
- WordPress Desktop
- Light Table
- (κ·Έ μΈ λ€μ)
μ°Έκ³ : νΉμ μ±μ΄ βνμ¬λβ Electronμ μ°λμ§ μ¬λΆλ μκ°μ΄ μ§λλ©° λ°λ μ μμ΄, νμνλ©΄ μ΅μ 곡μ λ°ν/λ¬Έμλ‘ κ΅μ°¨ νμΈνλ κ²μ΄ μμ ν¨.
Reception (νκ°) β μμ£Ό μΈκΈλλ μ₯/λ¨μ
| κ΅¬λΆ | λ΄μ© | λμμ€/λΉκ³ |
|---|---|---|
| μ₯μ | μΉ κΈ°μ (HTML/CSS/JS/TS) κΈ°λ°μΌλ‘ λΉ λ₯Έ κ°λ° | μΉ κ°λ°μ μΉν, μμ°μ± λμ |
| μ₯μ | ν¬λ‘μ€νλ«νΌ λ¨μΌ μ½λλ² μ΄μ€ | λ°°ν¬/μ μ§λ³΄μ ν¨μ¨ |
| μ₯μ | Chromium κΈ°λ° λ λλ§/μΉ μνκ³ νμ© | UI ꡬν/ννλ ₯ μ 리 |
| μ₯μ | Node.js λ°νμμΌλ‘ μμ€ν μμ κ°λ₯ | νμΌ/λ€νΈμν¬/νλ‘μΈμ€ λ± |
| λ¨μ | λ¨μ μ±μλ Chromium λ²λ€ ν¬ν¨ β μ©λ/λ©λͺ¨λ¦¬/CPU μ¦κ°(software bloat) | β무κ²λ€β λΉνμ΄ νν¨ |
| λ¨μ | Linuxμμ 리μμ€ μ¬μ©λ/λ€μ΄ν°λΈ ν΅ν©μ± λΆμ‘± λΆλ§ | ν λ§/λ€μ΄μΌλ‘κ·Έ/νΈλ μ΄ λ± |
| λ¨μ | κΈ°λ₯ μ§ν©μ΄ 컀 곡격 νλ©΄μ΄ λλ€λ μ§μ | μμ€ JS λ³κ²½ κ°λ₯ νκ²½ μ μ |
| λ¨μ | Chromium μ λ°μ΄νΈκ° νμ μ΅μ μ΄ μλ μ μμ | λμμΌλ‘ PWA μΆμ² μ견 μ‘΄μ¬ |