質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

815閲覧

Electron contextBridgeのFunction数上限

Reiz

総合スコア29

Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

1クリップ

投稿2020/10/19 08:41

編集2020/10/20 01:25

contextBridgeのFunction数に上限があるのでしょうか?

Electronにおいてレンダラープロセス間や、APIを実行するためにpreload.tsとの橋渡しに
contextBridge.exposeInMainWorldを使用しています。
問題なく使ってきていて機能を拡張させていた所、「そのファンクションは存在しません」といった旨のエラーが出るようになりました。(色々試したため正確なエラーメッセージを保存できていません)

コンパイルエラーも起きず、実行時にエラーとなります。
exposeInMainWorldに登録していた既存のFunctionをコメントアウトしたら新しい追加分のFunctionが正常に動作するようになりました。
exposeInMainWorldに登録するFunctionが9個までならば問題がないようで10個以上登録すると10個目からが実行時エラーになるようです。(Uncaught TypeError: Cannot read property 'bar0' of undefined)

公式のドキュメントを読んでも検索しても原因が分からなかったのですが、ご存じの方いらっしゃいましたら教えていただけないでしょうか。

以下ソースは一部抜粋です。

preload.ts

1// preload.ts 2import { contextBridge, ipcRenderer} from 'electron'; 3 4contextBridge.exposeInMainWorld('myAPI', { 5 foo0: async (): Promise<string> => { 6 return '1'; 7 }, 8 foo1: async (): Promise<string> => { 9 return '1'; 10 }, 11 foo2: async (): Promise<string> => { 12 return '1'; 13 }, 14 foo3: async (): Promise<string> => { 15 return '1'; 16 }, 17 foo4: async (): Promise<string> => { 18 return '1'; 19 }, 20 foo5: async (): Promise<string> => { 21 return '1'; 22 }, 23 foo6: async (): Promise<string> => { 24 return '1'; 25 }, 26 foo7: async (): Promise<string> => { 27 return '1'; 28 }, 29 foo8: async (): Promise<string> => { 30 return '1'; 31 }, 32 foo9: async (): Promise<string> => { 33 return '1'; 34 }, 35 // ******* 10個目以降は実行時エラーになる ******** 36 foo10: async (): Promise<string> => { 37 return '1'; 38 }, 39}); 40 41// apiキーを変えて分散させても実行時エラー。Uncaught TypeError: Cannot read property 'bar0' of undefined 42contextBridge.exposeInMainWorld('myAPI2', { 43 bar0: async (): Promise<string> => { 44 return '1'; 45 }, 46}); 47

window.d.ts

1// window.d.ts 2declare global { 3 interface Window { 4 myAPI: Sandbox 5 myAPI2: Sandbox2; 6 } 7} 8 9export interface Sandbox { 10 foo0: () => Promise<string>; 11 // 省略 12 foo10: () => Promise<string>; 13} 14 15export interface Sandbox2 { 16 bar0: () => Promise<string>; 17}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

その後もずっと調べていたら過去のコンパイル時のキャッシュが残っていて悪さしているとこういったエラーが出るという情報を見つけ、コンパイル出力先のdistフォルダを色々と見ていたらdist直下のpreload.jsの最終更新日が先週になっていることに気づきました。
dist/src下のpreload.jsをdist下にコピーしたらエラーも出ず正常に動作しました。

tsconfig.jsonのoutDirの指定は"./dist"となっており、preload.tsはルートディレクトリ/srcにあります。
コンパイルするとルートディレクトリ/dist/srcにpreload.jsが作られるわけですが、先週まではなぜか/dist/preload.jsに出力していて今週からは同パスにpreload.jsが作られなくなったことで起きたようです。
tsconfig.jsonのgitログを見ても手動では変更しておらず、可能性があるとすればaxiosをインストールしたことくらいでしょうか。
問題解決に丸二日かかったので書きなぐり状態ですが残しておきます。

投稿2020/10/20 09:19

Reiz

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問