ゲーム開発
Unity
UnrealEngine
C++
Blender
ゲーム数学
ゲームAI
グラフィックス
サウンド
アニメーション
GBDK
制作日記
IT関連
ツール開発
フロントエンド関連
サーバサイド関連
WordPress関連
ソフトウェア設計
おすすめ技術書
音楽
DTM
楽器・機材
ピアノ
ラーメン日記
四コマ漫画
その他
おすすめアイテム
おもしろコラム
  • ゲーム開発
    • Unity
    • UnrealEngine
    • C++
    • Blender
    • ゲーム数学
    • ゲームAI
    • グラフィックス
    • サウンド
    • アニメーション
    • GBDK
    • 制作日記
  • IT関連
    • ツール開発
    • フロントエンド関連
    • サーバサイド関連
    • WordPress関連
    • ソフトウェア設計
    • おすすめ技術書
  • 音楽
    • DTM
    • 楽器・機材
    • ピアノ
  • ラーメン日記
    • 四コマ漫画
      • その他
        • おすすめアイテム
        • おもしろコラム
      1. ホーム
      2. 20231231_02_electron_vue

      【Electron × Vue3】Electron × Vue3 × TypeScript × Vite でツール開発環境を整える

      ツール開発JavaScriptフロントエンド関連ElectronVue.jsTypeScriptVite
      2023-12-31

      マイケル
      マイケル
      みなさんこんにちは! マイケルです!
      エレキベア
      エレキベア
      こんにちクマ〜〜〜
      マイケル
      マイケル
      今回は Electron というフレームワークを用いて ツールの開発環境を整えてみます!
      エレキベア
      エレキベア
      Electron・・・確かフロントエンド技術で アプリ開発できるフレームワークだったクマね
      マイケル
      マイケル
      そう、これまではちょっとしたツールはPythonで作ることが多かったけど いくつか不満もあったし、フロント技術もある程度扱えるようになってきたから手を出してみたんだ! そのあたりにも触れつつ、解説していこうと思います。
      エレキベア
      エレキベア
      楽しみクマ〜〜〜

      Electronの特徴

      マイケル
      マイケル
      まず、Electronとはどのようなものかというと、 JavaScript、HTML、CSS等のWeb技術を用いてデスクトップアプリケーションを構築するためのフレームワーク になります。
      Electronとは
      • JavaScript、HTML、CSS等のWeb技術を用いてデスクトップアプリケーションを構築するためのフレームワーク
      20231231_electron_vue_05

      Electron - 公式ページ


      エレキベア
      エレキベア
      Web技術がそのまま使用できるのは、 フロントエンドエンジニアからしたら有り難そうクマね
      マイケル
      マイケル
      そう、ReactやVueといったUIフレームワークも扱えるから Web開発と同じような感覚でUI構築が行いやすいのが特徴だね
      マイケル
      マイケル
      Python等を使用して開発する場合、どうしても環境依存の問題が出てきてしまいがちだけど Web技術をベースにしているためにプラットフォーム依存が少なくパッケージ化が容易い のもメリットです。 しかしその反面、Chromiumがそのまま組み込まれているためにアプリ容量が大きくなってしまう なのがデメリットになります・・・。
      エレキベア
      エレキベア
      むむ、容量が大きくなるのは仕方ないクマね・・・
      マイケル
      マイケル
      最近だと容量問題を解決した Tauri というRustベースのフレームワークもあるから、こちらもその内触ってみようと思います。 以上をまとめると、下記のような特徴になります!
      メリット
      • Web技術を使用しているため、プラットフォーム依存が少ない
      • ReactやVueといったUIフレーワークを使用することができる
      • アプリ開発を前提に用意されているため、パッケージ化が容易い
      デメリット
      • chroniumをそのまま組み込んでいるため容量が大きい
      • 使用できる機能がWeb技術に依存する所がある

      エレキベア
      エレキベア
      大体どんなものか分かってきたクマ〜〜〜
      マイケル
      マイケル
      それじゃさっそく触っていこう!

      Electron開発環境の構築

      マイケル
      マイケル
      今回作ったテンプレートは、下記のGitHubに上げています。 こちらもよければ参考にしてください!

      GitHub - electron-vue-ts-template

      エレキベア
      エレキベア
      自由に使ってくれて構わないクマ〜〜

      開発環境の構成

      マイケル
      マイケル
      今回は 下記のような構成 + TypeScriptを使用 できるよう 開発環境を構築しました!
      種類
      使用ライブラリ
      フロントエンド
      Vue3
      バックエンド
      Electron
      ビルドツール
      Vite
      エレキベア
      エレキベア
      ほう・・・ Viteは確かビルドが高速なことで有名なビルドツールクマね フロントは何でVueにしたクマ??
      マイケル
      マイケル
      Reactとどっちを使うか迷ったんだけど、 ツール開発は基本的に規模が小さい & Vueの方が実装量が少なそう といった理由からVueを使ってみることにしたよ! あとは単純にVueを使ったことがなかったので興味本位もありますね!
      エレキベア
      エレキベア
      まあちょっとしたツール開発は規模も小さいクマからね 何かを試すにはいい機会クマ
      マイケル
      マイケル
      最近だとSvelteも気になってはいるんだけどね・・・ 今回はViteCLIからテンプレートを作成するので、Vueが嫌な人は違うフレームワークを選択して進めてみてください!

      Vue3×TypeScriptプロジェクトの雛形作成

      マイケル
      マイケル
      それではまずは Vue3 * TypeScript の雛形プロジェクトを作成します。 作成方法としてはVueCLIを使用する方法もありますが、今回はUIフレームワークを変更した場合でも同様の手順で環境構築できるよう ViteCLI を使用して作成していきます。
      エレキベア
      エレキベア
      Viteベースでプロジェクトを作成してElectronを追加導入する流れ クマね シンプルに環境が作れそうクマ
      マイケル
      マイケル
      ViteCLIでプロジェクトを作成するには下記コマンドを実行します。 フレームワーク、言語を聞かれるので、そこでVue、TypeScriptを選択し npm install すれば完了です!
      # Vue * TypeScript の雛形を作成
      npm init vite@latest
      ✔ Project name: … electron-vue-ts-template
      ✔ Select a framework: › Vue
      ✔ Select a variant: › TypeScript
      
      # npmモジュールインストール
      cd electron-vue-ts-template/
      npm install
      
      エレキベア
      エレキベア
      簡単クマ〜〜〜〜
      マイケル
      マイケル
      この時点で npm run dev を実行してURLにアクセスすると サンプルプロジェクトが開くことを確認できます。
      npm run dev
      
      20231231_electron_vue_01
      ▲URLにアクセスすると初期画面が表示される

      エレキベア
      エレキベア
      あとはこれをElectronでアプリとして開けるようにすればいいクマね

      Electronの導入

      マイケル
      マイケル
      それではこのプロジェクトにElectronを導入していきます。 下記コマンドでインストールしましょう!
      npm install --save-dev electron@latest
      
      マイケル
      マイケル
      そしてElectron用のtsconfigを作成します。 ElectronのメインプロセスはNode.jsで動くので、commonjsとして認識するよう記載します。
      # Electronメインプロセス用のtsconfigを作成
      touch tsconfig.electron.json
      
      {
          /* electron override settings */
          "extends": "./tsconfig.json",
          "compilerOptions": {
            /* commonjs */
            "target": "esnext",
            "module": "commonjs",
            "moduleResolution": "node",
            "sourceMap": true,
            "esModuleInterop": true,
            "lib": ["esnext", "DOM", "DOM.Iterable"],
            "skipLibCheck": true,
            
            /* bundler mode */
            "allowImportingTsExtensions": false,
            "noEmit": false,
      
            "outDir": "dist/electron"
          },
          "include": ["src/electron/**/*"]
        }
      
      エレキベア
      エレキベア
      Vue.js側のtsconfigとは別に作成するのクマね
      マイケル
      マイケル
      あとは src/electron フォルダ配下にElectron用のコードを作成します。 こちらは Electron公式のチュートリアル をベースにしています。

      Electron - 公式チュートリアル

      import { app, BrowserWindow } from "electron";
      import * as path from "path";
      
      function createWindow() {
        const mainWindow = new BrowserWindow({
          height: 600,
          width: 800,
          webPreferences: {
            preload: path.join(__dirname, "preload.js"),
          },
        });
      
        mainWindow.loadFile(path.join(__dirname, "../index.html"));
      
        // Open the DevTools.
        // mainWindow.webContents.openDevTools();
      }
      
      app.whenReady().then(() => {
        createWindow();
      
        app.on("activate", function () {
          if (BrowserWindow.getAllWindows().length === 0) createWindow();
        });
      });
      
      app.on("window-all-closed", () => {
        if (process.platform !== "darwin") {
          app.quit();
        }
      });
      
      window.addEventListener("DOMContentLoaded", () => {
        const replaceText = (selector: any, text: any) => {
          const element = document.getElementById(selector);
          if (element) {
            element.innerText = text;
          }
        };
      
        for (const type of ["chrome", "node", "electron"]) {
          replaceText(`${type}-version`, process.versions[type as keyof NodeJS.ProcessVersions]);
        }
      });
      
      エレキベア
      エレキベア
      メインプロセスの処理は main.ts レンダラープロセスの処理も呼び出す場合は preload.ts に書くクマね
      マイケル
      マイケル
      あとは preload.ts で設定した値を確認するため、 vueファイルを一部修正します。 合わせて vite.config.ts のbase項目を設定しておきましょう。
      <template>
      ・・・省略・・・
      
        <!-- electron preload test-->
        <div>
          We are using Node.js <span id="node-version"></span>,
          Chromium <span id="chrome-version"></span>,
          and Electron <span id="electron-version"></span>.
        </div>
      </template>
      
      import { defineConfig } from 'vite'
      import vue from '@vitejs/plugin-vue'
      
      // https://vitejs.dev/config/
      export default defineConfig({
        plugins: [vue()],
        base: './'
      })
      
      エレキベア
      エレキベア
      これで一通りの実装は完了クマね
      マイケル
      マイケル
      package.json の変更は下記になります。 ・npmコマンドをそれぞれ定義 ・main項目にElectronのエントリポイントを指定 ・type: module 項目を削除
      {
        "name": "electron-vue-ts-sample",
        "private": true,
        "version": "0.0.0",
        "scripts": {
          "vite:dev": "vite",
          "vite:build": "vue-tsc && vite build",
          "vite:preview": "vite preview",
          "electron:build": "tsc -p tsconfig.electron.json",
          "electron:dev": "electron .",
          "dev": "npm run build && npm run vite:dev",
          "build": "npm run vite:build && npm run electron:build",
          "app": "npm run build && npm run electron:dev"
        },
        "main": "dist/electron/main.js",
        "dependencies": {
          "vue": "^3.3.8"
        },
        "devDependencies": {
          "@vitejs/plugin-vue": "^4.5.0",
          "electron": "^27.1.3",
          "electron-builder": "^24.9.1",
          "typescript": "^5.2.2",
          "vite": "^5.0.0",
          "vue-tsc": "^1.8.22"
        }
      }
      
      マイケル
      マイケル
      npm run dev → ブラウザ確認 npm run app → アプリ確認 といった使い分けになります。
      マイケル
      マイケル
      Viteにより npm run dev での確認時はホットリロードされますが、 アプリ確認時はホットリロードされません。 そのため基本はブラウザで確認しながら開発し、Eletron側の機能を確認したい時だけ npm run app する、といった形で進めることにしました。
      # ビルドのみ行う
      npm run build
      
      # ブラウザで起動する
      npm run dev
      
      # アプリで起動する
      npm run app
      
      エレキベア
      エレキベア
      ブラウザで開発を進めながら、アプリを立ち上げて確認する感じクマね
      マイケル
      マイケル
      アプリを立ち上げながらホットリロードする方法もあるようなので、 興味がある方は調べてみてください。
      20231231_electron_vue_02
      ▲npm run dev でブラウザ起動した状態

      20231231_electron_vue_03
      ▲npm run app でアプリを立ち上げた状態

      マイケル
      マイケル
      上記のようにそれぞれ立ち上がれば完了です!
      エレキベア
      エレキベア
      やったクマ〜〜〜

      electron-forgeの導入

      マイケル
      マイケル
      最後に、作成したアプリをパッケージ化するための環境を作ります。 こちらは公式チュートリアルでも使用されている electron-forge を使用しました。

      Electron - クイックスタート

      マイケル
      マイケル
      下記コマンドでインストールした後、 package.json内の記載を修正します。
      npm install --save-dev @electron-forge/cli
      
      # forge.config.js生成とpackage.jsonへの追加
      npx electron-forge import
      
      "scripts": {
      ・・・略・・・
          "app:package": "electron-forge package",
          "app:make": "electron-forge make"
        },
      
      マイケル
      マイケル
      あとは下記のようにpackageコマンドを実行すると デフォルトでoutフォルダ配下に出力されるはずです!
      # forge.config.jsの設定に基づいて配布可能なパッケージを出力
      npm run app:package
      
      20231231_electron_vue_04
      ▲outフォルダ配下にアプリが出力される

      エレキベア
      エレキベア
      ちゃんとアプリとして出力されてるクマ〜〜〜
      マイケル
      マイケル
      forge.config.js を修正することでアイコンを変えたりなどアプリの設定が行えるので、この辺りは各々調整してみてください!

      electronforge create-and-add-icons

      おわりに

      マイケル
      マイケル
      今回はViteで作成したプロジェクトにElectronを組み込んで環境構築をしてみました! どうだったかな?
      エレキベア
      エレキベア
      簡単にアプリが作成できて感動したクマ〜〜 Web開発と同じ感覚でホットリロード開発ができるのも嬉しいクマね
      マイケル
      マイケル
      今回作った環境を使用して実際にツールを2つほど作ってみたので、 こちらも興味がある方は見てみてください! メインプロセスとレンダラープロセスの連携 周りも解説してあります!
      【Electron × Vue3】画像をリサイズして任意の場所に保存するツールを作る
      2023-12-31
      【Electron × Vue3】カテゴリ情報のCSVデータを操作するツールを作る
      2023-12-31
      エレキベア
      エレキベア
      実践的なアプリ開発クマね
      マイケル
      マイケル
      それでは今日はこの辺で! アデュー!!
      エレキベア
      エレキベア
      クマ〜〜〜〜

      【Electron × Vue3】Electron × Vue3 × TypeScript × Vite でツール開発環境を整える 〜完〜


      ツール開発JavaScriptフロントエンド関連ElectronVue.jsTypeScriptVite
      2023-12-31

      関連記事
      【Unity】Timeline × Excelでスライドショーを効率よく制作する
      2024-10-31
      【ゲーム数学】第九回 p5.jsで学ぶゲーム数学「フーリエ解析」
      2024-05-12
      【Node.js】廃止されたAmazonアソシエイト画像リンクをAmazon Product Advertising API経由で復活させる
      2024-01-08
      【都会のエレキベア】ブログを大幅リニューアル!WordPressからNext.jsに移行するまでの流れをまとめる
      2024-01-01
      【Next.js】第四回 WordPressブログをNext.jsに移行する 〜サーバ移行・SEO・広告設定編〜
      2023-12-31
      【Next.js】第三回 WordPressブログをNext.jsに移行する 〜Markdown執筆環境構築編〜
      2023-12-31
      【Next.js】第二回 WordPressブログをNext.jsに移行する 〜WordPressデータの移行・表示編〜
      2023-12-31
      【Next.js】第一回 WordPressブログをNext.jsに移行する 〜全体設計、環境構築編〜
      2023-12-31