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

简介: electron入门全记录,亲测可用

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~

根据业务需求,开始学习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模块的使用和配置),因此在不适用旧版本的情况下以上是博主所总结出来的一份,感谢关注。

目录
相关文章
|
6月前
自动检查以确保依赖项始终与使用的electron版本相匹配的小技巧
自动检查以确保依赖项始终与使用的electron版本相匹配的小技巧
79 0
|
1天前
|
JSON JavaScript 前端开发
开发桌面程序-Electron入门
【10月更文挑战第16天】Electron 是一个使用 JavaScript、HTML 和 CSS 构建跨平台桌面应用的框架,嵌入了 Chromium 和 Node.js。本文介绍了如何搭建 Electron 开发环境,包括安装 Node.js、创建项目、配置 main.js 和打包应用。通过简单的步骤,你可以快速创建并运行一个基本的 Electron 应用程序。
开发桌面程序-Electron入门
|
存储 监控 JavaScript
如何治理 Electron 版本淘宝直播应用崩溃?
如何治理 Electron 版本淘宝直播应用崩溃?
11523 0
electron升级到20版本后,禁用第三方cookie、跨域问题解决方法
electron升级到20版本后,禁用第三方cookie、跨域问题解决方法
415 0
|
存储 监控 JavaScript
如何治理 Electron 版本淘宝直播应用崩溃?
经过几个月的努力,基于Electron框架开发的新版淘宝直播推流软件终于上线了。随之而来的就是线上用户反馈的各种问题,其中最影响用户体验的当属应用崩溃问题了。当应用程序出现未 catch 的异常时就会发生崩溃,本文介绍了客户端应用崩溃的处理流程。
980 0
如何治理 Electron 版本淘宝直播应用崩溃?
electron-vue升级electron到最新的版本后启动不起来,窗口一闪而过。
electron-vue 升级electron到最新的版本后启动不起来,窗口一闪而过。 排查后原因: electron-vue中的集成了很多库 单方面升级了 electron版本,导致了其他库的版本的不匹配 解决: 升级配套库的版本
339 0
|
前端开发 JavaScript
electron入门笔记(三)- 引入bootstrap
源码:https://github.com/sueRimn/electron-bootstrap 当引入jQuery和bootstrap文件时,会报错,原因是:electron 的 Renderer 端因为注入了 Node 环境,存在全局函数 require,导致jquery 内部环境判断出现问题。
2158 0
|
Web App开发 JavaScript 索引
Electron入门笔记(一)-自己快速搭建一个app demo
一.安装Node   1.从node官网下载 ,最好安装.msi后缀名的文件,新手可以查看安装教程进行安装。 2.然后cmd进入命令窗口,输入npm -v查看node当前版本, 二.创建文件并初始化   1.
2460 0
|
Web App开发
Electron入门笔记(二)-快速建立hello world
官方的文档我没有看懂,看了不少别人的博客和文章,终于慢慢看懂了如何快速的建立一个Electron app demo,前一篇文章不是使用官方快速搭建的,而且还出了小问题,所以去撸了一遍quick-start,发现很简单 一、安装Electron 1.
1071 0
|
3月前
|
JavaScript 开发工具
Electron 开发过程中主进程的无法看到 console.log 输出怎么办
Electron 开发过程中主进程的无法看到 console.log 输出怎么办