ニュース

Microsoft、JavaScriptからWinRT APIを直接呼び出せる仕組みをパブリックプレビュー

Electron/Node.jsアプリからローカルAIや通知を利用。動的な生成で従来の不便を解消

公式ブログ「#ifdef Windows」におけるアナウンス

 米Microsoftは7月27日(現地時間)、「Node.js」からネイティブな「Windows Runtime」(WinRT)APIへ直接アクセスできる新しい仕組み(a dynamic WinRT projection for Node.js)をパブリックプレビューとして公開した。たとえばJavaScript/TypeScriptで記述された「Electron」アプリから最新のOS機能を利用する際も、わざわざC++/C#ブリッジなどを介する必要がなくなる。

 「Electron」「Node.js」は慣れ親しんだHTML、CSS、JavaScript/TypeScriptでアプリを開発できるとして人気を博しているが、WinRT APIを呼び出すのは容易ではない。C++やC#のアドオンを介して行う場合、関連コンポーネントの管理や互換性検証が必要となるし、WinRT APIのメタデータ(WinMD)をもとにしたラッパーを参照しようにも、保守が遅れがちで最新のAPIにアクセスできないことがある。

 そこで今回、「WinMD」から動的にJavaScript/TypeScriptのラッパーを生成する仕組み(プロジェクション)が導入された。

 このプロジェクションは、以下の3つの「npm」パッケージから成る。

  • @microsoft/winappcli:Windowsアプリの開発に必要なSDK管理やパッケージング、アプリID・マニフェスト・証明書の生成などを、さまざまなフレームワークから扱えるようにするコマンドラインツール「Windows App Development CLI」(winapp CLI)
  • @microsoft/dynwinrt-codegen:「WinMD」メタデータをもとにJavaScriptラッパー(.js)と対応するTypeScript宣言(.d.ts)を生成
  • @microsoft/dynwinrt:アプリの実行時にWindows API呼び出しをディスパッチ(割り当て)するビルド済みのx64/arm64ランタイム

 ユーザーがインストールするのは「@microsoft/winappcli」のみでよい。「dynwinrt」のコード生成とランタイムも同時に導入される。既存の「Electron」アプリへ導入する場合は、「WinApp CLI」をインストールしてプロジェクトを初期化すればよい。

npm install --save-dev @microsoft/winappcli
npx winapp init . --use-defaults --add-js-bindings

 「winapp init」を実行すると、マニフェストの作成やSDKのセットアップ、必要パッケージの追加が行われ、「.winapp/bindings/」以下にJavaScriptラッパー(バインディング)が生成される(実験的な位置付けながらPythonバインディングも備える)。もし「WinMD」に変更があっても、ブリッジやラッパーのアップデートを待つ必要はない。バインディングを再生成するだけで変更に追従できる。

 つまり、このプロジェクションがあればJavaScript/TypeScriptとWinRT APIの橋渡しが可能。WinRT APIが提供する以下のOS機能を簡単に利用できるようになるわけだ。

  • オンデバイスAI:「Copilot+ PC」搭載のAIチップで「Phi Silica」モデルを実行。「Windows ML」モデルの実行も可能で、テキスト生成、要約、書き換え、テキストからテーブルへの変換、テキスト認識、画像スケーリング、オブジェクトの抽出・削除などが行える
  • アプリおよびコンテンツAPI:通知、ファイル・フォルダーの選択、ストレージへのアクセス、画像デコード、さらにリッチクリップボードコンテンツ
  • システムおよびデバイスAPI:ネットワーク、センサー、グローバリゼーション、暗号化アルゴリズムなど

 なお、これらの一部はサンプルアプリ「Electron on Windows Gallery」で体験可能。このアプリ自身も「Electron」と本プロジェクションを用いて開発されており、ソースコードも公開されている。必ず開発の参考になるだろう。

「Electron on Windows Gallery」