Je crée une application Electron dans mon propre but. Mon problème est que lorsque j'utilise des fonctions de nœud dans ma page HTML, une erreur de:
'require ()' n'est pas défini.
Existe-t-il un moyen d'utiliser les fonctionnalités de Node dans toutes mes pages HTML? Si cela est possible, veuillez me donner un exemple de la façon de procéder ou fournir un lien. Voici les variables que j'essaie d'utiliser dans ma page HTML:
var app = require('electron').remote;
var dialog = app.dialog;
var fs = require('fs');
et ce sont les valeurs que j'utilise dans toutes mes fenêtres HTML dans Electron.
javascript
html
node.js
electron
Mari Selvan
la source
la source
Réponses:
À partir de la version 5, la valeur par défaut de est
nodeIntegration
passée de true à false. Vous pouvez l'activer lors de la création de la fenêtre du navigateur:la source
nodeIntegration: true
est un risque de sécurité uniquement lorsque vous exécutez un code distant non approuvé sur votre application. Par exemple, supposons que votre application ouvre une page Web tierce. Ce serait un risque pour la sécurité car la page Web tierce aura accès au runtime du nœud et peut exécuter du code malveillant sur le système de fichiers de votre utilisateur. Dans ce cas, il est logique de définirnodeIntegration: false
. Si votre application n'affiche aucun contenu distant ou n'affiche que du contenu de confiance, le réglagenodeIntegration: true
est correct.Pour des raisons de sécurité, vous devez conserver
nodeIntegration: false
et utiliser un script de préchargement pour exposer exactement ce dont vous avez besoin de l'API Node / Electron au processus de rendu (vue) via la variable window. Extrait de la documentation Electron :Exemple
main.js
preload.js
renderer.js
la source
<script src="./renderer.js"></script>
J'espère que cette réponse retiendra l'attention, car une grande majorité des réponses ici laissent de grandes failles de sécurité dans votre application électronique. En fait, cette réponse est essentiellement ce que vous devriez faire pour l'utiliser
require()
dans vos applications électroniques. (Il y a juste une nouvelle API électronique qui le rend un peu plus propre dans la v7).J'ai écrit une explication / solution détaillée dans github en utilisant les API électroniques les plus récentes sur la façon dont vous pouvez
require()
quelque chose, mais je vais expliquer brièvement ici pourquoi vous devriez suivre une approche utilisant un script de préchargement, contextBridge et ipc.Le problème
Les applications Electron sont excellentes parce que nous utilisons le nœud, mais ce pouvoir est une épée à double tranchant. Si nous ne faisons pas attention, nous donnons à quelqu'un l'accès au node via notre application, et avec node un mauvais acteur peut corrompre votre machine ou supprimer les fichiers de votre système d'exploitation (entre autres, j'imagine).
À quoi ressemble le problème
Ce problème se manifeste lorsque vous (l'un des éléments ci-dessous):
nodeIntegration:true
activéremote
moduleTous ces problèmes donnent un accès ininterrompu au nœud à partir de votre processus de rendu. Si votre processus de rendu est piraté, vous pouvez considérer que tout est perdu.
Quelle est notre solution
La solution est de ne pas donner au moteur de rendu un accès direct au nœud (c'est-à-dire
require()
), mais de donner à notre processus électronique l'accès au processus principalrequire
, et à chaque fois que notre processus de rendu doit utiliserrequire
, rassembler une requête vers le processus principal.La façon dont cela fonctionne dans les dernières versions (7+) d'Electron est du côté du rendu, nous configurons les liaisons ipcRenderer , et du côté principal, nous configurons les liaisons ipcMain . Dans les liaisons ipcMain, nous mettons en place des méthodes d'écoute qui utilisent les modules we
require()
. C'est très bien parce que notre processus principal peutrequire
tout ce qu'il veut.Nous utilisons le contextBridge pour transmettre les liaisons ipcRenderer au code de notre application (à utiliser), et donc, lorsque notre application doit utiliser les
require
modules d dans main, elle envoie un message via IPC (communication inter-processus) et le processus principal s'exécute un peu de code, puis nous renvoyons un message avec notre résultat.En gros , voici ce que vous voulez faire.
main.js
preload.js
index.html
Avertissement
Je suis l'auteur d'
secure-electron-template
un modèle sécurisé pour créer des applications électroniques. Je me soucie de ce sujet et j'y travaille depuis quelques semaines (en ce moment).la source
nodeIntegration
empêche l'utilisateur de se blesser accidentellement ou intentionnellement lors de l'utilisation de l'application, et constitue une protection supplémentaire au cas où un logiciel malveillant serait attaché à votre processus électronique et serait en mesure d'exécuter XSS en sachant que ce vecteur était ouvert (incroyablement rare, mais c'est là que mon cerveau est allé)!Utilisez-vous
nodeIntegration: false
pendant l'initialisation de BrowserWindow? Si tel est le cas, définissez-le surtrue
(la valeur par défaut esttrue
).Et incluez vos scripts externes dans le HTML comme ceci (pas comme
<script> src="./index.js" </script>
):la source
var pdfjsLib = require('pdfjs-dist')
et l'utiliser de cette façon.require
place de<script src="..."></script>
? Cela a également une question sans réponse ici .Tout d'abord, la solution @Sathiraumesh laisse votre application électronique avec un énorme problème de sécurité. Imaginez que votre application ajoute des fonctionnalités supplémentaires
messenger.com
, par exemple, l'icône de la barre d'outils change ou clignote lorsque vous avez un message non lu. Donc, dans votremain.js
fichier, vous créez un nouveau BrowserWindow comme ceci (notez que j'ai intentionnellement mal orthographié messenger.com):Et si
messengre.com
c'est un site Web malveillant qui veut nuire à votre ordinateur. Si vous définisseznodeIntegration: true
ce site a accès à votre système de fichiers local et pouvez l'exécuter:Et votre répertoire personnel a disparu.
Solution
N'exposez que ce dont vous avez besoin, au lieu de tout. Ceci est réalisé en préchargeant le code javascript avec des
require
instructions.Maintenant terrible
messengre.com
ne peut pas supprimer tout votre système de fichiers.la source
Enfin, je l'ai fait fonctionner.Ajoutez ce code à votre document HTML Script Element.
Désolé pour la réponse tardive, j'utilise le code ci-dessous pour faire cette chose.
Et utilisez
nodeRequire
au lieu d'utiliserrequire
.Ça fonctionne bien.
la source
Vous devez activer le nodeIntegration dans webPreferences pour l'utiliser. voir ci-dessous,
Il y a eu un changement de rupture de l'API dans electron 5.0 ( Annonce sur le référentiel ). Dans les versions récentes, nodeIntegration est défini par défaut sur false .
Mais si vous souhaitez conserver la possibilité d'utiliser les API Node.js et Electron, vous devez renommer les symboles dans la page avant d'inclure d'autres bibliothèques:
la source