四时宝库

程序员的知识宝库

Electron渲染进程引入dialog问题(electron渲染进程和主进程通信)

场景:

最近开始学习electron,学到dialog后,一直卡着,无法实现API文档中的弹窗方法。经过半天百度和翻阅材料,终于找到解决方法。


问题描述

官网的dialog例子是这样的:

Bash
const { dialog } = require('electron')
console.log(dialog.showOpenDialog({ properties: ['openFile', 'multiSelections'] }))

如果你按照以上例子复制到渲染进程,100%会失败。该例子只能在主进程中使用。还是怪我自己,没有好好看文档。dialog文档第一句就写明了进程:主进程。而且渲染进程api文档没有记录写法,导致新手容易迷失>.<


原因分析:

其实关于该问题,我感觉最核心问题是官网文档没有较为友好的引导。
而且网上的解决方案普遍偏旧,我使用electron的版本是
v18.2.3


解决方案:

好了,言归正传,怎样才能在渲染进程中使用dialog呢?

  • 老文档方法,引用改为
Bash
const { dialog } = require('electron').remote
console.log(dialog.showOpenDialog({ properties: ['openFile', 'multiSelections'] }))

以上方法也是不行的。经过翻阅Electron文档,里面有一栏目References->重点更改,这里明确表明了在Electron 14中已经废弃了remote了,需要使用

Bash
//渲染进程
const { dialog } = require('@electron/remote')
//主进程引入
require('@electron/remote/main').initialize()

如果使用@electron/remote需要使用npm按照

Bash
npm install --save @electron/remote

经过以上方法,应该可以解决大部分人的问题了。很不幸,我就是大部分人之外。。。于是我接着翻阅各种资料,再在主程序配置了以下两个地方即可

  • main.js
Bash
function createWindow() {
    const mainWindow = new BrowserWindow({
        width: 600,
        height: 400,
        webPreferences: {
            preload: path.join(__dirname, 'preload.js'),
            nodeIntegration: true,
            contextIsolation: false,
            enableRemoteModule: true,//增加该配置,默认是false,新版本不能使用remote

        }
    })
    mainWindow.loadFile('index.html')

    //增加该配置
    require('@electron/remote/main').enable(mainWindow.webContents)

}

经过以上配置~应该可以顺利跑通dialog例子

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接