web-dev-qa-db-ja.com

electron 5.0.0 "Uncaught ReferenceError:require is not defined"

最初はElectron Stable(4.x.x)を使用しており、ブラウザとレンダラープロセスの両方でrequireを使用できました。新しいバージョンのノードが必要で、レンダラープロセスでこのエラーメッセージ_Uncaught ReferenceError: require is not defined_が発生したため、electronベータ(5.0.0)にアップグレードしました。

Electronドキュメントをグーグルで調べてみると、BrowserWindowを初期化するときに_webPreferences.nodeIntegration_をfalseに設定するとエラーが発生する可能性があるというコメントが見つかりました。例:new BrowserWindow({width, height, webPreferences: {nodeIntegration: false}});。しかし、私はこれをしていなかったので、何か他のことが問題であるに違いないと考え、解決策を探し続けました。

37
junvar

実は、nodeIntegrationは以前のelectronバージョンではデフォルトでtrueでしたが、5.0.0ではデフォルトでfalseでした。したがって、これをtrueに設定すると、問題が解決しました。コメントや電子ページにオンラインで文書化されたこの変更を見つけられなかったので、この問題に遭遇した将来の人々が見つけやすくするために、この自己回答型のSO投稿を作成すると思います。

47
junvar

junvar と同じように、nodeIntegrationは5.0.0ではデフォルトでfalseになりました。

electronjs FAQ には、この値を設定する方法に関するサンプルコードがあります。

let win = new BrowserWindow({
  webPreferences: {
    nodeIntegration: false
  }
})
win.show()
39
Stev

新しいブラウザウィンドウを作成するときにnodeIntegrationをtrueに設定します。

app.on('ready', () => {
    mainWindow = new BrowserWindow({
        webPreferences: {
            nodeIntegration: true
        }
    });
});
15
Sri Darshana

junvar は正しいです。v5.0.0では、nodeIntegrationはデフォルトでfalseです。

これは v5.0.0のリリースノートOther Changesセクションの最後のステートメントであり、 this PR でも言及されています

6
dspring

この投稿の読者は リモートコンテンツのNode.js統合を有効にしないでください セクションの セキュリティ、ネイティブ機能、および責任ガイド 決定する前に。

// Bad
const mainWindow = new BrowserWindow({
  webPreferences: {
    nodeIntegration: true,
    nodeIntegrationInWorker: true
  }
})
mainWindow.loadURL('https://example.com')

// Good
const mainWindow = new BrowserWindow({
  webPreferences: {
    preload: path.join(app.getAppPath(), 'preload.js')
  }
})
mainWindow.loadURL('https://example.com')
4
ShapCyber