こんにちは
私は他のプラグインの中でも、React.jsとbabelifyでElectronを使用しています(下部のリスト)。
たとえば、電子のBrowserWindow
にアクセスするために、 require('electron')
を使用しようとすると、コンソールに次のエラーが表示されます。
index.js:4 Uncaught TypeError: fs.readFileSync is not a function
ただし、main.jsでconst electron = require('electron');
を使用することはできます。 その価値については、watchifyを使用してすべてをjsバンドルにパックしています。
これが私のpackage.jsonの依存関係の完全なリストです:
"devDependencies": {
"axios": "^0.9.1",
"babel-preset-es2015": "^6.6.0",
"babel-preset-react": "^6.5.0",
"babelify": "^7.2.0",
"classnames": "^2.2.3",
"electron": "^1.3.5",
"electron-reload": "^0.2.0",
"jquery": "^2.2.3",
"react": "^0.14.8",
"react-autocomplete": "^1.0.0-rc2",
"react-dom": "^0.14.7",
"react-sound": "^0.4.0",
"soundmanager2": "^2.97.20150601-a"
},
index.js:4 Uncaught TypeError:fs.readFileSyncは関数ではありません
ここにindex.js
の4行目を含めることができますか? または、より完全なスタックトレースですか?
それ自体がプロジェクトのノードモジュールにあるelectronのindex.jsを参照していると思います。 このファイルの内容は次のとおりです。
var fs = require('fs')
var path = require('path')
module.exports = path.join(__dirname, fs.readFileSync(path.join(__dirname, 'path.txt'), 'utf-8'))
スタックトレース全体は、React.jsとの競合を示唆しています。
開発ツールの[コンソール]タブからrequire('fs').readFileSync
を実行するとどうなりますか?
electron-prebuilt
ノードモジュール(貼り付けたファイル)がパッケージ化されたアプリに含まれているようですが、代わりに組み込みのelectron
requireを使用する必要があるため、これは望ましくないと思います。
@nukeopアプリをどのように起動していますか。 `開始スクリプトは次のようになります。
"scripts": {
"start": "electron ."
}
main.js
をノードで実行しようとしているように感じます
node main.js
うまくいかない
開発ツールの[コンソール]タブからrequire( 'fs')。readFileSyncを実行するとどうなりますか?
このエラーがスローされた直後に、コンソールでrequire('fs').existsSync
を実行して、関数の定義を出力することができます。 エラーの前にも機能します。
代わりに組み込みのelectronrequireを使用する必要があるため、electron-prebuiltノードモジュール(貼り付けたファイル)がパッケージ化されたアプリに含まれるようになります。
開発中、パッケージを継続的に更新しているwatchifyインスタンスがバックグラウンドで実行されています。 package.jsonのscriptsセクションで次のように定義しました。
"watch": "watchify app/app.js -t babelify -o public/js/bundle.js --debug --verbose"
electron-prebuilt
のバンドルを回避するためのアドバイスはありますか?
@nukeop Electronは内部的にrequireをサポートしているため、browserifyを使用する必要はありません。
私の知る限り、browserifyを使用したいのですが、「electron」を除外する必要があります。
興味深いことに、watchify / browserifyがこれを台無しにしている可能性がありますか? これまでは問題なく動作しました。
今、私はそれなしでプログラムを実行する方法がわかりません。
文字通りただ走る
electron .
Electronは内部にフルノード環境を備えているため、メインのアプリフォルダーから、Electronを使用するときに何もバンドルする必要はありません。
_Browserifyの問題なので、これを終了します_
これは私がずっとやってきたことであり、プログラムを単一の.jsファイルにパックします。このファイルは、次のような単純なhtmlファイルに含まれています。
<script src="public/js/bundle.js">
</script>
そして、requireを使用する場合を除いて、すべてが機能します。 これは、2つのモジュール間の相互作用の問題です。
プログラム全体をバンドルにパックしないと、main.jsがelectronを起動し、バンドルを含むhtmlファイルをロードするだけなので、簡単に実行する方法がありません。
@nukeop Electron内のレンダラープロセスは、完全なノード/ commonjs環境にもアクセスできるため、何もバンドルする必要はありません。
プログラム全体をバンドルにパックしないと、main.jsがelectronを起動し、バンドルを含むhtmlファイルをロードするだけなので、簡単に実行する方法がありません。
ここで理解できるかどうかはわかりません。HTMLファイルにロードするスクリプトは完全なcommonjs環境を備えているため、 require
を使用して、何もブラウザ化せずに追加のファイルをロードできます。
将来この問題に遭遇し、このスレッドを読む人にとって、requireの代わりにwindow.require
を使用することは、electronとbrowserifyのrequire
関数間の競合を回避する1つの可能性です。
FWIW、browserifyの代わりにバックエンドでwebpackを使用するcreate-react-appを使用して、レンダラープロセスでelectronを使用しようとすると同じ問題が発生しました。 window.require
は私にとってもそれを解決しているようですが、理由は完全にはわかりません。
編集:理由を理解しました:-) webpackによるコンパイル中に使用されるnodejs環境ではなく、実行時に提供されるnodejs環境から実行時にrequire
electron
にしたいのです。 デフォルトでは、グローバルはwindow
にバインドされ、webpackのコンパイルはwindow
グローバルを無視します-したがって、 window.require
機能します。
グローバル名を無視するようにwebpackに指示する別の方法は、JSファイルで/*global Android*/
のようなコメントを使用することです。 Android WebViewでCRAビルドアプリを使用する別のプロジェクトでは、上記を使用して、Webviewが提供するJavaScriptインターフェイスを介してJSに公開されたJavaオブジェクトにアクセスしました。
@ nukeop-最後の投稿に感謝します。 それは私を大いに助けました。 window.require
は私のために働いた。
うん、私のcreatereactアプリ/ webpackの問題を修正しました。
変化する
import electron, { ipcRenderer } from 'electron'
に
const electron = window.require("electron")
@srinathhメインのレンダラーとしてCRAアプリをどのように公開/ロードしていますか? 最初に構築していますか(そしてhtml静的リソースパスを変更していますか)
はい、私のワークフローは現在、基本的にCRAスクリプトを使用してnpm run build
を実行し、次に電子を使用してbuild
フォルダーで出力を実行することです。 静的リソースパスを手動で変更する必要はありません。 CRAスクリプトのpackage.json
では、このようにhomepage
を設定するだけで、パスが適切に設定されます。
"homepage": "./"
さらに、 public
フォルダーに電子アプリ用のmain.js
とpackage.json
があります。 したがって、ビルドを実行すると、それらが自動的にコピーされ、 electron build/
を実行するだけでアプリを起動できます。
私は実際に開発のために電子でnpm start
を実行できるようにしたいと思っていますが、それを機能させる方法を理解することはできませんでした。 eject
を実行して、スクリプトを手動で変更する必要があると思います。
セットアップの例を見たい場合は、 https://github.com/srinathh/snippetfuをご覧ください。
私はElectronを使用していませんが、Node-Webkit(nw.js)を使用しています。
window.require
を使用しても、問題は解決しました。 どうもありがとうございました!
@nukeop window.require
は私のためにトリックをしてくれて、どうもありがとうございました! 🎉
@nukeop同じエラーが発生しましたが、window.requireトリックを解決しました、どうもありがとうございました!
window.require
はfs.existsSync is not a function
の問題を解決しましたが、別のエラーが発生しました: window.require
は関数ではありません。 どうすれば解決できますか?
@ steric85はbrowserify、babel、webpackのどれを使っていますか? コードをトランスパイルする必要があるかもしれません
@Alxmerino私はwebpackを使用しています。
コードをコンパイルしていることを確認してください
@ steric85 、私はtypescriptでwindow.require is not a function
に直面しました、私はそれをこのように修正することができました:
declare global {
interface Window {
require: any;
}
}
const electron = window.require('electron');
Angularアプリで電子からipcRendererにアクセスするために上記の方法を使用していますが、ipcRendererメッセージハンドラーを使用してObservableを更新すると、Angularの変更検出が機能しません。
AngularはipcRendererがEventEmitterであることを認識しておらず、ipcRendererイベントが発生したときに変更検出を実行する必要があるためですか?
Angular 2では、 applicationRef.tick()
を呼び出して、Angularに状態を更新するように明示的に指示していました。 https://angular.io/api/core/ApplicationRef
@nukeopや@srinathhと非常によく似た問題に直面しています。この記事ガイドに従って、Electron + React + Webpackプロジェクトを設定しました。最後に、著者がwindow.require
でトリックについて言及しています。 私のプロジェクトではrequire('electron')
2か所しかありません。 Electronのエントリポイント、および一部のReactコンポーネントに必要なJavaScriptコントローラークラス。 Electronエントリポイントファイルでは、メインプロセスで実行する必要があるため、 const electron = require('electron');
を実行します(右?)。コントローラークラスでは、 const Electron = window.require('electron').remote;
の後にconst Jsonfile = Electron.require('jsonfile');
を実行します。 しかし、node_modules / electronic / index.jsの6行目で@nukeop ( "TypeError:fs.ExistsSync is not a function")と同じエラーが発生します。これは次のようになります。
var fs = require('fs')
var path = require('path')
var pathFile = path.join(__dirname, 'path.txt')
if (fs.existsSync(pathFile)) {
module.exports = path.join(__dirname, fs.readFileSync(pathFile, 'utf-8'))
} else {
throw new Error('Electron failed to install correctly, please delete node_modules/electron and try installing again')
}
node_modules / electronを削除して再インストールしてみました。
私はmacOS10.12.6でElectron1.7.5を使用しており、記事のセットアップとしてnpm run dev
を使用してプロジェクトを開始します。
アップデート; エラーの原因となったrequire
を見つけたので、React index.jsでrequire('electron-react-devtools')
を実行してみました。 const ReactDevtools = Electron.require('electron-react-devtools');
に変更するとエラーが停止しましたが、ReactDevtoolsインスタンスで.inject()
を呼び出せないようです(「関数ではありません」)が、ここで説明することはできないかもしれません。 。
@ steric85これは、ウェブページ環境でアプリを実行しているためです=> Electron環境(Nodejs環境)でアプリを実行する必要があります
まだwindow.require is not a function
を受け取っています。 Electron with React Starter Kit(https://github.com/kriasoft/react-starter-kit)を使用しています。 これを除いて、すべてがうまく機能しています。
ElectronアプリをWebからアプリをロードするように設定したため、アプリはローカルで実行されていません。
https://gist.github.com/holgersindbaek/68f6db82f507967a51ca75c527faeff6
私がやろうとしているのは、私のReactファイルの1つでipcRenderer
を呼び出すことです。 ただし、アプリがWebから読み込まれている場合でも、それが可能かどうかはわかりません。 助言がありますか?
@holgersindbaek Chrome、Firefoxなどのブラウザでアプリを表示しないでください。Webページ環境であるため、機能しません。
Electronウィンドウでアプリを表示する必要があります。
私はそうですが、ある意味でElectronを使用しており、起動するたびにWebサイトからアプリをロードしています。 基本的に、私は自分のエレクトロンアプリでウェブサイトを表示しています。 上記のファイルを参照してください。 本当に自分にできることは何もないことを確認したいだけですか?!
Electronは任意のURLをロードできます。 URLをロードするには、この関数mainWindow.loadURL(url)を使用する必要があります
=>電子ウィンドウビューでは、そのURL javascriptコードはrequire、ipcなどにアクセスできます。
Ok。 やってみます。
電子のwindow.require
は機能しませんでしたが、 fs
のwindow.require
$#$は機能しました。
理由はよくわかりません。 しかし、それは機能しており、それは小さな個人的なプロジェクトなので、私はこの問題を推し進めるつもりはありません。
ありがとう@nukeop
こんにちは、これは私のpackage.jsonです、私はwebpackを使用しています、これらのどれも私の問題を解決しませんでした、誰かが解決策を持っていますか? window.requireを使用した後、「ウィンドウが定義されていません」というエラーが発生しました
'厳密に使用';
var electronic = require( 'electron')
var app = electronic.app;
var BrowserWindow = electronic.BrowserWindow;
var mainWindow = null;
app.on( 'ready'、function(){
mainWindow = new BrowserWindow({幅:800、高さ:600});
mainWindow.loadURL('file://' + __dirname + '/index.electron.html');
mainWindow.webContents.openDevTools();
});
私はtypescriptを使用していて、使用しなければなりませんでした
const electron = (<any>window).require("electron");
レンダラーがメインと通信できるようにします。 これが誰かを助けることを願っています。
これは私のために働いた。
たとえば、リモートが必要な場合は、
const windowを宣言します:any;
const {remote} = window.require( 'electron');
こんにちは、ありがとうございます。
2017年12月3日午後9時29分、マイケル-
[email protected]>は次のように書いています:
これは私のために働いた。
たとえば、リモートが必要な場合は、const windowを宣言します:any;
const {remote} = window.require( 'electron');—
コメントしたのでこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/electron/electron/issues/7300#issuecomment-348801405 、
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/ARDyd4c3aOkMbb058xklujMMbnmaoxKGks5s8uGVgaJpZM4KDU6t
。
@solominhここで説明してくれてありがとう。 しかし、私は@holgersindbaekと同様の構成を持っていますが、どの環境がWebビューのプリロードスクリプトですか?
情報:
mainWindow.loadURL(url)
を実行します。ここで、urlはローカルindex.htmlです。<webview>
がありますpreload
フィールドがあり、このスクリプトはwindow.require( 'electron')を実行します。備考:
const electron = require('electron')
を使用すると、エラーfs.readFileSync is not a function
が発生しますconst electron = window.require('electron')
を使用すると、エラーwindow.require is not a function
が発生します。編集: <webview nodeintegration="true">
とwindow.requireを使用して解決しました。 今後の参考のためにここにメモを残します。
window.requireは私のために働いた! みんなありがとう!
これを試したときのブラウザのエラーメッセージ
window.require()..
も無効にするnodeIntegration: false
を元に戻すのを忘れました。 愚かな間違い。 これが誰かに1時間の研究を惜しまないことを願っています。
@ phil294ありがとうございます! あなたは本当に1時間の研究を節約しました。
こんにちは@micsel 、
私はdeclareconst window:any;を含めました。
しかし、構文エラーをスローしています。
なぜ何かアイデアはありますか?
ええ、宣言constウィンドウを置きます:任意; 上部、輸入品がある場所の直後。
window.requireが関数ではなく、Angular-CLIを使用している場合は、以下を使用してWindowインターフェイスをインスタンス化します。
./src/typings.d.ts
declare var window: Window;
interface Window {
require: any;
}
次に、これを使用して電子を含めることができます。
const { ipcRenderer } = window.require('electron');
電子アプリでAngular2 +を使用している場合は、 「ngx-electron」 libをインポートして、any.componets.tsで使用します。
import { ElectronService } from 'ngx-electron';
//constructor
constructor(
private elt: ElectronService
){
var fs = this.elt.remote.require('fs');
}
私は電子でreactjsを使用していますが、この行をターミナルヤーンの実行開始に実行すると、エラーが発生しますUncaught Type Error:window.requireは関数ではありませんtypescriptを使用していませんReactJsでウィンドウを宣言する方法
まだ問題に直面している人々は、どういうわけかwindow.require()
を実行すると、コードベース全体でimport
ステートメントを使用する一貫性が損なわれます。 簡単な代替手段は、Webpack target
をelectron-renderer
に設定することです。 Create React Appを使用している場合、イジェクトが混乱する可能性があります。 したがって、このパッケージを使用してWebpackをフックすることができ、たとえば、Reactコンポーネント(または他のノードモジュール)でimport fs from 'fs'
を使用して、人生で楽しく使用できます:)
Vue CLI 3を使用するウィンドウでは、window.requireは機能しますが、「node_modules /」からの相対パスではなくフルパスが必要になります。
ただし、Reactの場合と同様に、vue.config.jsを編集することで、Vue用にwebpackを適切に構成できます。 「require」は期待どおりに機能します。
vue.config.js:
module.exports = {
configureWebpack: config => {
if (process.env.NODE_ENV === 'production') {
config.output.publicPath = `${process.cwd()}/dist/`
}
config.target = 'electron-renderer'
}
}
router.js(これは単なる例であり、他のvue jsファイルでも機能します)
const Store = require("electron-store");
const store = new Store();
_これを追加することはほとんどありませんが、デバッグにかかる時間を1〜2時間節約できたはずです。_
この問題を修正するには、 rm -rf node_modules && npm install
する必要がありました。 その後、 window.require
window
を削除することができ、作業が再開されました。 うまくいけば、それは他の誰かを助けるでしょう。
@cperthuisありがとうございました!! ははは、私はVueを使用していませんが、論理的思考により、webpack.config.jsを変更してターゲットプロパティを設定できることがわかりました:)
チャームのように働いた。
こんにちは、
window.require
は、開発ローカルサーバー環境では機能しますが、縮小されたHTMLファイルにReactアプリをビルドした後は、本番環境では機能しません。
function createWindow() {
win = new BrowserWindow({
width: 1280,
height: 720,
icon: path.join(__dirname, 'assets/icons/png/64x64.png'),
webPreferences: {
nodeIntegration: true,
preload: __dirname + '/preload.js'
}
})
win.setPosition(0, 0)
win.loadURL(isDev ? 'http://localhost:3000' : `file://${path.join(__dirname, 'build/index.html')}`)
}
localhost:3000
で動作しますが、 file://${path.join(__dirname, 'build/index.html')}
では動作しません
@cperthuis 、修正は「react-app-rewired」を使用して排出されないCRAアプリに対して機能しました。 ありがとうございます。
Create-React-App 2では、 craco
npmモジュールを使用できます。
https://www.npmjs.com/package/@craco/craco
package.jsonのreact-scripts
をcraco
で変更します
craco.config.js
module.exports = {
webpack: {
configure: {
target: 'electron-renderer'
}
}
};
そして、あなたはそのようなあなたのElectronコンテキストにアクセスすることができます:
import Electron from 'electron';
const { dialog } = Electron.remote;
@ Maxou44クラコとエレクトロンについてのヒントをありがとう。 それは私が必要としていたものです。 誰かが例を探している場合に備えて...
@wwlib問題ありません、それがあなたを助けてくれてうれしいです🥳
window.require()..
も無効にするnodeIntegration: false
を元に戻すのを忘れました。 愚かな間違い。 これが誰かに1時間の研究を惜しまないことを願っています。
どうもありがとう。
リモートコンテンツをロードする場合は、 nodeIntegration
をfalseに設定することが重要であることに注意してください: https ://electronjs.org/docs/tutorial/security#2 -disable-nodejs-integration-for-remote -コンテンツ
こんにちは、
同じエラーが発生しています。 window.requireを使用すると、 Uncaught TypeError: fs.readFileSync is not a function
エラーが修正されましたが、別のエラーUncaught TypeError: window.require is not a function
が発生しました。
これを修正する方法について何か提案はありますか? ノードjsでbrowserifyを使用しています。
まだこれに固執している人のために: BrowserWindow
を宣言するときにnodeIntergation
をtrue
$として明示的に宣言しない限り、エラーwindow.require is not a function
が発生します:
new BrowserWindow({
webPreferences: {
nodeIntegration: true,
}
});
私が見つけた唯一の十分な解決策は次のとおりです。
react-app-rewired
パッケージeject
せずにカスタムWebpack構成を挿入します。 "scripts": {
...
"start": "react-app-rewired start",
},
config-overrides.js
を追加します。module.exports = function override (config, env) {
config.target = 'electron-renderer'
return config;
}
おかげで: @ Lilangaコメント、 @ agrublevコメント、 react-app-rewiredの作成者。
更新しました:
実際には、同じ方法の2番目のバージョン: https ://www.codementor.io/randyfindley/how-to-build-an-electron-app-using-create-react-app-and-electron-builder-ss1k0sfer
更新2:
@nukeop Browserifyを使用しない理由や使用する理由についての議論をフォローする時間がないため、誤解を招く記述をいくつか削除しました。意味する詳細な説明を書き留めることができません。 しかし、「 window.require
を使用するだけで問題が解決する」という個人的な意見は、非常に信頼できないように思われます。
どのように間違っていますか?
これはReactアプリであり、Electron環境内で実行する必要があり、その逆はできません。
何?
_これを追加することはほとんどありませんが、デバッグにかかる時間を1〜2時間節約できたはずです。_
この問題を修正するには、
rm -rf node_modules && npm install
する必要がありました。 その後、window.require
window
を削除することができ、作業が再開されました。 うまくいけば、それは他の誰かを助けるでしょう。
うわー..このスレッドですべてを試しましたが、賛成票がなかったため、リプレイを逃しました..それでもwindow is not a function
を取得しました..
node_modules
を削除して再インストールし、その動作を確認しました。
PS:まだすべての解決策を実行する必要がありますが、すべてを実行した場合
それでも同じ再インストールnode_modules
あなたは私の日を救った@joshuapinter !
react-create-appを使用して、同じエラーを見つけました。
これまでの解決策は次のとおりです。
電子部分の$ const electron = window.require("electron")
BrowserWindow
$は、次の方法でnodeIntegration:true
$を追加します。
mainWindow = new BrowserWindow({ width: 900, height: 680, webPreferences: { webSecurity: false, nodeIntegration: true } });
私が見つけた唯一の十分な解決策は次のとおりです。
- 開発依存関係としてインストール
react-app-rewired
パッケージ- このモジュールを使用して、CRAを
eject
せずにカスタムWebpack構成を挿入します。"scripts": { ... "start": "react-app-rewired start", },
- そして、それに応じた内容でファイル
config-overrides.js
を追加します。module.exports = function override (config, env) { config.target = 'electron-renderer' return config; }
おかげで: @ Lilangaコメント、 @ agrublevコメント、 react-app-rewiredの作成者。
更新しました:
実際には、同じ方法の2番目のバージョン: https ://www.codementor.io/randyfindley/how-to-build-an-electron-app-using-create-react-app-and-electron-builder-ss1k0sfer更新2:
@nukeop Browserifyを使用しない理由や使用する理由についての議論をフォローする時間がないため、誤解を招く記述をいくつか削除しました。意味する詳細な説明を書き留めることができません。 しかし、「window.require
を使用するだけで問題が解決する」という個人的な意見は、非常に信頼できないように思われます。
これは私のために働いた。 ありがとう
window.require
の問題は、トップレベルのパッケージでのみ機能することです。
たとえば、 fs
を直接使用している場合は、機能します。 しかし、 fs
に依存しているパッケージを使用している場合でも、例外が発生します。
window.require
Reactアプリ内で関数を呼び出すと、機能しません。 「TypeError:window.requireは関数ではありません」というメッセージが表示されました。
App.js
:
`` `javascript
import React、{useEffect、useState} from'react ';
import './ App.css';
const ipcRenderer = window.require( 'electron')。ipcRenderer;
関数App(){
useEffect( () => {
ipcRenderer.on('ping', (event, message) => { console.log(message) });
}, []);
return (
<div className = 'App'>
<div className = 'Header-Arrow'></div>
<div className = 'Box'>
<p>Press ⌘ + ⇧ + 4</p>
</div>
</div>
);
}
デフォルトのアプリをエクスポートします。
`` ``
Main.js
のメインウィンドウ変数:
`` `javascript
//ブラウザウィンドウを作成します。
mainWindow = new BrowserWindow({
alwaysOnTop:true、
フレーム:false、
フルスクリーン可能:false、
透明:真、
titleBarStyle: 'customButtonsOnHover'、
表示:false、
幅:300、
高さ:350、
webPreferences:{
nodeIntegration:true、
プリロード:__ dirname + '/ preload.js'
}
});
`` `
**
Preload.js` **:
javascript
window.ipcRenderer = require('electron').ipcRenderer;
私が欠けているものは何ですか?
だから、問題は解決しました。 多分誰かがそれから利益を得ることができるので私は自分自身に答えます(私は何時間も立ち往生しました)。 Preload.js
ファイルがある場合は、 Àpp.js
(レンダラー)からwindow.require('electron').ipcRenderer
を再度呼び出す必要はありません。 次のように、変数をwindow.ipcRenderer
として直接呼び出します。
App.js
:
`` `` javascript
import React、{useEffect、useState} from'react ';
import './ App.css';
関数App(){
useEffect( () => {
window.ipcRenderer.on('ping', (event, message) => { console.log(message) });
}, []);
return (
<div className = 'App'>
<div className = 'Header-Arrow'></div>
<div className = 'Box'>
<p>Press ⌘ + ⇧ + 4</p>
</div>
</div>
);
}
デフォルトのアプリをエクスポートします。
`` ``
Main.js
のメインウィンドウ変数:
javascript
// Create the browser window.
mainWindow = new BrowserWindow({
alwaysOnTop: true,
frame: false,
fullscreenable: false,
transparent: true,
titleBarStyle: 'customButtonsOnHover',
show: false,
width: 300,
height: 350,
webPreferences: {
nodeIntegration: true,
preload: __dirname + '/preload.js'
}
});
Preload.js
:
javascript
window.ipcRenderer = require('electron').ipcRenderer;
コマンドラインからアプリを実行した後、Reactプロセスによって生成されたウィンドウはエラーをスローします(ipcRendererは未定義です)。 それを無視します。 Electronプロセス(メインアプリ)によって生成されたウィンドウは正常に機能します。
Create-React-App 2では、
craco
npmモジュールを使用できます。https://www.npmjs.com/package/@craco/craco
package.jsonの
react-scripts
をcraco
で変更しますcraco.config.js
module.exports = { webpack: { configure: { target: 'electron-renderer' } } };
require("fs")
とwindow.require("fs")
の間に問題が発生しました。 このディスカッションでCRACOを紹介してくれた@ Maxou44に感謝します。
この問題を解決するために、プロジェクトに3つの変更を加えました。
new BrowserWindow({ width: 1200, height: 800 })
new BrowserWindow({ width: 1200, height: 800, webPreferences: { nodeIntegration: true } })
const fs = require("fs")
をconst fs = require("electron").remote.require("fs")
に置き換えました詳細については、 @ wwlibによるこのgitリポジトリを参照してくださいhttps://github.com/wwlib/cra-craco-electron-example
スレッド全体を上から下まで読みましたが、何も機能しませんでした。
上記の@Saroopashreeのメソッドを除いて。 ソリューションを共有してくれた@Saroopashreeに感謝します。
スレッドの開始以降、reactとwebpackが多少変更されたため、上記のソリューションは廃止されたと思います。 もちろん間違っているかもしれませんが、上記の方法を使用するとうまくいきました。
これは私がしたことです:
npm install craco -D
module.exports = {
webpack: {
configure: {
target: 'electron-renderer'
}
}
};
new BrowserWindow({ width: 1200, height: 800, webPreferences: { nodeIntegration: true } })
を更新しました。 もちろん、幅と高さが異なります。npm start
を実行して、create-react-appを使用して作成されたreactアプリの開発サーバーを起動します。 これにより、同じエラーでタブが開きました。 そしてまた疲れました。npm run electron
を実行して、electronアプリを実行しました。だから@Saroopashreeありがとう。
「electron」またはreactコンポーネント/クラス内の他のコンポーネントにアクセスしようとしている場合は、これを試してください: #336757899
私のために働く解決策へのリンクを投稿してくれた@tumbledwyerに感謝します:
更新しました:
実際には、同じ方法の2番目のバージョン: https ://www.codementor.io/randyfindley/how-to-build-an-electron-app-using-create-react-app-and-electron-builder-ss1k0sfer
Randy Findleyのソリューション:
さて、私が行ったようにfs
モジュールにアクセスする必要がある場合は、すぐにModule not found
エラーが発生します。
まず、 Rescriptsをインストールします。
yarn add @rescripts/cli @rescripts/rescript-env --dev
次に、package.jsonのscriptsタグをこれから変更します...
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
これに
"start": "rescripts start",
"build": "rescripts build",
"test": "rescripts test",
次に、次の内容の.rescriptsrc.js
という名前の新しいファイルを追加します。
module.exports = [require.resolve('./.webpack.config.js')]
最後に、次の内容の.webpack.config.js
という別の新しいファイルを追加します。
// define child rescript
module.exports = config => {
config.target = 'electron-renderer';
return config;
}
これで、 fs
モジュールを使用できます。心配する必要はありません。
@ledledsが指摘したことは、typscriptとElectronでCRAを使用して、私のために機能しました。 次に、次のようにwebPreferencesを宣言しました。
webPreferences: {
preload: path.join(__dirname, 'preload.js')
},
nodeIntegrationをfalseに上書き/設定しているように見えるので、trueに設定してアプリを再起動すると、問題が解決しました(その構成でElectronウィンドウをロードするには、アプリを再起動する必要があります)
このようにnodeIntegrationをtrueに設定します
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
nodeIntegration: true
},
まだこれに固執している人のために:
BrowserWindow
を宣言するときにnodeIntergation
をtrue
$として明示的に宣言しない限り、エラーwindow.require is not a function
が発生します:new BrowserWindow({ webPreferences: { nodeIntegration: true, } });
react-app-rewired
これは、スケーラビリティの観点から私が見つけた唯一の優れたソリューションでした。誰もwindow.requireに頼るべきではないと思います。
window.requireがスケーラブルでないのはなぜですか?
この問題または同様の問題に苦労していて、Vueおよびvue-electron-builderを使用している人は、こちらを参照してください。
特に反応ボタンを介して電子アプリケーションを終了することに関してこれにまだ苦労している人は、読んでください。
私にとって助けになったのは次のとおりです。
ウィンドウを宣言するときは、セキュリティ上の理由から、現在デフォルトでfalse
になっているため、必ずnodeIntegration: true
を設定してください。 通常、これはelectron.js
ファイルで行われます。
@packetstracerがすでに述べたように、_そのconfigでElectronウィンドウをロードするには、アプリを再起動する必要があります_
mainWindow = new BrowserWindow({
//...
webPreferences: {
nodeIntegration: true,
},
});
electron.js
の上部に次のステートメントを配置すると、 ipcMain
がイベント_ "close-me" _を確実にリッスンします。const { ipcMain } = require("electron");
ipcMain.on("close-me", (evt, arg) => {
app.quit();
});
window.require
ステートメントを追加します。 通常のrequire
は機能しませんでした:const ipcRenderer = window.require("electron").ipcRenderer;
<Button label="close" onClick={(e) => ipcRenderer.send("close-me")} />
遠慮なくコメントしてフィードバックを送ってください。私はまだ電子に不慣れです。
終了ボタンのコンテキストが無関係であることは知っていますが、より適切なスレッドを見つけることができませんでした。 別のより適切なスレッドがある場合は、遠慮なく教えてください。
私の構成:
"electron": "9.2.0",
"electron-builder": "22.8.0",
"electron-packager": "15.0.0",
私のために解決しました! ありがとう@nukeop
`
`
typescriptで適切なタイプを設定する方法を知っている人はいますか?
私は現在次のものを持っています
export const electron = window.require('electron').remote
何か欲しいのですが
export const electron = window.require('electron').remote as ElectronType
そのため、IDEはelectronAPIをオートコンプリートする方法を知っています。
@timsamartそれは動作します。 ありがとう、それは私に仕事の日を節約します。 🤣
上記のすべてを文字通り試して何時間も費やした後、$#$ 1 $ BrowserView
を使用する場合の部分を見逃しました。これは、node.jsを明示的に有効にする必要があるBrowserWindow
と同じです。
new BrowserView({ // is a BrowserView not a BrowserWindow
webPreferences: {
nodeIntegration: true,
},
})
最も参考になるコメント
将来この問題に遭遇し、このスレッドを読む人にとって、requireの代わりに
window.require
を使用することは、electronとbrowserifyのrequire
関数間の競合を回避する1つの可能性です。