Utiliser des scripts de préchargement
Ceci est la partie 3 du tutoriel Electron.
Objectifs
Dans cette partie du tutoriel, vous apprendrez ce qu'est un script de préchargement et comment l'utiliser pour exposer de façon sécurisée des API privilégiées dans un processus de rendu. Vous apprendrez également à faire communiquer le processus principal et les processus de rendu à l'aide des modules de communication interprocessus(IPC) d'Electron.
Qu'est-ce qu'un script de préchargement ?
Le processus principal d’Electron est un environnement Node.js disposant d’un accès complet au système d’exploitation. On top of Electron modules, you can also access Node.js built-ins, as well as any packages installed via npm. D’autre part, les processus de rendu exécutent des pages Web et n’exécutent pas Node.js par défaut pour des raisons de sécurité.
Pour relier les différents types de processus d’Electron, nous devrons utiliser un script spécial appelé préchargement (preload).
Enrichir le moteur de rendu avec un script de préchargement
Le script de préchargement d'une BrowserWindow s’exécute dans un contexte qui a accès à la fois au DOM de l'HTML et à un sous ensemble des Apis Node.js et Electron.
À partir d'Electron 20, les scripts de préchargement sont mis en bac à sable par défaut et n'ont plus accès à un environnement complet Node.js. Pratiquement, cela signifie que vous avez une fonction polyfill de require n'ayant accès qu'à un ensemble limité d'APIs.
| API disponibles | Détails |
|---|---|
| Modules Electron | Modules de processus de rendu |
| Modules Node.js | events, timers, url |
| Polyfills globaux | Buffer, process, clearImmediate, setImmediate |
For more information, check out the Process Sandboxing guide.
Les scripts de préchargement sont injectés avant le chargement des pages Web dans le moteur de rendu, exactement comme les content scripts des extensions Chrome. To add features to your renderer that require privileged access, you can define global objects through the contextBridge API.
Pour illustrer ce concept, vous allez créer un script de préchargement qui expose les versions de votre application de Chrome, Node et Electron dans le moteur de rendu.
Ajoutez tout d'abord un nouveau script preload.js qui exposera les propriétés sélectionnées de l’objet process.versions d’Electron au processus de rendu dans une variable globale versions .
const{ contextBridge }=require('electron')
contextBridge.exposeInMainWorld('versions',{
node:()=> process.versions.node,
chrome:()=> process.versions.chrome,
electron:()=> process.versions.electron
//Nous pouvons exposer des variables en plus des fonctions
})
Pour associer ce script à votre processus de rendu, passez son chemin à l'option webPreferences.preload dans le constructeur d'une BrowserWindow :
const{ app,BrowserWindow}=require('electron')
const path =require('node:path')
constcreateWindow=()=>{
const win =newBrowserWindow({
width:800,
height:600,
webPreferences:{
preload: path.join(__dirname,'preload.js')
}
})
win.loadFile('index.html')
}
app.whenReady().then(()=>{
createWindow()
})
Deux concepts de Node.js sont utilisés ici :
À ce stade, le moteur de rendu a accès au paramètre versions global, alors affichons cette information dans la fenêtre. Cette variable est accessible via window.versions ou simplement versions. Créez maintenant un script renderer.js qui utilise l'API DOM document.getElementById pour remplacer le texte affiché par l'élément HTML dont la propriété id a pour valeur info.
const information =document.getElementById('info')
information.innerText=`Cette application utilise Chrome (v${versions.chrome()}), Node.js (v${versions.node()}), et Electron (v${versions.electron()})`
Enfin, modifiez votre index.html en ajoutant un nouvel élément dont la propriété id a pour valeur info,et attachez votre script renderer.js :
<!DOCTYPEhtml>
<html>
<head>
<metacharset="UTF-8"/>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self'"
/>
<meta
http-equiv="X-Content-Security-Policy"
content="default-src 'self'; script-src 'self'"
/>
<title>Bonjour depuis le rendu d'Electron !</title>
</head>
<body>
<h1>Bonjour depuis le rendu d'Electron !</h1>
<p>👋</p>
<pid="info"></p>
</body>
<scriptsrc="./renderer.js"></script>
</html>
Après avoir suivi les étapes ci-dessus, votre application doit ressembler à ceci :
Et le code devrait ressembler à ceci: