首页 > 系统相关 >运行使用Electron-forge打包的electron package时遇到在js文件中执行的exec命令和在渲染进程中执行的node.js api出现奇怪问题的解决思路

运行使用Electron-forge打包的electron package时遇到在js文件中执行的exec命令和在渲染进程中执行的node.js api出现奇怪问题的解决思路

时间:2024-10-10 23:33:28浏览次数:7  
标签:code1 code2 fs join exec js api path

js文件中执行的exec命令出错

很可能是项目中使用了一些非html, css, js的源文件,比如用了Makefile来编译了cpp代码,或者执行的exec命令为cp dir/something.cpp之类的文件操作命令。

可以使用修改forge.config.js文件配置的方式,使得npm run make的时候自动把Makefileexec命令中用到的文件和目录复制到打包后的根目录中。

具体来说,可以给forge.config.js文件的module.exports/packagerConfig下新增如下配置:

afterExtract: [
  (extractPath, electronVersion, platform, arch, done) => {
    // Copy the Makefile to the build directory
    var makefile = path.join(__dirname, 'Makefile');
    var backup = path.join(__dirname, 'backup');
    var dest = extractPath;
    fs.copyFileSync(makefile, path.join(dest, 'Makefile'));
    // 把backup目录递归地复制到dest目录下面
    copyDir(backup, path.join(dest, 'backup'));
    done();
  }
]

其中,copyDir函数的定义为:

function copyDir(src, dest) {
  fs.mkdirSync(dest, { recursive: true }); // 创建目标目录

  // 递归遍历源目录
  fs.readdirSync(src).forEach(file => {
    const srcPath = path.join(src, file);
    const destPath = path.join(dest, file);

    // 判断是文件还是目录
    const stat = fs.statSync(srcPath);
    if (stat.isDirectory()) {
      copyDir(srcPath, destPath); // 递归复制子目录
    } else {
      fs.copyFileSync(srcPath, destPath); // 复制文件
    }
  });
}

渲染进程中执行的node.js api出错

可能是打包后的浏览器内核安全设置更高?

建议electron项目中还是尽量前后端分离比较好,在主进程中用node.js的库,即各种require,在渲染进程(浏览器进程)中就用web页面的库,即各种importexport

我把renderer.js中的fs模块的操作都删了,把调用的fs模块函数都转移到了main.js里面去执行,这个错误就消失了。

比如原本在renderer.js中是这样:

document.getElementById('run-compare').addEventListener('click', () => {
  // 获取code1和code2的内容
  var code1Content = editor1.state.doc.toString(); 
  var code2Content = editor2.state.doc.toString();

  // 获取项目根目录
  rootPath = __dirname;

  // 创建文件路径
  const filePath1 = path.join(rootPath, 'code1.cpp');
  const filePath2 = path.join(rootPath, 'code2.cpp');

  // 写入文件
  fs.writeFile(filePath1, code1Content, (err) => {
    if (err) {
      console.error(err);
      return;
    }
    console.log('code1写入成功');
  });

  fs.writeFile(filePath2, code2Content, (err) => {
    if (err) {
      console.error(err);
      return;
    }
    console.log('code2写入成功');
  });

  ipcRenderer.send('run-compare');
});

现在我就改成了这样:

document.getElementById('run-compare').addEventListener('click', () => {
  // 获取code1和code2的内容
  var code1Content = editor1.state.doc.toString(); 
  var code2Content = editor2.state.doc.toString();

  // 获取项目根目录
  rootPath = __dirname;

  // 创建文件路径
  const filePath1 = path.join(rootPath, 'code1.cpp');
  const filePath2 = path.join(rootPath, 'code2.cpp');

  // 发送消息给主进程
  ipcRenderer.send('compare-codes', { code1: code1Content, code2: code2Content });

  ipcRenderer.send('run-compare');
});

然后在main.js中新增对compare-codes事件的监听:

ipcMain.on('compare-codes', (event, data) => {
  const { code1, code2 } = data;
  fs.writeFileSync('code1.cpp', code1);
  fs.writeFileSync('code2.cpp', code2);
});

总之,以后用node.js写项目,最好还是要把前后端分离,不能在被某个html文件引用的js脚本中调用node.js中的库。

标签:code1,code2,fs,join,exec,js,api,path
From: https://www.cnblogs.com/lightmon5210/p/18457439

相关文章

  • WPF Image display webp via BitMapImgae BeginInit UriSource EndInit in MVVM
    privatevoidGenenerateBitMapImageViaUrl(stringurl){BitmapImagebmi=newBitmapImage();bmi.BeginInit();bmi.UriSource=newUri(url,UriKind.RelativeOrAbsolute);bmi.EndInit();if(bmi.CanFreeze){bmi.Freeze();}......
  • ValueError: Unsupported callback API version: version 2.0 added a callback_api_v
     2024/10/1021:25:44PM-ERROR-InternalServerError:/abcTraceback(mostrecentcalllast):File"/root/abc/backend/venv/lib/python3.8/site-packages/django/core/handlers/exception.py",line47,ininnerresponse=get_response(reque......
  • jsp传统文化在线学习系统3wm23--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表学生,教师,课程分类,课程信息,选择课程,退出课程,学习资源开题报告内容一、项目背景在全球化和信息化的背景下,传统文化面临着被边缘化的风险。为了保护和传承......
  • jsp出租车公司管理系统的设计与实现gck4w--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表司机,车辆信息,用车登记,营业登记,司机天地开题报告内容一、项目背景随着城市出行需求的不断增长,出租车行业面临着日益激烈的竞争。为了提高运营效率、优化资......
  • jsp宠物医院系统zhbhk程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表职工,用户,宠物医生,预约挂号,取消挂号,宠物寄养,医院公告,仓库物品,入库物品,出库物品,医生,调休申请开题报告内容一、项目背景随着宠物数量的快速增长,宠物医......
  • jsp宠物寻回系统u5zde--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,宠物分类,宠物信息,接取信息,完成信息开题报告内容一、项目背景随着宠物数量的不断增加,宠物丢失问题也日益突出。宠物不仅是家庭的重要成员,更是主人情感......
  • json-server的使用
    1.简介json-server可以帮助前端快速的mock数据,快捷方便2.安装可以通过npm或者yarn安装npmijson-server-g3.数据在项目的根目录下创建一个文件夹,名字随意,可以叫做db然后再db目录下新建一个index.json,在里面定义要模拟的数据例{"list":[{......
  • js.移掉 K 位数字
     链接:402.移掉K位数字-力扣(LeetCode)题目:给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。 示例1:输入:num="1432219",k=3输出:"1219"解释:移除掉三个数字4,3,......
  • js.生命游戏
    链接:289.生命游戏-力扣(LeetCode)题目:根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。给定一个包含 m×n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态: 1 即为 活细胞 (live),或......
  • js-存在重复元素
    219.存在重复元素II给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i]==nums[j] 且 abs(i-j)<=k 。如果存在,返回 true ;否则,返回 false 。代码:第一次尝试:/** *@param{number[]}nums *@param......