Skip to the content.

プログラム解説

1. プロジェクト概要

Electron + React + TypeScript で構築された、デスクトップ向け小説執筆支援アプリケーション(novelaid)。 エクスプローラー、履歴管理(Git)、AI支援(LM Studio等)を統合した執筆環境を提供します。

2. 技術スタック

3. ディレクトリ構造

4. データフローとアーキテクチャ

状態管理

本アプリでは React Context を活用して機能を疎結合に保っています。

IPC通信

src/main/preload.ts で定義された electronHandler を通じて通信します。 主要な機能群は以下の通りです:

5. 開発の基本フロー

  1. メインプロセスの機能追加: src/main/ 配下にロジックを実装し、main.ts で IPC ハンドラーを登録。
  2. Preload定義: src/main/preload.ts にチャンネルを追加。
  3. Context / Component の実装: レンダラー側で window.electron.ipcRenderer を呼び出す処理を実装。

データおよび設定の構造、参照範囲等

将来的なユーザープラグインからのアクセスも考慮して検討する。

の区分は必要

ファイル保存する場合の名称などの検討。 一般的に、settings.json、または、config.jsonのように設定ファイルを保存するが、この区別は?
session.jsonstate.jsonもあったほうが良さそう。

それぞれ、アプリケーションレベルとプロジェクトレベルの区分で保持。

useRefで保持すればレンダリングには影響しない。 これらは、main側で永続化した方が良いかも。

アプリケーションレベル

config.json

settings.json

session.json

//TODO 履歴はどうする?

state.json

プロジェクトレベル

config.json

settings.json

多くはアプリケーション設定で良い。
プロジェクト固有の設定を追加する場合、固有設定使用有無のフラグを用意する。

プロジェクト毎で分ける設定は何がある? プラグイン機構を導入した場合は使用するプラグインの設定など?

session.json

state.json

現状の構造

読み書きはmain側。 main側のStrageServiceで管理している。

例えばプロジェクト履歴の部分。 ProjectLauncher.tsxにRecentProjectの定義。 recent:getでmain側から取得。 mainのlauncher側にもRecentProjectの定義がある。

構造については再検討、リファクタリングの必要がありそう。

Context

現在のContext、Providerとしての階層構造


    <Router>
      <AppProvider>
        <ThemeProvider>
          <SettingsProvider>
            <GitContextProvider>
              <PanelProvider>
                <MetadataProvider>
                  <AIContextProvider>
                    <DocumentProvider>
                      <AppRoutes />
                    </DocumentProvider>
                  </AIContextProvider>
                </MetadataProvider>
              </PanelProvider>
            </GitContextProvider>
          </SettingsProvider>
        </ThemeProvider>
      </AppProvider>
    </Router>

ソフトの流れ

//TODO 起動からの処理を記載

開発中のみの機能

開発ツールは開発中のみ起動時に表示されます。 //TODO どこで切り替えている?

開発ツールのトグルメニューも開発中のみの機能となっています。

//src/main/menu.ts
    const subMenuView =
      process.env.NODE_ENV === 'development' ||
      process.env.DEBUG_PROD === 'true'
        ? subMenuViewDev
        : subMenuViewProd;

でメニュー自体を切り替えています。

## アイコンの作成

  npx electron-icon-builder --input=1024x1024.png --output=./dst/      

で1つのpngから作成できる。 assetsの該当ファイルを差し替えれば良い? icon.svgは使用されない? svgから1024x1024のpngを作成するのが実際には良いかも。