Electron + Svelte App 시작하기

2022년 4월 23일 수정

이 글은 Svelte 프레임워크를 이용해 Electron 앱을 개발하기 위한 가장 기본적인 부분들을 만들어가는 과정을 설명한다.

Svelte 프로젝트 생성하기

Svelte 프로젝트 템플릿은 npx로 간단하게 설정할 수 있다.

npx degit sveltejs/template PROJECT_NAME
cd PROJECT_NAME
yarn  # or npm install

Electron 추가하기

의존성 추가는 Electron 셋업하기 글을 참고하자. 의존성을 추가하고 index.js 파일을 추가하고 start 스크립트를 수정하는 모든 부분이 필요하다.

의존성을 추가한 후 Svelte 템플릿을 설치할 때 생긴 public/index.html 파일을 열어서 각 리소스 및 스크립트 파일들 경로를 상대 경로로 수정해주자. globa.css, build.css, bundle.js 파일의 경로에서 제일 앞의 / 를 빼주기만 하면 된다. 수정된 내용은 아래와 같은 식이다.

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset='utf-8'>
  <meta name='viewport' content='width=device-width,initial-scale=1'>

  <title>Seonews</title>

  <link rel='icon' type='image/png' href='/favicon.png'>

  <!-- 수정된 코드 1 -->
  <link rel='stylesheet' href='global.css'>

  <!-- 수정된 코드 2 -->
  <link rel='stylesheet' href='build/bundle.css'>

  <!-- 수정된 코드 3 -->
  <script defer src='build/bundle.js'></script>
</head>

<body>
</body>
</html>

시험해보기

가장 기본적인 부분이 셋업되었기 때문에 이제 실행이 가능하다. 아래 커맨드로 실행시켜보자.

yarn run start
# or
npm run start

Hello World 느낌이 나는 화면이 뜨면 정상이다. 혹시나 빈 화면이 뜨면 Inspector(Command+Option+I)를 열어서 콘솔의 메시지를 살펴보면 도움이 될 때가 있다.

electron-reload 지원해보기

파일을 수정할 때마다 Electron을 띄우는 것은 귀찮다. 물론 Command+R 이나 F5 키로 리프레시가 가능하다지만 이조차도 귀찮다면 electron-reload 를 설정하는 것도 한 방법이다.

yarn add -D electron-reload
# or
npm install --save-dev electron-reload

당연하겠지만 개발시에만 사용하므로 프로던션 의존성에는 들어가지 않도록 설치하는 명령이다.

이제 이를 로드하도록 index.js 를 열어서 코딩해보자. 아래 코드를 상단 적절한 위치에 넣어두자. 개인적으로는 import(require) 이후에 넣는걸 선호한다.

var devMode = process.env.DEV_MODE ? (process.env.DEV_MODE.trim() == "true") : false;

if (devMode) {
    require('electron-reload')(__dirname, {
        electron: upath.toUnix(upath.join(__dirname, 'node_modules', '.bin', 'electron'))
    });
}

이 코드는 DEV_MODE 라는 환경변수가 true 로 세팅되어야 electron-reload 가 작동하도록 하는 코드다. 따라서 이 부분도 적용되어야 할 것이다. package.json 을 열어서 scripts 항목의 start 부분을 수정해주자.

"start": "DEV_MODE=true electron ."

이러면 실행시킬 때 electron-reload 가 동작한다. 물론 원하는 이름의 스크립트에 넣어도 관계는 없다.

자동 빌드 문제 해결하기

불행히도 electron-reload 만으론 리로드가 완벽하게 되지 않는다. 일부 코드는 빌드가 필요하기 때문이다. 그렇다면 자동으로 빌드가 되게 만들어야 한다. 기본적으로 dev 스크립트가 빌드를 하는 명령이니 이걸 호출할 수 있게 해야 한다.

우선 wait-onconcurrently 의존성을 개발 전용으로 설치한다.

yarn add -D wait-on concurrently
# or
npm install --save-dev wait-on concurrently

그리고 package.jsonscripts 들에서 아래와 같은 항목들을 수정한다.

"start": "sirv public --no-clear",
"electron": "wait-on http://localhost:5000 && electron .",
"electron-dev": "DEV_NODE=true concurrently \"yarn run dev\" \"yarn run electron\"",

이제 개발용으로 쓸 새로운 electron-dev 스크립트 명령을 만들었다. 아래와 같이 실행시켜서 시험해보자.

yarn run electron-dev
# or
npm run electron-dev

개인적으론 대부분의 자동화가 잘 되었지만 간혹 뭔가 빠지는 느낌인데 그럴땐 어쩔 수 없이 Electron 창에서 Command+R 키 등을 눌러서 직접 리프레시를 해주어야 한다. 그래도 네이티브 앱 개발 시에 비하면 순식간에 재로딩이 되니 큰 불만은 없다.

vscode에서 간편하게 실행시키기

launch.json 파일을 생성해서 아래와 같이 코딩해 줄 수 있다.

{
    "version": "0.2.0",
    "configurations": [{
        "name": "Debug Electron",
        "type": "node",
        "request": "launch",
        "cwd": "${workspaceRoot}",
        "runtimeExecutable": "yarn",
        "program": "electron-dev"
    }]
}

이후 vscode의 실행 및 디버그 탭에서 해당 실행 프로파일이 생성된 것을 확인할 수 있고 실행시켜 볼 수 있다. 사실 별로 이상할 것도 없이 위에서 작성한 electron-dev 스크립트를 실행시키는 명령이다. 재실행도 잘 되고 생각보다는 편했다.