Skip to main content

Electron

KEZAKO ?

Cette partie d'atome est un framework permettant de développer des applications desktop multi-plateformes à partir de JavaScript/Html/CSS.

Le processus de développement est "Simple".

Mise en place d'un environnement de dev#

info

Pour la suite de cette page je pars du principe qu'on ajoute la stack electron sur un projet déjà existant, dans une autre doc j'explique la mise en place de mon environnement post electron.

L'environnement pré-electron est disponible ici

1. Installation des packages#

yarn add electron electron-builder wait-on concurrently electron-is-dev

Electron permet de lancer la solution sans construire (build) la solution complĂšte.

Electron-Builder permet de compiler la solution.

"Wait-On" permet d'attendre une réponse d'une url spécifique pour ici continuer le processus.

"Concurrently" permet de lancer plusieures commandes aux mĂȘme moment.

2. Un peu de configuration#

package.json
{
... le reste de votre package.json
"main": "./build/electron.js",
"build": {
"productName": "unlabeledProject",
"appId": "com.example.unlabeledProject",
"icon": "build/toolbox.png",
"asar": true,
"files": [
"package.json",
"build/**/*",
"node_modules/**/*",
"BuildServer/**/*"
]
},
}

Toutes ces lignes sont-elles vraiment nécessaires ?

Dans notre cas oui, mais je suis lĂ  pour vous les expliquer:

  • main : L'emplacement de votre fichier electron.js, celui-ci est le point d'entrĂ©e de votre application (imaginez cliquer sur ce fichier quand vous lancer la solution finale ou uniquement en dev)
  • build:
    • productName : Le nom de votre produit (sera utilisĂ© pour la compilation de votre exĂ©cutable)
    • appId : Id Linux/Apple, cette id permet de reconnaĂźtre le package.
    • icon : L'icon utiliser pour vos exĂ©cutables (penser Ă  bien importer le dossier oĂč il est dans les fichiers)
    • asar : Si vous utilisez le format asar pour vos fichiers compressĂ©s. ThĂ©oriquement il accĂ©lĂšre les requires.
    • files: Tous les fichiers/dossiers incluent dans le package finale, penser Ă  include le node_modules, vos ou votre dossier(s) de source ainsi que votre icon (ici, build contient le client ainsi que l'icon)

3. Ajout des scripts#

package.json
{
... le reste de votre package.json
"scripts":{
"start":"VOTRE SCRIPT DE STARTUP",
"build":"VOTRE SCRIPT DE BUILD",
"postinstall": "electron-builder install-app-deps",
"electronDev": "concurrently \"yarn start\" \"wait-on http://localhost:3000 && electron .\"",
"electronAlone":"electron .",
"ebuild": "yarn run build && node_modules/.bin/build",
"electron-pack": "build --em.main=build/electron.js",
"pack": "electron-builder --dir",
"dist": "electron-builder",
"distStartup":"yarn build && yarn dist"
}
}

Pour le bon fonctionnement de la solution TOUS ces scripts sont nécessaires:

  • postinstall : Est exĂ©cutĂ© aprĂšs l'installation d'un package, il permet de reconstruire les extensions dans un format propice Ă  l'utilisation electron.
  • electronDev : Permet de lancer votre environnement de dev via start puis d'attendre que celui-ci soit lancĂ© pour lancer le client electron.
  • electronAlone : Dans beaucoup de cas j'ai eu Ă  modifier uniquement la partie electron, afin d'accĂ©lĂ©rer les starts/restarts je lançais une fois unique start puis relançais uniquement la partie electron.
  • pack : Permet d'obtenir uniquement le dossier contenant la solution compilĂ©e.
  • dist : Permet via la configuration de l'Ă©tape 2 de compiler vos fichiers (par dĂ©fault .snap pour linux, .exe pour windows et .appImage pour mac)
  • distStartup : Permet en une commande de build les composants ainsi que le client electron.

4. electron.js#

Je vous fournis une version simplifiée de mon fichier electronJs les commentaires sont intégrés dans le code fournis, si vous souhaitez mettre en place un systÚme plus complet avec un icon tray, veuillez vous en référer à mon code.

Le code electron.js est placé dans mon dossier public afin d'éviter que celui ci sois modifié, ne comptez pas sur du TypeScript pour celui ci.

/public/electron.js
const electron = require("electron");
const { app, BrowserWindow } = electron;
const isDev = require("electron-is-dev");
const Server = require('../BuildServer/index') // permet de lancer le serveur aux démarrage
const path = require("path");
let mainWindow;
const BaseFolder = path.join(__dirname);
const icon = path.join(BaseFolder,"toolbox.png");
const createWindow = ({showOnLoad = true}={}) => {
if(mainWindow){
mainWindow.focus();
return;
}
mainWindow = new BrowserWindow({
width: 1280, // Permet de dĂ©finir la taille de la fenĂȘtre
height: 720,
autoHideMenuBar : true, // Permet de cacher la barre de menu intégrer a electron
icon : icon // L'icon de la fenĂȘtre Ă©lectron
});
mainWindow.loadURL(
isDev ?
"http://localhost:3000" : // Le serveur de dev local
"http://localhost:5000" // Le serveur de production
)
mainWindow.once("ready-to-show",()=>{
if(showOnLoad) mainWindow.show(); //si on veux montrer la fenĂȘtre aux dĂ©marrage
})
mainWindow.once("closed", () => (mainWindow = null)); // si la fenĂȘtre est fermer on vide mainWindow
}
const init = () => {
app.on("window-all-closed", (e) => e.preventDefault()); // evite que toute la solution sois fermer si toute les fenĂȘtre sont fermer.
};
app.requestSingleInstanceLock() ? init() : app.quit(); // Evite d'avoir deux fois le serveur démarrer
app.on("second-instance", () => mainWindow.show()); // montre la fenĂȘtre si la solution est dĂ©marrer deux fois
app.on("ready",()=>{
if (mainWindow === null) {
createWindow(); // si aucune fenĂȘtre en crĂ©er une.
}
})
app.on("activate", () => {
if (mainWindow === null) {
createWindow(); // si aucune fenĂȘtre en crĂ©er une.
}
});

How It Work#

Lors du démarrage de notre solution notre electron va démarrer notre serveur web, celui ci intÚgre une partie statique qui n'est autre que notre client ainsi qu'une partie Api.

Pourquoi Electron et pas React-Native#

React native et Electron n'ont pas le mĂȘme objectif.

React native vise les appareille Android et Ios contrairement a Electron qui vise les Ordinateur.