使用 quasar + vite 编写electron应用程序,同时用node编写的server后台,想在程序启动时自动运行后台服务。打包之后,代码都被编译,我目前没找到是否有什么办法可以像vue的 assets文件夹一样的办法,可以打包的时候原封不动的打包到根目录,所以后台代码需要打完包粘贴到根目录(也算是曲线救国)。server文件夹为后台代码,以下为打完包的项目结构。
现在来说说前台如何实现。首先需要在主线程里编辑,使用exec执行脚本。
代码如下:
// // 在Electron主进程文件中
const { exec } = require('child_process');
function runNodeScript(scriptPath) {
console.log(scriptPath, 'scriptPath');
exec('node ' + scriptPath, (error, stdout, stderr) => {
console.log('exec', error, stdout, stderr);
if (error) {
console.log(`执行出错: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
if (stderr) {
console.log(`stderr: ${stderr}`);
}
});
}
// 假设你的Node脚本路径是'./your-node-script.js'
runNodeScript(__dirname.split('\\').slice(0, -2).join('\\') + '\\server\\server.js');
本以为完事大吉了,打完包之后打开程序,发现主线程没报错,但是服务也无法访问,想着可能是后台脚本的问题,我进入server文件夹,打开cmd 输入 node server.js ,此时后台端口可以访问了,所以并不是后台代码的问题。
最后发现是exec执行的脚本 和 在文件夹下 node 执行的脚本 环境变量会不同,所以导致这个问题。对exec 进行环境变量配置:
代码如下:
// // 在Electron主进程文件中
const { exec } = require('child_process');
const options = {
cwd: __dirname.split('\\').slice(0, -2).join('\\') + '\\server',
env: {
NODE_ENV: 'production',
DATABASE_URL: 'your-database-url',
// 其他环境变量
}
};
function runNodeScript(scriptPath) {
console.log(scriptPath, 'scriptPath');
exec('node ' + scriptPath, options, (error, stdout, stderr) => {
console.log('exec', error, stdout, stderr);
if (error) {
console.log(`执行出错: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
if (stderr) {
console.log(`stderr: ${stderr}`);
}
});
}
// 假设你的Node脚本路径是'./your-node-script.js'
runNodeScript(__dirname.split('\\').slice(0, -2).join('\\') + '\\server\\server.js');
此时,在重新打个包,运行项目时,后台已经可以访问了~