JMDC TECH BLOG

JMDCのエンジニアブログです

Wailsでクロスプラットフォーム業務改善アプリを開発してみた

JMDCでエンジニアをしてます @dtaniwaki こと谷脇です。

github.com

最近は社内の業務改善にも取り組んでいます。
JMDCでは健保、自治体等とのやりとりが多く、まだまだ手作業、紙作業が多く残っており、業務改善が重要な課題となっています。
そんな中で先日、Wailsというフレームワークを使って印刷ミスを防ぐために印刷物の対象者リストから外字を使っている対象者を発見するツールを作ったのでその所感を書きます。

選定理由としては、

  • クロスプラットフォームで作りたい。(利用者はほぼWindows, 私はMac)
  • 慣れているスタックで開発したい。(React/TypeScript/MaterialUI/Go)
  • このためだけに使う技術を入れたくない。(Qt, OpenGLなど)
  • UI部分はシンプルで良い。
  • モバイルは不要。

です。

Goで作るクロスプラットフォームアプリの選択肢に関しては、以下の記事がよくまとまっています。

zenn.dev

ElectronでGoで作ったアプリとIPC通信させることも考えましたが、それほど自由度は要らないのでWailsを選択しました。

Wailsとは

Wailsとは簡単に言うと、JavaScriptで作ったフロントエンド画面をGoでコンパイルした実行ファイルに埋め込んでWebviewで表示してIPC通信することにより、クロスプラットフォームでモダンなUIのアプリを開発できるフレームワークです。
現在も活発に開発が行われています。

wails.io

ちなみにWailsとはWebview on RailsとWalesをもじった名前らしいです🤔

Wails Appは以下のようなコンポーネントで構成されています。

アーキテクチャ

出典: https://wails.io/ja/docs/howdoesitwork

startupやshutdown等のイベント時にコールされるメソッドや、JS側からIPC経由でコールするメソッドをGoで実装することができます。

メソッドの追加は簡単で、Go側にメソッドを定義し、以下のようなstructをjsonタグ付きで定義してそのメソッドの入出力とし、Wails CLIでコード生成をするとJS側に関数が生成されるので、JS側でその関数を呼び出すだけです。

type Person struct {
    Name string `json:"name"`
    Age uint8 `json:"age"`
    Address *Address `json:"address"`
}

イベント発行やロギングなど汎用的に使える操作はデフォルトでruntimeとして使えるようになっています。

作ってみた

今回は「印刷物の対象者リストCSVファイル」、「外字TTFファイル」を入力として、外字有無や文字化け等の解析結果のエクセルファイルを出力したり、実際に印刷される文字を確認するPDFを出力するツールを作りました。

Wails CLIでプロジェクトを作成すると、Hello Worldアプリが作成されるので、テンプレコード上に、Reactでフォームを描いて、出力生成のロジックをGoで書いただけで完成です。
UI FrameworkはMaterial UIを使用しました。

こんな感じのアプリをWailsの学習時間も含めて3日程度で作ることができました。

これにより印刷物の管理作業の精度向上、効率化ができて事業がさらにスケールするようになりました。
似たような業務改善ツールの需要は社内でたくさんあるので、Wailsを使って量産していこうと思います!