来源:未知 时间:2022-11-02 10:14 作者:小飞侠 阅读:次
[导读] 前言: 今天带来electron中文入门教程第一篇,随着互联网发展,现在前端js已经覆盖到各个领域了,web端,移动端,服务器端,甚至是 客户端, 今天讲的electron就是其中利用JS做客户端的...
前言:今天带来electron中文入门教程第一篇,随着互联网发展,现在前端js已经覆盖到各个领域了,web端,移动端,服务器端,甚至是客户端,今天讲的electron就是其中利用JS做客户端的。 electron主要nodejs+chromemini内核打造的多兼容多平台的客户端框架,渲染层是html+css+js去写,而负责和PC交互的全交给了node去处理,主要兼容 windows, macos,linux。 快速入门:针对快速入门,官网已经提给了一套完整的讲解,按照官网的入门讲解:https://www.electronjs.org/zh/docs/latest/tutorial/quick-start 目前站长node版本 按照官网要求,安装完后,我们得到一个纯页面的客户端,类似下图:
app.whenReady().then(() => { createWindow() }) const createWindow = () => { const win = new BrowserWindow({ width: 800, height: 600 }) win.loadFile('index.html') // 利用本地渲染方法传入本地html文件路径(相对),也可以远程加载loadURL方法加载远程资源 } 预加载JS:在官网接下来教程我们看到了 preload.js 预加载JS,这里主要是封装一些和 前端html+js 交互的一些代码,可以理解为“注入”一些和客户端"node"交互的能力, 这里能力其实主要是利用ipc通信来交互的,纯前端进来的,可以把它理解为我们用到的 postMessage 类方法,但是没有 postMessage 那么局限性。 站长这里粘贴一些自己封装在 preload.js的方法并做出讲解,大家可以结合官网实例深入理解下。 // preload.js const { contextBridge, ipcRenderer } = require('electron'); // 通过预加载全局注入到渲染器事件 let ipcCallback = { // 添加页签 "addTab": (obj, fnName) => { ipcRenderer.send(fnName, obj) }, // 关闭页签 "delTab": (obj, fnName) => { ipcRenderer.send(fnName, obj) }, // 选中 "choiceTab": (obj, fnName) => { ipcRenderer.send(fnName, obj) }, } // 在预加载核心类里面,利用这个类将相关能力暴露给全局渲染层,因为涉及到安全问题,站长这里只是用到那些就暴露那些即可。 contextBridge.exposeInMainWorld('electronAPI', { desktop: true, setTitle: (title) => ipcRenderer.send('set-title', title), // ipc消息总入口 ipcSendMsg: (msg) => { console.log('ipcSendMsg - ', msg) // 合法过滤 if(msg.type && ipcCallback[msg.type]) { ipcCallback[msg.type](msg.obj, msg.type); } }, // 消息监听 handleCounter: (callback) => ipcRenderer.on('update-counter', callback) }); // 通过预加载全局注入到渲染器事件 - end 站长上面的预加载js主要封装了一些子创建事件,和客户端主进程通信,比如页面加载完毕后,改变页面标题,下图就是打开一页页签后,获取远程页面内容后改变页面标题,这里利用的 ipc通信将当前页面信息发送给主进程,然后交互通信改变样式。 再比如选中页签,删除页签,打开页签,都是通过了IPC通信,具体用法大家可以花点时间深入读取官网文档。 https://www.electronjs.org/zh/docs/latest/api/ipc-main 创建子窗口:这里创建子窗口是利用 electron 的 BrowserView 方法,代码如下:
2. 子窗口拿到后绑定给全局属性,方便以后使用。 如何创建子窗口?创建子窗口方法如下:主要思路是生成一个子窗口对应的hash值,先存起来,方便后面的增删改查,然后每次改变都通过IPC通信发给渲染层,结合上面的预加载方法,可以看到一个创建页签的闭环操作。 // 创建子窗口 createChildWin(winId, url) { console.log('winId, url', winId, url) // 不存在窗口 if(!winId || !this._childWinList[winId]) { let _winId = this.utils.getHashWinName(); let _win = null; this._childWinList[_winId] = _win = new BrowserView({ frame: true, // 无边框 modal: true }); // 打开开发工具 _win.webContents.openDevTools(); // setTimeout(() => { // this._mainWin.removeBrowserView(_win) // console.log('this._childWinList[_winId]') // }, 3000) // 获得网页标题 _win.webContents.on('dom-ready', (e) => { let winTitle = _win.webContents.getTitle(); // 主进程通信 this._mainWin.webContents.send('update-counter', { type: 'changeTabTitle', winId: _winId, title: winTitle }); }) // 窗口变化 _win.setAutoResize({ width: true, height: true, horizontal: true, vertical: true }); // this._mainWin.setBrowserView(this._childWinList[_winId]); this._mainWin.addBrowserView(this._childWinList[_winId]); let mainWinSize = this._mainWin.getContentSize(); this._childWinList[_winId].setBounds({ x: 0, y: Com.win.topBarHeight, width: mainWinSize[0], // Com.win.width, Com.win.height, height: mainWinSize[1] - Com.win.topBarHeight }); // 主进程通信 this._mainWin.webContents.send('update-counter', { type: 'addTabUi', winId: _winId, url: url }); // 设置地址 if(url.indexOf("http") > -1) { // 外网地址 this._childWinList[_winId].webContents.loadURL(url); } else { // 本地地址 this._childWinList[_winId].webContents.loadFile(url); } } }, 以上就是electron入门教程(1)入门教程全部内容,大家可以结合增加思路把删除思路,修改思路给加上。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com