Ich erstelle eine Electron-App für meinen eigenen Zweck. Mein Problem ist, wenn ich Knotenfunktionen in meiner HTML-Seite verwende, wird der folgende Fehler ausgegeben:
'require ()' ist nicht definiert.
Gibt es eine Möglichkeit, Knotenfunktionen in allen meinen HTML-Seiten zu verwenden? Wenn es möglich ist, geben Sie mir bitte ein Beispiel dafür oder geben Sie einen Link an. Hier sind die Variablen, die ich in meiner HTML-Seite verwenden möchte:
var app = require('electron').remote;
var dialog = app.dialog;
var fs = require('fs');
und dies sind die Werte, die ich in allen meinen HTML-Fenstern in Electron verwende.
javascript
html
node.js
electron
Mari Selvan
quelle
quelle
Antworten:
Ab Version 5 wurde die Standardeinstellung für
nodeIntegration
von true in false geändert. Sie können es beim Erstellen des Browserfensters aktivieren:quelle
nodeIntegration: true
stellt nur dann ein Sicherheitsrisiko dar, wenn Sie nicht vertrauenswürdigen Remotecode in Ihrer Anwendung ausführen. Angenommen, Ihre Anwendung öffnet eine Webseite eines Drittanbieters. Dies wäre ein Sicherheitsrisiko, da die Webseite eines Drittanbieters Zugriff auf die Knotenlaufzeit hat und schädlichen Code auf dem Dateisystem Ihres Benutzers ausführen kann. In diesem Fall ist es sinnvoll einzustellennodeIntegration: false
. Wenn Ihre App keine Remote-Inhalte anzeigt oder nur vertrauenswürdige Inhalte anzeigt, ist die EinstellungnodeIntegration: true
in Ordnung.Aus Sicherheitsgründen sollten Sie
nodeIntegration: false
ein Preload-Skript beibehalten und verwenden, um genau das, was Sie von der Node / Electron-API benötigen, über eine Fenstervariable für den Renderer-Prozess (Ansicht) bereitzustellen. Aus den Electron-Dokumenten :Beispiel
main.js
pretoad.js
renderer.js
quelle
<script src="./renderer.js"></script>
Ich hoffe, dass diese Antwort einige Aufmerksamkeit erhält, da eine große Mehrheit der Antworten hier große Sicherheitslücken in Ihrer Elektronen-App hinterlässt . Tatsächlich ist diese Antwort im Wesentlichen das, was Sie tun sollten, um sie
require()
in Ihren Elektronen-Apps zu verwenden. (Es gibt nur eine neue Elektronen-API, die es in Version 7 ein bisschen sauberer macht).Ich habe eine ausführliche Erklärung / Lösung in Github unter Verwendung der aktuellsten Elektronen-Apis geschrieben, wie Sie
require()
etwas können, aber ich werde hier kurz erklären, warum Sie einen Ansatz mit einem Preload-Skript, contextBridge und ipc verfolgen sollten.Das Problem
Elektronen-Apps sind großartig, weil wir Node verwenden können, aber diese Kraft ist ein zweischneidiges Schwert. Wenn wir nicht aufpassen, geben wir jemandem über unsere App Zugriff auf den Knoten, und mit dem Knoten kann ein schlechter Akteur Ihren Computer beschädigen oder Ihre Betriebssystemdateien löschen (unter anderem, wie ich mir vorstellen kann).
Wie sieht das Problem aus?
Dieses Problem tritt auf, wenn Sie (eines der folgenden):
nodeIntegration:true
aktiviertremote
ModulAll diese Probleme ermöglichen einen ununterbrochenen Zugriff auf den Knoten von Ihrem Renderer-Prozess. Wenn Ihr Renderer-Prozess jemals entführt wird, können Sie davon ausgehen, dass alles verloren ist.
Was ist unsere Lösung?
Die Lösung besteht darin, dem Renderer keinen direkten Zugriff auf den Knoten (dh
require()
) zu gewähren, sondern unserem Elektronenhauptprozess Zugriff auf eine Anforderung an den Hauptprozess zu gewährenrequire
, und wann immer unser Rendererprozess diese verwenden mussrequire
.Dies funktioniert in den neuesten Versionen (7+) von Electron auf der Rendererseite, auf der wir ipcRenderer- Bindungen einrichten , und auf der Hauptseite richten wir ipcMain- Bindungen ein. In den ipcMain-Bindungen richten wir Listener-Methoden ein, die von uns verwendete Module verwenden
require()
. Das ist in Ordnung und gut, weil unser Hauptprozessrequire
alles kann, was er will.Wir verwenden die contextBridge , um die ipcRenderer-Bindungen an unseren App-Code zu übergeben (zu verwenden). Wenn unsere App also die
require
d-Module in main verwenden muss, sendet sie eine Nachricht über IPC (Inter-Process-Communication) und der Hauptprozess wird ausgeführt etwas Code, und wir senden dann eine Nachricht mit unserem Ergebnis zurück.Hier ist ungefähr das , was Sie tun möchten.
main.js
pretoad.js
index.html
Haftungsausschluss
Ich bin der Autor
secure-electron-template
einer sicheren Vorlage zum Erstellen von Elektronen-Apps. Ich interessiere mich für dieses Thema und arbeite seit einigen Wochen (zu diesem Zeitpunkt) daran.quelle
nodeIntegration
dass das Deaktivieren verhindert, dass der Benutzer sich versehentlich oder absichtlich selbst Schaden zufügt, während er die App verwendet. Dies ist ein zusätzlicher Schutz für den Fall, dass Malware an Ihren Elektronenprozess angehängt wurde und XSS ausführen konnte, wenn er wusste, dass dieser Vektor offen war (unglaublich selten, aber dort ist mein Gehirn hingegangen)!Verwenden Sie
nodeIntegration: false
während der BrowserWindow-Initialisierung? Wenn ja, setzen Sie es auftrue
(Standardwert isttrue
).Und fügen Sie Ihre externen Skripte wie folgt in den HTML-Code ein (nicht als
<script> src="./index.js" </script>
):quelle
var pdfjsLib = require('pdfjs-dist')
und auf diese Weise verwenden.require
anstelle von<script src="..."></script>
? Dies hat auch eine offene Frage hier .Zunächst einmal hinterlässt die @ Sathiraumesh-Lösung ein großes Sicherheitsproblem für Ihre Elektronenanwendung. Stellen Sie sich vor, Ihre App fügt einige zusätzliche Funktionen hinzu
messenger.com
, z. B. ändert sich das Symbol in der Symbolleiste oder blinkt, wenn Sie eine ungelesene Nachricht haben. In Ihrermain.js
Datei erstellen Sie also wie folgt ein neues BrowserWindow (beachten Sie, dass ich messenger.com absichtlich falsch geschrieben habe):Was ist, wenn
messengre.com
es sich um eine bösartige Website handelt, die Ihrem Computer Schaden zufügen möchte ? Wenn Sie festlegen, dassnodeIntegration: true
diese Site Zugriff auf Ihr lokales Dateisystem hat und Folgendes ausführen kann:Und Ihr Home-Verzeichnis ist weg.
Lösung
Legen Sie statt allem nur das offen, was Sie benötigen. Dies wird erreicht, indem Javascript-Code mit
require
Anweisungen vorgeladen wird .Jetzt
messengre.com
kann schrecklich nicht Ihr gesamtes Dateisystem löschen.quelle
Schließlich habe ich es zum Laufen gebracht. Fügen Sie diesen Code Ihrem HTML-Dokument-Skriptelement hinzu.
Entschuldigung für die späte Antwort. Ich benutze den folgenden Code, um diese Sache zu tun.
Und verwenden
nodeRequire
statt verwendenrequire
.Es funktioniert gut.
quelle
Sie müssen die nodeIntegration in webPreferences aktivieren , um sie verwenden zu können. siehe unten,
Es gab eine brechende API-Änderung in Elektron 5.0 ( Ankündigung im Repository ). In neueren Versionen ist nodeIntegration standardmäßig auf false gesetzt .
Wenn Sie jedoch die Fähigkeit zur Verwendung von Node.js- und Electron-APIs beibehalten möchten, müssen Sie die Symbole auf der Seite umbenennen, bevor Sie andere Bibliotheken einschließen:
quelle