🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Electron

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

3184閲覧

preload.jsがrequire文で止まってしまう現象

zHiro527

総合スコア0

Electron

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

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/01/27 12:38

編集2021/01/27 12:54

前提・実現したいこと

Electronでブラウザゲームのクライアントを開発しています。
Krunkerというゲームで、URLを使って知り合いと同じ試合に入ったりすることのできるものです。

発生している問題・エラーメッセージ

preloadさせているスクリプトで

js

1const electronPrompt = require("electron-prompt");

とするとその後の処理が止まってしまいます(この一行を削除すると他のpreload.js内の機能は正常に動くがこれがあると動かなくなる)。

該当のソースコード

javascript

1// main.js 2const { app, BrowserWindow, getCurrentWindow, clipboard, ipcMain } = require("electron"); 3const localShortcut= require("electron-localshortcut"); 4const inputPrompt = require("electron-prompt"); 5const path = require("path") 6 7let gameWindow = null; 8 9const initFlags = () => { 10 app.commandLine.appendSwitch("disable-frame-rate-limit"); // 将来的には設定で変更可能にする 11 app.commandLine.appendSwitch("enable-zero-copy") 12}; 13 14const initGameWindow = () => { 15 gameWindow = new BrowserWindow({ 16 width: 1200, 17 height: 800, 18 webPreferences: { 19 preload: path.join(__dirname, "preload.js"), 20 contextIsolation: true 21 } 22 }); 23 gameWindow.setMenuBarVisibility(false) 24 25 gameWindow.loadURL("https://krunker.io"); 26 27 initShortcutKeys(); 28 29 gameWindow.on("closed", () => { 30 gameWindow = null; 31 }); 32}; 33 34const initShortcutKeys = () => { 35 const sKeys = [ 36 ["Esc", () => { // ゲーム内でのESCキーの有効化 37 gameWindow.webContents.send("ESC") 38 console.log("ESC pressed."); 39 }], 40 ["F5", () => { // リ↓ロ↑ードする 41 getCurrentWindow.reload() 42 }], 43 ["F6", () => { // 別のマッチへ 44 gameWindow.loadURL("https://krunker.io") 45 }], 46 ["F7", () => { // クリップボードへURLをコピー(実質Inviteボタン) 47 clipboard.writeText(gameWindow.webContents.getURL()) 48 }], 49 ["F8", () => { // クリップボードのURLへアクセス(実質Joinボタン) 50 let copiedText = clipboard.readText(); 51 if (copiedText.substr(0, 25) === "https://krunker.io/?game=" || copiedText.substr(0, 30) === "https://comp.krunker.io/?game=") gameWindow.loadURL(copiedText); 52 }], 53 ["Shift+F8", () => { // URLを入力するフォームの表示 54 gameWindow.webContents.send("DIALOG_OPEN", "URL") 55 }], 56 ["Ctrl+Shift+F1", () => { // クライアントの再起動 57 app.relaunch(); 58 app.quit(); 59 }], 60 ["Ctrl+F1", () => { // 開発者ツールの起動 61 gameWindow.webContents.openDevTools() 62 }] 63 ]; 64 65 sKeys.forEach((k) => { 66 localShortcut.register(gameWindow, k[0], k[1]) 67 }); 68}; 69 70ipcMain.on("OPEN_LINK", (event, arg) => { 71 gameWindow.loadURL(arg); 72}) 73 74app.on("ready", () => { 75 initFlags(); 76 initGameWindow(); 77});

javascript

1// preload.js 2const { ipcRenderer } = require("electron"); 3const { prompt } = require("electron-prompt"); 4 5const initIpc = () => { 6 ipcRenderer.on("ESC", () => { 7 document.exitPointerLock() 8 }); 9 ipcRenderer.on("DIALOG_OPEN", (event, arg) => { 10 switch(arg){ 11 case "URL": 12 prompt({ 13 title: "Join to the game", 14 label: "URL", 15 type: "input" 16 }).then((r) => { 17 if(r !== null ) { 18 if (r.substr(0, 25) === "https://krunker.io/?game=" || r.substr(0, 30) === "https://comp.krunker.io/?game=") ipcRenderer.send("OPEN_LINK", r); 19 }; 20 }).catch(console.error); 21 } 22 }) 23}; 24 25initIpc();

試したこと

nodeIntegrationをtrueにしてみたりもしてみましたが特に意味がなく、package.jsonにもelectron-prommptの記載はすでに追記していたので原因がわかりません・・・

補足情報(FW/ツールのバージョンなど)

Windows 10 Home 最新版
node.js v14.15.4
Electron v11.2.1
electron-prompt v1.6.1

GitHub

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

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

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

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

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

YND_teratail

2021/01/29 06:23

「const electronPrompt = require("electron-prompt")をすると、その後の処理が止まってしまう」と書いてありますが、エラーが出ずに、その後が動作していないのか、エラーが出て、そこで止まっているのかどちらでしょうか。
zHiro527

2021/01/29 06:27

エラーが出ずにその後が動作していません。 Electronのエラーのポップアップ等も出ていません。 その行を削除すると他の機能(electron-promptを使わない部分)は機能します。 言葉散らずですみませんでした。よろしくお願いします。
guest

回答2

0

自己解決

electron-promptはレンダラープロセスではなくメインの方で動くものでした・・・。
メインスレッドの方でimportしたら普通に動きました!
みなさんありがとうございました!

投稿2021/02/12 04:21

zHiro527

総合スコア0

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

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

0

const { prompt } = require("electron-prompt");const prompt = require("electron-prompt");
{}は分割代入といい、以下のように使います。

js

1const obj = {a: 12, b: 53}; // objを作ったよ('ω')ノ 2 3const {a,b,c} = obj; // 代入変数したよ('ω')ノ 4 5console.log(a); // 12 6console.log(b); // 53 7console.log(c); // undefined

このとき、cをみてわかる通り、存在しない場合は、undefinedになります。
electron_promptは、ここのExampleにもある通り、分割代入を行っていません。
つまり、{}を使った時の変数promptには、undefinedが入るため、その後の処理が実行されなくなってしまうのではないでしょうか。

投稿2021/01/29 07:13

YND_teratail

総合スコア89

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問