- Completely rewrite main.js for reliable asset loading - Update preload.js with proper security context isolation - Fix file:// protocol handling for application resources - Add proper error logging and reporting in Electron context - Disable service workers in Electron environment - Fix path resolution for assets in packaged application - Add prerequisite checking for Electron builds - Update electron-builder configuration The changes resolve persistent issues with: 1. Missing assets in packaged application 2. Incorrect path resolution in production builds 3. Service worker conflicts in desktop environment 4. Security context handling in preload script 5. Electron build process reliability
104 lines
3.7 KiB
JavaScript
104 lines
3.7 KiB
JavaScript
const path = require('path');
|
|
const fs = require('fs-extra');
|
|
|
|
async function main() {
|
|
try {
|
|
console.log('Starting electron build process...');
|
|
|
|
// Create dist directory if it doesn't exist
|
|
const distElectronDir = path.resolve(__dirname, '../dist-electron');
|
|
await fs.ensureDir(distElectronDir);
|
|
|
|
// Copy web files
|
|
const wwwDir = path.join(distElectronDir, 'www');
|
|
await fs.ensureDir(wwwDir);
|
|
await fs.copy('dist', wwwDir);
|
|
|
|
// Copy and fix index.html
|
|
const indexPath = path.join(wwwDir, 'index.html');
|
|
let indexContent = await fs.readFile(indexPath, 'utf8');
|
|
|
|
// More comprehensive path fixing
|
|
indexContent = indexContent
|
|
// Fix absolute paths to be relative
|
|
.replace(/src="\//g, 'src="\./')
|
|
.replace(/href="\//g, 'href="\./')
|
|
// Fix modulepreload paths
|
|
.replace(/<link [^>]*rel="modulepreload"[^>]*href="\/assets\//g, '<link rel="modulepreload" as="script" crossorigin="" href="./assets/')
|
|
.replace(/<link [^>]*rel="modulepreload"[^>]*href="\.\/assets\//g, '<link rel="modulepreload" as="script" crossorigin="" href="./assets/')
|
|
// Fix stylesheet paths
|
|
.replace(/<link [^>]*rel="stylesheet"[^>]*href="\/assets\//g, '<link rel="stylesheet" crossorigin="" href="./assets/')
|
|
.replace(/<link [^>]*rel="stylesheet"[^>]*href="\.\/assets\//g, '<link rel="stylesheet" crossorigin="" href="./assets/')
|
|
// Fix script paths
|
|
.replace(/src="\/assets\//g, 'src="./assets/')
|
|
.replace(/src="\.\/assets\//g, 'src="./assets/')
|
|
// Fix any remaining asset paths
|
|
.replace(/(['"]\/?)(assets\/)/g, '"./assets/');
|
|
|
|
// Debug output
|
|
console.log('After path fixing, checking for remaining /assets/ paths:', indexContent.includes('/assets/'));
|
|
console.log('Sample of fixed content:', indexContent.slice(0, 500));
|
|
|
|
await fs.writeFile(indexPath, indexContent);
|
|
|
|
console.log('Copied and fixed web files in:', wwwDir);
|
|
|
|
// Copy main process files
|
|
console.log('Copying main process files...');
|
|
const mainProcessFiles = [
|
|
['src/electron/main.js', 'main.js'],
|
|
['src/electron/preload.js', 'preload.js']
|
|
];
|
|
|
|
for (const [src, dest] of mainProcessFiles) {
|
|
const destPath = path.join(distElectronDir, dest);
|
|
console.log(`Copying ${src} to ${destPath}`);
|
|
await fs.copy(src, destPath);
|
|
}
|
|
|
|
// Create package.json for production
|
|
const devPackageJson = require('../package.json');
|
|
const prodPackageJson = {
|
|
name: devPackageJson.name,
|
|
version: devPackageJson.version,
|
|
description: devPackageJson.description,
|
|
author: devPackageJson.author,
|
|
main: 'main.js',
|
|
private: true,
|
|
};
|
|
|
|
await fs.writeJson(
|
|
path.join(distElectronDir, 'package.json'),
|
|
prodPackageJson,
|
|
{ spaces: 2 }
|
|
);
|
|
|
|
// Verify the build
|
|
console.log('\nVerifying build structure:');
|
|
const files = await fs.readdir(distElectronDir);
|
|
console.log('Files in dist-electron:', files);
|
|
|
|
if (!files.includes('main.js')) {
|
|
throw new Error('main.js not found in build directory');
|
|
}
|
|
if (!files.includes('preload.js')) {
|
|
throw new Error('preload.js not found in build directory');
|
|
}
|
|
if (!files.includes('package.json')) {
|
|
throw new Error('package.json not found in build directory');
|
|
}
|
|
|
|
// Copy the electron-logger.js file
|
|
const loggerSrc = path.join(__dirname, '../src/electron/electron-logger.js');
|
|
const loggerDest = path.join(distElectronDir, 'electron-logger.js');
|
|
fs.copyFileSync(loggerSrc, loggerDest);
|
|
console.log(`Copying src/electron/electron-logger.js to ${loggerDest}`);
|
|
|
|
console.log('Build completed successfully!');
|
|
} catch (error) {
|
|
console.error('Build failed:', error);
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
main();
|