electron入门(16.0版本亲测可用)

Posted 冯心心爱吃肉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了electron入门(16.0版本亲测可用)相关的知识,希望对你有一定的参考价值。

根据业务需求,开始学习electron跨桌面应用框架。

记录~~~~~

创建一个electron项目

在node环境的支持下,新建文件夹

npm init -y 	//创建一个基础package
npm i electron		
npm i electron/remote		//由于新版本,需要使用这个package来使用remote模块

这样子,一个基础目录就准备好了,接下来需要准备一个主进程js文件和html主进程界面,并在main.js中写入:

const  app, BrowserWindow, ipcMain  = require('electron');

//主进程启动文件
app.on('ready',function()
    const mainWindow = new BrowserWindow(
        height:500,
        width:800,
        webPreferences:
            // 开启node
            nodeIntegration: true,
            contextIsolation: false,
            // 开启remote
            enableRemoteModule:true,
        
    );
    //主进程关闭,退出
    mainWindow.on('close',() => 
		if (process.platform != 'darwin') 
	        app.quit();
	    
	
)

开启后效果如图所示:

控制台是默认不显示的,通过以下命令可以开启当前进程的控制台:

mainWindow.webContents.openDevTools();

electron应用的热重载

每次修改完代码需要手动关闭再electron .很麻烦,可以通过安装electron-reloader包进行热重载,类似于webpack的devServer。

yarn add @electron-reloader		//安装

//在入口文件(主进程中)加入代码
try 
        require('electron-reloader')(module);
 catch (_)  

remote创建渲染进程

可以通过remote模块实现主进程下的渲染进程创建,如点击主进程的某个button开启一个新的进程,因此需要一个渲染进程的对应html、js文件。

main.js

const  app, BrowserWindow, ipcMain  = require('electron');

//主进程启动文件
app.on('ready',function()
    const mainWindow = new BrowserWindow(
        height:500,
        width:800,
        webPreferences:
            // 开启node
            nodeIntegration: true,
            contextIsolation: false,
            // 开启remote
            enableRemoteModule:true,
        
    );
    
    //引入remote进程模块
    require('@electron/remote/main').initialize()
	require('@electron/remote/main').enable(mainWindow.webContents)
	mainWindow.webContents.openDevTools();
	
    //主进程关闭,退出
    mainWindow.on('close',() => 
		if (process.platform != 'darwin') 
	        app.quit();
	    
	
)

render.js

const BrowserWindow = require('@electron/remote')
const ipcRenderer = require('electron')
const open_new = document.querySelector('span');


window.onload = function()
    open_new.onclick = ()=>
        var newBroswer = new BrowserWindow(
            width:400,
            height:400,
            webPreferences:
                // 开启node
                nodeIntegration: true,
                contextIsolation: false,
            
        );
        newBroswer.loadFile('render.html')
        newBroswer.webContents.openDevTools();
        newBroswer.on('close',function()
            newBroswer = null;
        )
    

最后将render.js渲染进程的脚本引入index.html(主进程的页面),就可以触发,效果如下:

主进程与渲染进程的通信

其实和vue/react的send,on很相似,进程也是相对应了其中的父子组件。
主进程借助了ipcMain模块;渲染进程借助了ipcRenderer模块,大体语法如下:

发送事件:

ipcMain/ipcRenderer.send(eventName, data)

接受事件:

ipcMain/ipcRenderer.on(eventName, ((event, avg) => 
	console.log(event)		//事件的对象信息
	console.log(avg)		//具体的传递数据
))

最常用的其实就是按钮点击或者进程加载进行发射和接受,整体代码如下:

main.js

const  app, BrowserWindow, ipcMain  = require('electron');

app.on('ready',function()
    const mainWindow = new BrowserWindow(
        height:500,
        width:800,
        webPreferences:
            // 开启node
            nodeIntegration: true,
            contextIsolation: false,
            // 开启remote
            enableRemoteModule:true,
        
    );

    require('@electron/remote/main').initialize()
    require('@electron/remote/main').enable(mainWindow.webContents)


    mainWindow.loadFile('index.html');
    mainWindow.webContents.openDevTools();

    //主进程接受事件
    ipcMain.on('childToMain', (event, arg) => 
    	//接受后的回复事件
        event.reply('replyChildToMain', '主进程给你回消息了')
        console.log( arg)
    )
    //主进程发射事件
    setTimeout(() => 
        mainWindow.webContents.send('mainToChild', '主进程给子进程发消息')
    , 3000)


)
// 当所有窗口被关闭了,退出。
app.on('window-all-closed', function() 
    if (process.platform != 'darwin') 
        app.quit();
    
);

render.js

const BrowserWindow = require('@electron/remote')
const ipcRenderer = require('electron')
const open_new = document.querySelector('span');


window.onload = function()
    //子进程发射事件
    ipcRenderer.send('childToMain', '子进程给父进程发消息')
    //子进程接受事件
    ipcRenderer.on('replyChildToMain', (event, arg) => 
        console.log(arg)
    )
    ipcRenderer.on('mainToChild', (event, arg) => 
        console.log(arg)
    )
    open_new.onclick = ()=>
        var newBroswer = new BrowserWindow(
            width:400,
            height:400,
            webPreferences:
                // 开启node
                nodeIntegration: true,
                contextIsolation: false,
            

        );

        newBroswer.loadFile('render.html')
        newBroswer.webContents.openDevTools();
        newBroswer.on('close',function()
            newBroswer = null;
        )
    

在渲染进程中点击button触发的发射事件:

render.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>渲染进程</h1>
    <button class = "sendBtn">发送消息给main进程</button>
<script>
    const ipcRenderer = require('electron')
    const sendBtn = document.querySelector('.sendBtn')
    sendBtn.onclick = () => 
        console.log(111)
        ipcRenderer.send('childToMain', '子进程通过按钮给父进程发消息')
    
</script>
</body>
</html>

自定义Menu菜单

通过引入electron中Menu函数解析模板可以自定义导航栏部分

const   Menu  = require('electron');
const Menus = [
    
        label:'Files',
        submenu:[
            
                label: '网页版',
                role: 'help',
                submenu: [
                    label: '网页版',
                    click: function () 
                        electron.shell.openExternal('https://www.jianshu.com/u/1699a0673cfe')
                    
                ]
            ,
            
                label: '帮助',
                role: 'help',
                submenu: [
                    label: '帮助文档',
                    click: function () 
                        electron.shell.openExternal('https://www.jianshu.com/u/1699a0673cfe')
                    
                ]
            
        ]
    
];
//编译Menu
const mainMenu = Menu.buildFromTemplate(Menus);
Menu.setApplicationMenu(mainMenu);

当然,也可以通过进程中的frame: false,隐藏窗体的导航栏,通过html自己写点击事件和导航栏模板。
在css中加入-webkit-app-region: drag;可以实现拖拽。

打开文件列表/消息弹窗

打开文件列表使用到了electron中Dialog函数,可以通过Dialog打开文件列表以及消息弹窗等等,与Antd/ElementUi的Dialog弹窗组件类似。

		dialog.showOpenDialog(
            //openFile 允许选择文件
            //openDirectory 允许选择文件夹
            //multiSelections 允许多选
            //showHiddenFiles  显示隐藏文件
            //createDirectory  允许创建文件夹
            properties: ["openFile", "multiSelections", "openDirectory", "showHiddenFiles", "createDirectory"]
        ).then(res => 
            console.log(res)
        )```




	

打开消息弹窗通常在关闭APP时会弹出一个二次确认的弹窗,可以在主进程的关闭事件中写入

mainWindow.on('close', () =>
        dialog.showMessageBox(
            title: '关闭',
            message: '是否要关闭?',
            type: 'warning',
            buttons: ["关闭", "取消"]
        ).then(res => 
            if(res.response === 1) 
                app.exit()
            
        )
    )

由于electron迭代更新比较快,网上的很多博客方法都已淘汰(集中于remote模块的使用和配置),因此在不适用旧版本的情况下以上是博主所总结出来的一份,感谢关注。

以上是关于electron入门(16.0版本亲测可用)的主要内容,如果未能解决你的问题,请参考以下文章

VMWARE里启动kylin16.0时出现'SMBus Host Controller not enabled'(还未进入系统)

tomcat跨域(亲测可用)

Axure RP 9版本最新版授权码和密钥 亲测可用

亲测可用!最火的Python语言开发工具!

windows系统完全卸载并重装Node(亲测可用)

开发工具-亲测可用Navicat_Premium_11.1.6版本下载(破解版)