记录一次electron踩坑

代码哈士奇 等级 754 0 0

Vue2.x版本 https://github.com/dmhsq/electron-vue-dmhsq 或者 https://github.com/dmhsq/electron-vue/tree/main/template Vue3.x版本 https://github.com/dmhsq/electron-vue3-dmhsq 教程地址

解决如下

自己摸索的 可能有问题 大佬勿喷

1.解决fs.existsSync is not a function

vue引入electron的ipcRenderer等其它模块会出现这种情况 解决方案 自定义事件 使用渲染进程捕捉

在你的页面代码(比如vue文件)中加入

let cus = new CustomEvent("test_event",{detail:{你的数据}});
window.dispatchEvent(cus);

解释: cus定义了一个window事件 detail传递数据 test_event:自定义事件名 window.dispatchEvent(cus);触发自定义事件

在渲染进程 记录一次electron踩坑 添加以下代码负责监听

const { ipcRenderer } = require("electron");
window.addEventListener('test_event',(e)=>{
  console.log('开始了哦')
  console.log(e.detail)//这里就是你发送的数据
  ipcRenderer.send("test",e.detail);
})

渲染进程使用ipcRenderer向主进程发送数据 说明test为向主进程发送的事件名

以下为主进程接收代码

ipcMain.on("test", () => {
  ...做处理
});




2.解决electron发送请求时http://变file:// (也能解决代理)

发送请求时触发一个事件 比如

export const find = params => {
  let cus = new CustomEvent("axioes");
  window.dispatchEvent(cus);
  return axios.get("/api/find", { params: params });
};

在渲染进程中

window.addEventListener('axioes',()=>{
  ipcRenderer.send('axioso')
})

在主进程中(需要引入session模块)

const {
  app,
  BrowserWindow,
  Notification,
  Menu,
  MenuItem,
  ipcMain,
  net,
  session
} = require("electron");
ipcMain.addListener("axioso", () => {
  resq();
});
function resq() {
  const filter = {
    urls: ["*://api/*", "file://api/*"]
  };
  session.defaultSession.webRequest.onBeforeRequest(
    filter,
    (details, callback) => {
      console.log(122131231);
      console.log(details);
      // details.url = "http://www.baidu.com"
      let srt = details.url;
      details.url = "http://localhost:8080" + srt.substr(10);
      callback({ redirectURL: details.url });
      console.log(details);
    }
  );
}

说明:

const filter = {
    urls: ["*://api/*", "file://api/*"]
  };

定义匹配api字符串的请求的拦截规则

说明:

 session.defaultSession.webRequest.onBeforeRequest(
    filter,
    (details, callback) => {
      console.log(122131231);
      console.log(details);
      // details.url = "http://www.baidu.com"
      let srt = details.url;
      details.url = "http://localhost:8080" + srt.substr(10);
      callback({ redirectURL: details.url });
      console.log(details);
    }
  );

在发送请求之前 改写请求地址 原本我的请求地址是http://localhost:8086/edusys/admin/find 使用代理为 /api/find 我的vue项目端口为8080 所以需要将"/api/find"变为"http://localhost:8080/api/find" 所以我的nginx配置如下

   server {
            listen       8080;
            server_name  localhost;

            location / {
                root   html;
                index  index.html index.htm;
            }

            location /api {
               proxy_pass   http://localhost:8086/edusys/admin;
            }

        }

3.实现登陆以及切换用户

两种方案

方案一 主进程使用菜单切换

记录一次electron踩坑主进程监听菜单事件 记录一次electron踩坑 主进程处理代码

function changeUser() {
  const nm = new Menu();//创建空菜单
  Menu.setApplicationMenu(nm);//菜单设置为空
  createWindows();//创建登陆窗口
  wins.close();//关闭原先的大窗口这里的win是createWindowMain()创建窗口时返回的win
}
function createWindowMain() {
  const win = new BrowserWindow({
    width: 1500,
    height: 1000,
    webPreferences: {
      nodeIntegration: true
    }
  });
  win.loadFile(__dirname + "/dist/index.html");
  // win.webContents.openDevTools();
  reloadTheWin(win);
  return win;
}
function createWindows() {
  const win = new BrowserWindow({
    width: 400,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  });

  win.loadFile(__dirname + "./login.html");
  // reloadTheWins(win);
}

方案二 Vue开发的页面触发切换

记录一次electron踩坑

这是切换按钮所在的菜单的代码(头部导航的部分代码) 页面点击切换用户触发自定义事件

<el-dropdown>
    <span style="color: black">
        教务处<i class="el-icon-arrow-down el-icon--right"></i>
    </span>
    <el-dropdown-menu slot="dropdown">
    <el-dropdown-item>退出</el-dropdown-item>
    <el-dropdown-item @click.native="changeUser">切换用户</el-dropdown-item>
    </el-dropdown-menu>
</el-dropdown>
<script>
export default {
  name: "MyHeader",
  methods:{
    changeUser(){
      console.log("改变用户")
      let cuss = new CustomEvent("changeUsers");//自定义事件
      window.dispatchEvent(cuss);//触发自定义事件
    }
  }
};
</script>

渲染进程处理代码

window.addEventListener("changeUsers", () => {//监听changeUsers事件
  ipcRenderer.send("changeUsr");//向主进程发送通知
})

主进程处理代码

ipcMain.on('changeUsr',()=>{
  changeUser();
});
function changeUser() {
  const nm = new Menu();//创建空菜单
  Menu.setApplicationMenu(nm);//菜单设置为空
  createWindows();//创建登陆窗口
  wins.close();//关闭原先的大窗口这里的win是createWindowMain()创建窗口时返回的win
}
function createWindowMain() {
  const win = new BrowserWindow({
    width: 1500,
    height: 1000,
    webPreferences: {
      nodeIntegration: true
    }
  });
  win.loadFile(__dirname + "/dist/index.html");
  // win.webContents.openDevTools();
  reloadTheWin(win);
  return win;
}
function createWindows() {
  const win = new BrowserWindow({
    width: 400,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  });

  win.loadFile(__dirname + "./login.html");
  // reloadTheWins(win);
}







  大家好,我是代码哈士奇,是一名软件学院网络工程的学生,因为我是“狗”,狗走千里吃肉。想把大学期间学的东西和大家分享,和大家一起进步。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!

未经本人允许,禁止转载

记录一次electron踩坑


后续会推出

前端:vue入门 vue开发小程序 等 后端: java入门 springboot入门等 服务器:mysql入门 服务器简单指令 云服务器运行项目 python:推荐不温卜火 一定要看哦 一些插件的使用等

大学之道亦在自身,努力学习,热血青春 如果对编程感兴趣可以加入我们的qq群一起交流:974178910 记录一次electron踩坑

有问题可以下方留言,看到了会回复哦

收藏
评论区

相关推荐

记录一次electron踩坑
Vue2.x版本 https://github.com/dmhsq/electronvuedmhsq(https://github.com/dmhsq/electronvuedmhsq) 或者 https://github.com/dmhsq/electronvue/tree/main/template(https://github.com
(三)使用electron
前提已经实现了(一)里面的效果连接:[https://www.cnblogs.com/yuNotes/p/12884930.html](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.cnblogs.com%2FyuNotes%2Fp%2F12884930.html) #### 1
(原)Electron+vue 应用实战
1.electron架构思考 ============== 在做electron桌面开发中,Electron+vue当下算是性价比的比较高的。但是electron算是小众开发,遇到问题,基本上就是掉进深坑,爬好久才出来。 为了做一个项目,我翻遍了国内好多网站。看到一篇好的文章。[Electron 应用实战 (架构篇)](https://www.oschi
3、electron打包生成exe文件
打包方式1:DOS窗口命令打包 --------------- DOS 下,输入 npm install electron-packager -g**全局安装**我们的打包神器: cnpm install electron-packager -g 在项目文件夹下面,也就是根目录下面打开DOS执行打包命令: electron-packa
electron(1)安装和使用
下载和安装 # Clone the Quick Start repository git clone https://github.com/atom/electron-quick-start # Install the dependencies and run npm install && npm start 会
Ubuntu 18.10 安装程序可以使用HTML5,Electron和Snap
导读 **开发工作在下一代Ubuntu版本Ubuntu 18.10(Cosmic Cuttlefish)上开始启动,它的主要新功能之一看起来可能是下一代Ubiquity图形安装程序。** ![Ubuntu 18.10 安装程序可以使用HTML5,Electron和SnapUbuntu 18.10 安装程序可以使用HTML5,Electron和Snap](
AudioContext方法播放音频
`const fs = require('fs'); const electron = require('electron'); const dataPath = (electron.app || electron.remote.app).getPath('userData'); const fPath =` ${dataPath}/file/unzip\`
Electron 快速入门及最新安装教程
> 作者:程序员学院   官方网址:[https://www.chengxuyuan.com](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.chengxuyuan.com)    微信公众号:华仁程序员学院 一、 Electron简介 ------------- Electr
Electron中通过asar打包后ffi
在使用Electron开发完应用程序后,需要打包生成各平台对应的可执行文件供用户使用。 这里以Mac平台为例,最简单的打包方案是使用**electron-packager**来对应用程序进行打包操作,如执行最简单的指令`electron-packager .`执行完成后会在同级目录生成`${appName}-${platfomr}-${arch}`目录如e
Electron开发使用Vue Devtools
转自 \[[https://orchidflower.oschina.io/2017/03/29/Using-Vue-Devtools-in-Electron/](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Forchidflower.oschina.io%2F2017%2F03%2F29
Electron开发跨平台桌面程序入门教程
最近一直在学习 Electron 开发桌面应用程序,在尝试了 java swing 和 FXjava 后,感叹还是 Electron 开发桌面应用上手最快。我会在这一篇文章中实现一个HelloWord的应用程序,记录学习过程中的坑。 Electron是什么呢? ------------- Electron 可以让你使用纯 JavaScript 调用丰富的
Electron桌面端所见即所得
### 突然让你开发Electron应用,你能hold住吗? 如果领导突然说需要开发一款前端桌面端应用,那么对于我们前端er来说选择Electron是一件顺理成章的事情。但事实上很多同学对于Electron都不太了解和熟悉。 **如果突然让我们去开发Electron应用,很多人都会陷入迷茫和懵逼的状态**。然后在依靠网上相对较少的资料,慢慢摸索、一路踩坑
Electron踩坑记录
心血来潮想做一个PC端应用,就来学学Electron,以下为学习Electron时的踩坑记录。 心血来潮想做一个PC端应用,就来学学Electron,以下为学习Electron时的踩坑记录。 安装 -- 在国内安装`electron`的时候,可能会因为网络原因遇到卡在`Building fresh packages...`(yarn)或者是卡在`nod
Rust 的 GUI 框架生态概览
本文比较全面比较了目前主流的 Rust 的 GUI 框架的表现。其中 ++ 表示非常好,-- 表示非常差,而 o 表示处于平均水平。 参与对比的框架共有 8 个,详细的比较结果如下:   Electron + Neon Electron + FFI Electron + NodeJS Cpp Addon Rust Program + Qt sta
TMS WEB Core v1.2预览版:新的Electron应用程序支持
#### 2019年2月20日,星期三 几个月前,我们已经开始与[Electron进行](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Ftmssoftware.com%2Fsite%2Fblog.asp%3Fpost%3D495)实验。在工作概念验证之后,我们的目标是为Delphi开发人