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

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

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

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

Node.js

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

JavaScript

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

Q&A

解決済

1回答

4537閲覧

Electron(Node.js・javascript) で、ファイル分割時に変数を共有したい

nutti

総合スコア7

Electron

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

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2021/04/19 20:24

編集2021/04/20 02:47

初めての質問になります。
javascriptは基本的なwebでしか触ったことがなく、こういったシステム的なものは初心者です。
調べながら見よう見まねでやってみたのですが、うまくいかないので質問させていただきました。
質問内容など、不足事項や間違い、追加情報が必要でしたらコメントをいただけますとすぐ追記・修正いたします。
どうぞよろしくお願いいたします。

Electronのmain.js(エントリーポイント)ファイルが膨大になったので、分割をしたいがその際に変数を共有したい

Electronで開発を行っている際に、ファイルの中身が膨大になった。
その際に、ファイルを分割しようと考えたが分割した先々で使いたい変数があり、これをそれぞれ分割先で共有させたい。
色々調べて見よう見まねで試してみたのですが、うまくいかず質問させていただきました。

作成しているもの

3個の画面をelectronで作成して、それぞれの画面で表示する内容をPOSTで投稿
GETで表示している値を取得というものを作っていました。

以下参考
・画面A(windowA) => カテゴリーA
・画面B(windowB) => カテゴリーB
・画面C(windowC) => カテゴリーC
のような位置付けとなっていて

  1. POST (localhost:80/windowA)とパラメータ{ title: "hoge", name: "taro"}を送信
  2. main.jsの中にあるexpressexpress.post(/windowA, function().....)が実行される
  3. 色々処理され、2の関数内で出力命令を画面に送る => windowA.webContents.sendを実行してレンダラー側に命令を送信
  4. 受け取ったレンダラー側は情報を元に出力する

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

現状、electronのエントリーポイントである、main.jsだけで全ての処理をまとめているが、下記のような構成にしたい。

- main.js (electronのメインファイル) - express.js (expressの処理をまとめたい) - preload.js (プリロードこれは現在既にある)

その際に、electronのウィンドウの情報が入っている変数がexpress.js側になくうまくいかない。

やりたいこと

  1. Node.jsのモジュール、expressでAPIを受信して(外部からGETやPOSTされる)
  2. GET、POSTの内容を受け取り処理を行いメインプロセスからレンダラープロセスにipc通信でその情報を送りたい

その際に、現状はmain.jsの中にwindowAの変数もあるのでipc通信ができているが、
ファイル分割をしたときに、呼び出し元にあるwindowAをどうしたら良いかがわからない

該当のソースコード

main.jsの中身(現状)

javascript

1// main 2import { app, ipcMain } from 'electron' 3let windowA = new BrowserWindow({ 4 webPreferences: false, 5 contextIsolation: true, 6 preload: './preload.js' 7}) 8 9//express 10const express = require('express'); 11const ex = express(); 12 13// 参考サイトのコピー 14const bodyParser = require('body-parser'); 15ex.use(function (req, res, next) { 16res.header('Access-Control-Allow-Origin', '*'); 17res.header( 18'Access-Control-Allow-Headers', 19'Origin, X-Requested-With, Content-Type, Accept' 20); 21next(); 22}); 23ex.use(bodyParser.urlencoded({ extended: true })); 24ex.use(bodyParser.json()); 25ex.listen(80); 26 27ex.post('/', function() { 28 windowA.webContents.send('update', { title: "hoge", name: "taro"}) 29})

このソースを次のような感じに分割してファイルをすっきりしたい
express.js => 外部からのGET,POSTを受け付けて処理をしてレンダラープロセスにipc通信をしたい

javascript

1//express 2const express = require('express'); 3const ex = express(); 4 5// 参考サイトのコピー 6const bodyParser = require('body-parser'); 7ex.use(function (req, res, next) { 8res.header('Access-Control-Allow-Origin', '*'); 9res.header( 10'Access-Control-Allow-Headers', 11'Origin, X-Requested-With, Content-Type, Accept' 12); 13next(); 14}); 15ex.use(bodyParser.urlencoded({ extended: true })); 16ex.use(bodyParser.json()); 17ex.listen(80); 18 19ex.post('/', function() { 20 windowA.webContents.send('update', { title: "hoge", name: "taro"}) 21})

main.js => windowの作成などコアな部分に分けたい

javascript

1//main 2import { app, ipcMain } from 'electron' 3let windowA = new BrowserWindow({ 4 webPreferences: false, 5 contextIsolation: true, 6 preload: './preload.js' 7})

と分けたいが、windowAmain.jsのなかにあるため、express.jsではipc通信が実行できませんでした。

お聞きしたい内容が、
1これは実現できないのか
2実現する方法があるのか、そもそもが間違っているのか、できるのか
3可能であれば何をするべきなのか

です。
何卒よろしくお願いいたします。

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

module.exportsでエクスポートすることでmain.jsからrequireすることができるようになるのでそれで分割して使えるようになります。
そのときにmain.js側でmainWindowを渡してあげる(express(mainWindow);)ことで分割したファイルからも利用できるようになります

js

1const { app, BrowserWindow } = require('electron'); 2const express = require('./express.js'); 3 4let mainWindow = new BrowserWindow({ 5 webPreferences: false, 6 contextIsolation: true, 7 preload: './preload.js' 8}) 9 10express(mainWindow);

js

1// express.js 2const express = require('express'); 3const ex = express(); 4 5module.exports = (mainWindow) => { 6 ex.get('/', function() { 7 mainWindow.webContents.send('test', "test data") 8 }) 9}

(JavaScriptのモジュールはいくつか方法がありますがelectronは基本nodeでCommon.jsなのでそれで書きました)

投稿2021/04/20 00:46

mouse_484

総合スコア759

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

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

nutti

2021/04/20 01:08

ご回答いただきましてありがとうございますm(_ _)m `Common.js`こちら初めて知りました!ありがとうございます。 このような変数の渡し方があったのですね!とても勉強になります。 こちらルーティングがもしも複数個になる場合、 `module.exports`の中にどんどん増やしていくことは可能でしょうか? また、書き方的に問題はないでしょうか? ``` module.exports = (mainWindow) => { ex.get('/', function() { mainWindow.webContents.send('test', "test data") }) ex.get('/test1', function() { mainWindow.webContents.send('test1', "test data1") }) ex.post('/test2', function() { mainWindow.webContents.send('test2', "test data2") }) } ``` このような感じです! 勉強不足で申し訳ないのですが、ご教示いただければ幸いです。 何卒よろしくお願い致しますm(_ _)m
mouse_484

2021/04/20 01:11

それで問題ないです! でも大きいコードになってきたらそれぞれ機能ごとに分けるなどが必要かもしれません
nutti

2021/04/20 02:45 編集

お早いご回答いただきましてありがとうございます。 もしも大きいコードになり、機能毎に分けるとなった場合、どういった形になるのでしょうか? express.jsの中身の詳細になってしまうのですが、、 これをそのまま複製するとなりますと、私が参考にしているサイトのコピペで申し訳ないのですが ``` const express = require('express'); const ex = express(); const bodyParser = require('body-parser'); ex.use(function (req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header( 'Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept' ); next(); }); ex.use(bodyParser.urlencoded({ extended: true })); ex.use(bodyParser.json()); ex.listen(80); ``` みたいなのがあってこれも複製するとまずいのかなと思いました。 そうだとしたらmodule.exportsの中身を別ファイルに移すことになると思ったのですが、 その場合、 expressA.jsファイルを用意して module.exports = (mainWindow, ex) => { ex.get('/moduleA', function() { mainWindow.webContents.send('testModuleA', "test data") { }) ... }) このようなものを用意する感じでしょうか? ちょっと混乱してしましました。。。 express.js const express = require('express'); const ex = express(); const moduleA = require('./moduleA.js') ??? module.exports = (mainWindow) => { moduleA(mainWindow, ex)??? } ご教示いただければ幸いです。。
mouse_484

2021/04/20 02:48

その考え方であってます moduleA,B,Cと増えていくと大変なのでfsなどを使って自動で読み込んで...とかをやることが多いと思います
nutti

2021/04/20 03:06

なるほどですね! まずこの問題をクリアして、次のステップでfsでの自動読み込みをやってみようと思います! fsやってみて、また行き詰まってしまったら質問をあげさせていただきますm(_ _)m この度はありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問