私は自分の目的のためにElectronアプリを作成しています。私の問題は、HTMLページ内でノード関数を使用すると、次のエラーがスローされることです。
'require()'は定義されていません。
すべてのHTMLページでNode機能を使用する方法はありますか?可能であれば、これを行う方法の例またはリンクを提供してください。 HTMLページで使用しようとしている変数は次のとおりです。
var app = require('electron').remote;
var dialog = app.dialog;
var fs = require('fs');
これらは、Electron内のすべてのHTMLウィンドウで使用している値です。
バージョン5では、nodeIntegration
のデフォルトがtrueからfalseに変更されました。ブラウザウィンドウの作成時に有効にできます。
app.on('ready', () => {
mainWindow = new BrowserWindow({
webPreferences: {
nodeIntegration: true
}
});
});
セキュリティ上の理由から、nodeIntegration:falseを保持し、プリロードスクリプトを使用して、Node/Electron APIからレンダラープロセスに必要なものだけを公開する必要があります(表示)ウィンドウ変数経由。
プリロードスクリプトは引き続きrequireおよびその他のNode.js機能にアクセスできます
https://electronjs.org/docs/tutorial/security#2-do-not-enable-nodejs-integration-for-remote-content
例:
//main.js
const mainWindow = new BrowserWindow({
webPreferences: {
preload: path.join(app.getAppPath(), 'preload.js')
}
})
preload.js:
const { remote } = require('electron');
let currWindow = remote.BrowserWindow.getFocusedWindow();
window.closeCurrentWindow = function(){
currWindow.close();
}
renderer.js:
let closebtn = document.getElementById('closebtn');
closebtn.addEventListener('click', (e) => {
e.preventDefault();
window.closeCurrentWindow();
});
BrowserWindowの初期化中にnodeIntegration: false
を使用していますか?その場合は、true
に設定します(デフォルト値はtrue
です)。
そして、外部スクリプトを次のようにHTMLに含めます(<script> src="./index.js" </script>
としてではありません):
<script>
require('./index.js')
</script>
最後に、このコードをHTMLドキュメントのScript Elementに追加しました。
遅いReply.Iで申し訳ありませんが、私はこのことを行うために以下のコードを使用します。
window.nodeRequire = require;
delete window.require;
delete window.exports;
delete window.module;
nodeRequire
を使用する代わりにrequire
を使用します。
それはうまく動作します。