const path = require('path');
const { spawn } = require('child_process');
const waitOn = require('wait-on');
let mainWindow;
let backendProcess;
function createWindow() {
console.log("Creating Electron window...");
mainWindow = new BrowserWindow({
width: 1200,
height: 800,
autoHideMenuBar: true,
webPreferences: {
nodeIntegration: false,
contextIsolation: true
},
icon: path.join(__dirname, 'icon.png')
});
const targetURL = 'http://localhost:8000';
console.log("Waiting 1s to ensure backend is really ready...");
setTimeout(() => {
console.log(`Attempting to load: ${targetURL}`);
mainWindow.loadURL(targetURL).catch(err => {
console.error("
dialog.showErrorBox("Frontend Load Error", `Could not load: ${targetURL}\n\n${err.message}`);
});
}, 1000); // Delay 1 second just in case
}
function getBackendPath() {
const backendName = process.platform === 'win32' ? 'flexiweigh.exe' : 'flexiweigh';
const basePath = app.isPackaged ? process.resourcesPath : __dirname;
const fullPath = path.join(basePath, backendName);
console.log(`Resolved backend path: ${fullPath}`);
return fullPath;
}
function startBackend() {
const backendPath = getBackendPath();
console.log(`
backendProcess = spawn(backendPath, [], {
stdio: 'pipe',
env: process.env
});
backendProcess.on('error', (err) => {
console.error('
dialog.showErrorBox('Backend Error', `Could not start backend: ${err.message}`);
app.quit();
});
backendProcess.on('exit', (code, signal) => {
console.log(`
if (code !== 0) {
dialog.showErrorBox('Backend Crashed', `Backend exited with code ${code}`);
app.quit();
}
});
if (backendProcess.stdout) {
backendProcess.stdout.on('data', (data) => {
console.log(`
});
}
if (backendProcess.stderr) {
backendProcess.stderr.on('data', (data) => {
console.error(`
});
}
return waitOn({
resources: ['http://localhost:8000'],
timeout: 30000,
validateStatus: (status) => [200, 404, 405].includes(status),
headers: { Accept: 'application/json' }
});
}
app.whenReady().then(() => {
startBackend()
.then(() => {
console.log("
createWindow();
})
.catch((err) => {
console.error('
dialog.showErrorBox('Startup Error', `Could not reach backend: ${err.message}`);
app.quit();
});
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit();
});
app.on('before-quit', () => {
if (backendProcess) {
console.log('
backendProcess.kill();
}
});
```. This is my package.json;;
```{
"name": "flexiweigh",
"version": "1.0.1",
"description": "Weighbridge Management System Desktop Application",
"author": "Moyo ",
"homepage": "https://github.com/DUMBALINYOLO/Flexiweigh2",
"main": "main.js",
"scripts": {
"start": "electron .",
"package-win": "electron-builder --win",
"package-linux": "electron-builder --linux",
"package-linux-deb": "electron-builder --linux deb",
"package-all": "electron-builder -wl"
},
"dependencies": {
"wait-on": "7.1.0"
},
"devDependencies": {
"electron": "28.1.0",
"electron-builder": "24.6.3"
},
"build": {
"appId": "[email protected]",
"productName": "FlexiWeigh",
"copyright": "Copyright © 2025 Your Company",
"files": [
"main.js",
"flexiweigh",
"icon.png",
"!node_modules/{.bin,.cache}"
],
"extraFiles": [
{
"from": "./flexiweigh",
"to": "flexiweigh"
}
],
"asarUnpack": [
"flexiweigh"
],
"directories": {
"output": "dist"
},
"win": {
"target": [
"nsis",
"portable"
],
"icon": "assets/icon.ico",
"publisherName": "FlexiWeigh"
},
"linux": {
"target": ["AppImage", "deb"],
"icon": "assets/icon.png",
"category": "Utility",
"maintainer": "[email protected]",
"synopsis": "Weighbridge Management System",
"description": "Complete weighbridge management solution",
"desktop": {
"StartupWMClass": "flexiweigh"
}
},
"nsis": {
"oneClick": false,
"allowToChangeInstallationDirectory": true,
"createDesktopShortcut": true,
"createStartMenuShortcut": true
},
"deb": {
"depends": [
"libgtk-3-0",
"libnotify4",
"libnss3",
"libxss1",
"libxtst6",
"xdg-utils",
"libatspi2.0-0",
"libuuid1",
"libappindicator3-1"
]
}
}
}```
Подробнее здесь: https://stackoverflow.com/questions/796 ... roject-and