Electron 앱을 TypeScript 및 React로 작성

개요



Mac상에서 electron 앱을 개발함에 있어서, 우선 이하의 구성으로 최소한 앱을 만들어 동작 검증을 실시했다.

구성


  • Macintosh (Catalina ver10.15.7)
  • node.js (ver12.13.0)
  • electron (ver13.1.8)
  • typescript (ver 4.0.2)

  • 성과


  • 버튼을 클릭하면 카운트 업하는 간단한 electron 앱을 구축
  • TypeScript로 작성된 앱 코드에서 중단 점을 설정하여 Chromium 내장 디버거에서 중지 할 수 있는지 확인
  • react developer tools는 react component tree를 Chromium 내장 디버거에서 볼 수 있는지 확인합니다.

    구축 절차



    node.js 개발 환경



    참조 : nodebrew에서 node 버전을 전환하는 방법 - Qiita

    Mac에서 nodebrew를 사용하여 node.js를 설치하는 것이 좋습니다. 이번에는 ver12.13.0을 이용한다.
    $ node --version
    v12.13.0
    

    Electron (with TypeScript + Webpack) 개발 환경



    참조 : TypeScript + Webpack - Electron Forge

    여기에서는 앞으로 만들려고 할 world clock을위한 프로젝트를 만드는 절차를 보여줍니다.
    자동 생성된 Hello World가 동작하는 것을 확인할 수 있다.
    $ yarn create electron-app world-clock --template=typescript-webpack
    $ cd world-clock
    $ yarn start
    



    React 소개



    참조 : React with TypeScript - Electron Forge

    변경 순서의 자세한 것은 상기의 링크처를 참조. 이하와 같은 파일 구성으로 하였다.
    world-clock/
      +-- README.md
      +-- tsconfig.json                  // JSX サポートを追加
      +-- package.json                   // react, react-dom を追加
      +-- yarn.lock
      +-- webpack.main.config.js         // webpack.* は、自動生成されたまま
      +-- webpack.plugins.js
      +-- webpack.renderer.config.js
      +-- webpack.rules.js
      +-- node_modules/
      |     +-- ....
      +-- src/
            +-- index.ts                 // main process で実行される
            +-- index.html               // ほぼ白紙
            +-- renderer.ts              // renderer process で最初に実行される preload script
            +-- App.tsx           // react
            +-- DumbButton.tsx           // react
    

    여기에서 실행하면 아래와 같이 버튼을 누르면 카운트 업하는 electron 앱이 기동된다.
    $ yarn start
    



    코드 상세



    코드에서 포인트가 되는 부분을 설명해 둔다. gitlab 소스 코드는 여기 .

    index.ts



    참조 : GitHub - MarshallOfSound/electron-devtools-installer: An easy way to ensure Chrome DevTools extensions into Electron

    향후 개발 중 react developer tools를 사용하고 싶기 때문에 electron-devtools-installer를 이용하기로 했다. 이 메커니즘을 사용하면 renderer process를 담당하는 chromium 시작시 지정한 확장 기능 (이 경우 react developer tools)을 자동으로 설치할 수 있습니다.

    index.ts
    import installExtension, {
      REACT_DEVELOPER_TOOLS,
    } from "electron-devtools-installer";
    
    app.on("ready", () => {
      // For now, I would use React Dev Tools.
      installExtension(REACT_DEVELOPER_TOOLS)
        .then((name) => console.log(`Added Extension:  ${name}`))
        .catch((err) => console.log("An error occurred: ", err));
    });
    
    

    renderer.ts



    참조 : TypeScript + Webpack - Electron Forge

    이번에 이용한 템플릿에서는 renderer.ts라는 파일이 renderer process에서 최초로 실행되는 preload script로 지정되어 있다. 이 renderer.ts 에 react 의 JSX 기법을 직접 기술하려고 하면(자), 파일명을 renderer.tsx 로 변경할 필요가 있어 이야기가 번거롭게 된다.

    따라서, 이하와 같이 실제의 react (with JSX) 의 기술은 App.tsx 로부터 앞의 파일군으로 실시한다고 하고, 이 renderer.ts 는 단순한 1행으로 했다.

    renderer.ts
    import "./App";
    

    App.ts, DumbButton.ts



    매우 일반적인 샘플 코드로, 설명하고 설명하는 부분은 없습니다. gitlab의 코드를 참조하십시오.
  • App.ts
  • DumbButton.ts

  • 향후 개발, 디버그에서 중요한 두 가지 점을 확인했다.

    (1) Chromium의 디버거 사용 가능

    react 를 사용한다는 것은 어플리케이션 코드의 대부분이 renderer process상에서 움직이기 때문에, renderer process 의 디버그가 원활하게 할 수 있는 것을 확인하고 싶다.
    버튼을 클릭했을 때에 기동되는 onClick() 에 breakpoint를 설정하면, 클릭시에 제대로 멈추는 것을 확인할 수 있었다.



    (2) react developer tools 사용 가능

    이번에는 이 확인을 위해 굳이 App, DumbButton이라는 2개의 react component를 작성했다.
    react component tree 가 구축되어 react developer tools 가 그 구조에 근거한 정보를 표시하고 있는 것을 확인할 수 있었다.

    좋은 웹페이지 즐겨찾기