首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >电子工控机与nodeIntegration

电子工控机与nodeIntegration
EN

Stack Overflow用户
提问于 2018-09-08 15:17:38
回答 1查看 16.2K关注 0票数 43

因此,我遵循了许多指南,建立Webpack,电子,并作出反应,制作一个桌面应用程序。在完成设置之后,我开始工作,并了解到我需要从主和呈现程序中获得一个IPC机制才能进行通信。

import {ipcRenderer} from "electron";将此添加到我的renderer.js文件中将导致错误Uncaught ReferenceError: require is not defined

在将我的问题告诉一些同事之后,有人建议在我的main.js文件中更改

代码语言:javascript
运行
复制
webPreferences: {
    nodeIntegration: false,
}

代码语言:javascript
运行
复制
webPreferences: {
    nodeIntegration: true,
}

我在谷歌上读到的每一个地方都清楚地说过,如果你关心的是安全问题,这不是你应该做的事情。然而,我所能找到的电子ipc的每一个资源都使用了ipcRenderer。

现在,互联网上的每一个例子都有巨大的安全缺陷,还是我在这里遗漏了一些关键部分?

我的问题如下。

  1. 可以在不启用ipcRenderer的情况下使用nodeIntegration吗?
  2. 如果是的话,我怎么做,为什么这么多的资源会排除这些信息?
  3. 如果不是,我该用什么呢?

如果我问错了问题,或者我漏掉了什么,或者我问这个问题的方式还有其他明显的问题,请告诉我,否则提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-08-26 10:37:11

  1. 可以在不启用ipcRenderer的情况下使用nodeIntegration吗?

这是可能的,但要谨慎。它可以通过使用preload脚本来完成。

  1. 如果是的话,我怎么做,为什么这么多的资源会排除这些信息?

可以使用preload脚本,如下所示。然而,,这是 不安全。大多数现有文档都没有显示最佳安全实践。

然后给出了一个更安全的例子。

代码语言:javascript
运行
复制
// preload.js
const electron = require('electron');

process.once('loaded', () => {
  global.ipcRenderer = electron.ipcRenderer;
});
代码语言:javascript
运行
复制
// main.js
const {app, BrowserWindow} = require('electron');

app.on('ready', () => {
  // Create the browser window.
  win = new BrowserWindow({
      backgroundColor: '#fff', // always set a bg color to enable font antialiasing!
      webPreferences: {
        preload: path.join(__dirname, './preload.js'),
        nodeIntegration: false,
        enableRemoteModule: false,
        // contextIsolation: true,
        // nativeWindowOpen: true,
        // sandbox: true,
      }
  });
  win.loadURL(`file://${path.join(__dirname, 'index.html')}`);

注意到,预加载脚本的路径必须是绝对的,这在使用webpack/babel时也会变得复杂,因为输出文件可能是不同的路径。

  1. 如果不是,我该用什么呢?

正如@Yannic所指出的,编辑指出,现在还有电子支持的另一种选择,称为contextBridge__。这个新的选择可能会更简单地解决这个问题。有关contextBridge__的信息,请查看电子文档:https://www.electronjs.org/docs/tutorial/context-isolation

然而,即使使用contextBridge ,也不应该尝试公开整个电子API,这只是您为应用程序设计的一个有限的API。

如前所述,尽管如上文所示,可以使用ipcRenderer,但当前的电子安全建议也建议启用contextIsolation。这将使上述方法无法使用,因为您不能再将数据添加到全局范围。

最安全的建议是使用addEventListenerpostMessage,并使用预加载脚本作为呈现器和主脚本之间的桥梁。

代码语言:javascript
运行
复制
// preload.js
const { ipcRenderer } = require('electron');

process.once('loaded', () => {
  window.addEventListener('message', event => {
    // do something with custom event
    const message = event.data;

    if (message.myTypeField === 'my-custom-message') {
      ipcRenderer.send('custom-message', message);
    }
  });
});
代码语言:javascript
运行
复制
// main.js
const {app, ipcMain, BrowserWindow} = require('electron');

app.on('ready', () => {
  ipcMain.on('custom-message', (event, message) => {
    console.log('got an IPC message', e, message);
  });

  // Create the browser window.
  win = new BrowserWindow({
      backgroundColor: '#fff', // always set a bg color to enable font antialiasing!
      webPreferences: {
        preload: path.join(__dirname, './preload.js'),
        nodeIntegration: false,
        enableRemoteModule: false,
        contextIsolation: true,
        sandbox: true,
        // nativeWindowOpen: true,
      }
  });
  win.loadURL(`file://${path.join(__dirname, 'index.html')}`);
代码语言:javascript
运行
复制
// renderer.js
window.postMessage({
  myTypeField: 'my-custom-message',
  someData: 123,
});
票数 45
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52236641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档