Electron之开发中的难点整理

简介: Electron之开发中的难点整理

electron分为:主进程与渲染进程。


在一个electron的程序中,一般会存在一个主进程跟若干个渲染进程。


主进程:


1. 可以使用和系统对接的Electron Api -创建菜单,上传文件等。


2. 创建渲染进程- Renderer Process


3. 全面支持node.js


4. 只有一个,作为整个程序的入口点。


渲染进程:


1. 可以有多个,每个渲染进程对应一个窗口。


2. 每个都是一个单独的进程。


3. 全面支持node.js 和 Dom Api


4. 可以使用一部分Electron提供的API


如果说我们要在一个electron程序打开后,再同时打开一个渲染进程(也就是同时打开两个窗口)我们应该怎么办呢?


const {app,BrowserWindow} = require('electron')
app = 主程序。
BrowserWindow = 创建并控制浏览器窗口。
app.on('ready',()=>{
    let mainWindow = new BrowserWindow({
        width:800,
        height:600,
        webPreferences:{
            nodeIntegration:true // 是否启用node
        }
    })
    mainWindow.loadFile('index.html')// 主进程加载页面
    // 子窗口
    let secondWindow = new BrowserWindow({
        width: 400,
        height: 300,
        webPreferences: {
            nodeIntegration: true,
        },
        parent: mainWindow,
    })
    secondWindow.loadFile('secodWindow.html')
})

上述代码在app监测到ready 之后。首先创建了 mainWindow 也就是主进程。主进程渲染的是index.html 这个页面。而主进程渲染完后,同时又启动了一个新的子窗口。secondWindow,在它启动时候配置它的父窗口为 mainWindow。


这样在一个electron打开的时候我们就可以同时启动两个窗口。mainWindow是secordWindow的父级进程。


项目中,我们经常会碰到这样一个情况,开发环境中,electron的打开地址一般指向本地的项目开发地址,如:localhost:8080。而线上环境的时候就没有这个地址,我们如何处理?


其实这类问题的答案很简单,我们需要判断环境变量。


electron-is-dev

我们在当前项目中安装以上插件,用来判断当前环境是否是 dev (开发)环境。

9b60c0d4c5af4667872e566113e5db98.png


根据当前环境我们可以配置出,如果是开发环境我们就走 地址,如果不是开发环境,我们则走项目打包之后的地址即可。


隐藏electron的边框之后,突然发现这个程序无法拖动。这个如何解决呢?


关于这个问题,官方其实就给了详细回答,默认的无边框是不允许被拖动,拖拽的,但是可以在css中指定:-webkit-app-region:drag  来通知electron 哪些区域是可以进行拖拽的。也可以在脱宅去内部使用css 样式   webkit-app-region:no-drag     则可以将其中部分区域排除掉。这里需要注意的是,只支持矩形。


<body style="-webkit-app-region: drag">
</body>
// 整个区域可拖拽
// 注意:
如果想要整个窗口都可进行拖拽,则必须将其中的按钮标记为不可拖拽,否则用户将无法点击他们
button{
    -webkit-app-region:no-drag;
}
在无边框窗口中,拖动行为可能与选择文本冲突,为了防止该操作,需要在可拖拽区域内禁用文本选择。
.titebar{
    -webkit-use-select:none;
    -webkit-app-region:drag;
}

关于进程之间的通信


进程之间的通信无非就是,渲染进程给主进程发消息,主进程接受到后来调用node一些能力进行处理window交互的一些东西。


  1. 在渲染进程中引入 ipc通信 ipcRenderer


const { ipcRenderer } = require('electron')


在事件中进行消息发送


ipcRenderer.send("监听名字","消息值")


在主进程中进行消息监听

const { ipcMain } = require('electron')
ipcMain.on('message',(event,tag)=>{
    console.log(tag)
    // 4. 主进程给渲染进程回馈消息。
    event.reply('reply',"给message的渲染进程返回消息");
})

渲染进程接收主进程返回的消息

ipcRenderer.on('reply',(event,tag)=>{
    console.log('渲染进程接收到的主进程消息')
})


目录
相关文章
|
9月前
|
开发框架 Dart 前端开发
从零到应用:我的Flutter项目开发之旅
Flutter是一种流行的跨平台移动应用开发框架,由Google推出。它使用Dart编程语言,通过单一代码库可以同时构建iOS和Android应用。Flutter具有许多吸引力的特性,如快速的渲染性能、漂亮的用户界面、丰富的组件库以及热重载等。通过阅读这篇文章,你将获得一些关于Flutter项目开发的实际指导,可以帮助你更有效地构建高质量的移动应用程序。无论你是初学者还是有一定经验的开发者,希望这些笔记能够为你提供一些有用的思路和技巧,让你在Flutter项目开发中取得更好的成果。
|
6月前
|
Dart 前端开发 JavaScript
掌握这个关键技术,让你的APP开发事半功倍!——Flutter与其他方案的区别
掌握这个关键技术,让你的APP开发事半功倍!——Flutter与其他方案的区别
49 0
|
JavaScript 前端开发
【从零到一手撕脚手架 | 第四节】加速开发效率 使用plop生成开发模板 使用mock进行数据模拟
基础的脚手架已经搭建完毕,如果我们想快速生成几个基础的组件模板我们可以使用Plop或者使用文件写入实现。比如我们不想等后端同学的接口,可以直接使用mock模拟数据生成。
243 0
【从零到一手撕脚手架 | 第四节】加速开发效率 使用plop生成开发模板 使用mock进行数据模拟
|
Web App开发 JavaScript 测试技术
技术分享 | 学做测试平台开发-Vuetify 框架
技术分享 | 学做测试平台开发-Vuetify 框架
|
文字识别 数据安全/隐私保护 计算机视觉
【番外篇】客户端开发(Electron)无源码如何做汉化
【番外篇】客户端开发(Electron)无源码如何做汉化
603 0
【番外篇】客户端开发(Electron)无源码如何做汉化
|
开发者 大数据
揭秘!如何用Flutter设计一个100%准确的埋点框架? | 开发者必读(040期)
最炫的技术新知、最热门的大咖公开课、最有趣的开发者活动、最实用的工具干货,就在《开发者必读》!
1296 0
|
Web App开发 JavaScript 前端开发
【推荐】jQuery应用程序架构设计工具(PPT)
【CSDN编译】Addy Osmani是jQuery Core Bug Triage & Docs Team成员,AOL的UI开发工程师,著有《JS关键设计模式》、《OSS stuffs》等书。本文是他在今年伦敦Web Directions上的演讲——《jQuery 应用程序结构工具》,这是一个幻灯片的扩展版本,包含多方面内容和亮点,其亮点是这15个幻灯片。
713 0
|
缓存 前端开发 JavaScript
在闲鱼,我们如何用Dart做高效后端开发?
作者:闲鱼技术-临耕 背景 像阿里其他技术团队以及业界的做法一样,闲鱼的大多数后端应用都是全部使用java来实现的。java易用、丰富的库、结构容易设计的特性决定了它是进行业务开发的最好语言之一。后端应用中数据的存储、访问、转换、输出虽然都属于后端的范畴,但是其中变更的频率是不同的。
3674 0
|
容器
如何用 Flutter 实现混合开发?闲鱼公开源代码实例
具有一定规模的 App 通常有一套成熟通用的基础库,尤其是阿里系 App,一般需要依赖很多体系内的基础库。那么使用 Flutter 重新从头开发 App 的成本和风险都较高。所以在 Native App 进行渐进式迁移是 Flutter 技术在现有 Native App 进行应用的稳健型方式。
13875 0