FRONT-END/ElectronJS

Electron 시작하기

JINGMONG 2022. 6. 21. 01:39

init

npx create-react-app appname --template typescript

electron tools

  • Electron-is-dev: 개발환경인지 빌드한 프로덕션환경인지 확인
  • Electron: 일렉트론
  • Electron-builder: 일렉트론을 실제 프로덕션 버전으로 빌드하기 위해 사용
  • concurrently: 동시에 여러 명령어를 사용하기 위해 사용
  • cross-env: 프로그램을 CLI활경에서 실행시킬 때 os에 관계 없이 환경변수를 설정할 수 있도록 하기 위해 사용
  • wait-on: HTTP 자원, PORT, FILE 등이 활성화 될 때 까지 기다려주는 cross platfrom
npm i electron-is-dev
npm i electron electron-builder concurrently cross-env wait-on typescript --save-dev

src/electron.ts 생성

import { app, BrowserWindow } from 'electron';
import * as isDev from 'electron-is-dev';
import * as path from 'path';

let mainWindow: BrowserWindow;

const createWindow = () => {
  mainWindow = new BrowserWindow({
    width: 900,
    height: 680,
    center: true,
    kiosk: !isDev,
    resizable: true,
    fullscreen: false,
    fullscreenable: true,
    webPreferences: {
      // node환경처럼 사용하기
      nodeIntegration: true,
      // 개발자도구
      devTools: isDev,
    },
  });

  // production에서는 패키지 내부 리소스에 접근.
  // 개발 중에는 개발 도구에서 호스팅하는 주소에서 로드.
  mainWindow.loadURL(isDev ? '<http://localhost:3000>' : `file://${path.join(__dirname, '../build/index.html')}`);

  if (isDev) {
    mainWindow.webContents.openDevTools({ mode: 'detach' });
  }

  mainWindow.setResizable(true);

  // Emitted when the window is closed.
  mainWindow.on('closed', () => (mainWindow = undefined!));
  mainWindow.focus();
};

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', createWindow);

// Quit when all windows are closed.
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

app.on('activate', () => {
  if (mainWindow === null) {
    createWindow();
  }
});

package.json 파일 수정

{
  ...
  "main": "src/electron.js",
  "scripts": {
    "react-start": "react-scripts start",
    "react-build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "start": "tsc ./src/electron.ts && concurrently \\"cross-env BROWSER=none npm run react-start\\" \\"wait-on <http://localhost:3000> && electron .\\"",
    "build": "npm run react-build && electron-builder",
    "release": "npm run react-build && electron-builder --publish=always",
    "lint": "eslint './src**/*.{ts,tsx}'"
  },
  ...
}