Utiliser correctement preload.js dans Electron : un guide complet
P粉197639753
2023-08-27 20:25:30
<p>J'ai essayé d'utiliser un module de nœud (dans ce cas <code>fs</code>) dans mon processus <code>renderer</code>
<pre class="brush:php;toolbar:false;">// main_window.js
const fs = exiger('fs')
fonction action() {
console.log(fs)
}</pré>
<p><sup>Remarque : lorsque j'appuie sur le bouton dans <code>main_window</code>, la fonction <code>action</code> </sup></p>
<p>Mais cela produit l'erreur : </p>
<pre class="brush:php;toolbar:false;">Uncaught ReferenceError : require n'est pas défini
sur main_window.js:1</pre>
<p>J'ai pu résoudre ce problème, comme le suggère cette réponse acceptée, en ajoutant ces lignes à mon <code>main.js</code> lors de l'initialisation de <code>main_window</code> /p>
<pre class="brush:php;toolbar:false;">// main.js
main_window = nouveau BrowserWindow ({
largeur : 650,
hauteur : 550,
Préférences Web : {
nodeIntegration : vrai
}
})</pré>
Cependant, selon la documentation, ce n'est pas la meilleure pratique, je devrais créer un fichier <code>preload.js</code> et y charger ces modules Node, puis dans tous mes <code>renderer</ code> Utilisez-le dans le processus.Comme ceci :<p><br /></p>
<p><code>main.js</code>:</p>
<pre class="brush:php;toolbar:false;">main_window = new BrowserWindow({
largeur : 650,
hauteur : 550,
Préférences Web : {
préchargement : path.join(app.getAppPath(), 'preload.js')
}
})</pré>
<p><code>preload.js</code>:</p>
<pre class="brush:php;toolbar:false;">const fs = require('fs')
window.test = fonction() {
console.log(fs)
}</pré>
<p><code>main_window.js</code>:</p>
<pre class="brush:php;toolbar:false;">fonction action() {
fenêtre.test()
}</pré>
<p>Et ça marche ! </p>
<heure />
<p>Maintenant, ma question est la suivante : n'est-il pas contre-intuitif que je doive écrire la plupart du code pour le processus <code>renderer</code> n'avez accès qu'au module Node dans <code>preload.js</code>), puis appelez simplement les fonctions dans chaque fichier <code>renderer.js</code> (comme ici, <code>main_window. js</code>) ? Qu'est-ce que je ne comprends pas ici ? </p>
Considérez cet exemple
Tout ce qui figure dans la documentation officielle ne peut pas être implémenté directement n'importe où dans le code. Vous devez avoir une compréhension concise de l’environnement et des processus.
Isolement du contexte et intégration des nœuds
contextIsolation
nodeIntegration
假
假
假
true
true
假
true
true
Comment utiliser correctement le préchargement ?
Vous devez utiliser la communication inter-processus (IPC) d'Electron pour que le processus principal et le processus de rendu communiquent.
BrowserWindow.webContents.send() code>
Méthode pour envoyer des messages au moteur de renduipcMain.handle()
ipcMain.handle() Méthode pour recevoir les messages du moteur de renduExemple de mise en œuvre
Principal
Préchargé
Renderer
Que diriez-vous d'utiliser Promise ?
Gardez votre engagement envers le même processus/environnement autant que possible. Vos promesses sur main devraient rester sur main. Votre engagement envers le renderer doit également rester sur le moteur de rendu. Ne vous engagez pas à passer du programme principal au préchargeur puis au moteur de rendu.
Système de fichiers
La plupart de votre logique métier doit toujours être du côté principal ou du moteur de rendu, mais elle ne doit jamais être en préchargement. En effet, le préchargement existe presque exclusivement en tant que support. La précharge doit être très faible.
Dans le cas d'OP ,
fs
fs doit être implémenté côté maître.Modifié 2022
J'ai publié un article plus volumineux sur l'histoire d'Electron
(Comment la sécurité a changé dans les versions d'Electron) et d'autres considérations de sécurité que les développeurs d'Electron peuvent prendre pour garantir une utilisation correcte du préchargement dans les nouveaux documents d'applications.preload.js
的正确方法是在您的应用可能需要require
Exposez un wrapper de liste blanche autour de n'importe quel module utilisantrequire
或通过preload.js
中的require
Du point de vue de la sécurité, exposer tout ce qui est récupéré par un appel est dangereux (voir mon commentairePour faire cela correctement, vous devez définir la BrowserWindow
sans qu'il soit falsifié par le client.require
comme je le détaille ci-dessous. La définition de ces options force votre application Electron à communiquer via IPC (Inter-Process Communication) et isole les deux environnements l'un de l'autre. Configurer votre application de cette manière vous permet de valider tout ce qui dans le backend pourrait être un modulerequire
Ci-dessous, vous trouverez un court exemple de ce dont je parle et à quoi cela pourrait ressembler dans votre application. Si vous êtes nouveau, je pourrais vous recommander d'utiliser
(dont je suis l'auteur) pour intégrer toutes ces bonnes pratiques de sécurité dès le départ lors de la création d'applications électroniques.secure-electron-template
secure-electron-template
Cette page
contient également de bonnes informations sur l'architecture requise lors de l'utilisation de preload.js pour créer des applications sécurisées.main.js