require 没有在带有 ipcRenderer.on 的 Electron-React-Webpack-Typescript 应用程序中定义

Posted

技术标签:

【中文标题】require 没有在带有 ipcRenderer.on 的 Electron-React-Webpack-Typescript 应用程序中定义【英文标题】:require is not defined in a Electron-React-Webpack-Typescript app with ipcRenderer.on 【发布时间】:2021-03-23 17:06:42 【问题描述】:

在 Electron-React-Webpack-Typescript 应用程序中,当插入 /src/renderer.ts 时,这些行:

ipcRenderer.on('messageFromMain', (event, message) => 
  console.log(`This is the message from the second window sent via main: $message`);
);

我收到此错误:

这是整个 /src/renderer.ts 文件:

import './app';

console.log('renderer.js is so happy to say you ???? hello....');

import  ipcRenderer, BrowserWindow  from 'electron';

ipcRenderer.on('messageFromMain', (event, message) => 
  console.log(`This is the message from the second window sent via main: $message`);
);

根据我在这里找到的://How to import the electron ipcRenderer in a react / webpack 2 setup,我还放入了 tools/webpack/webpack.plugins.js:

const webpack = require('webpack');

module.exports = [
  new ForkTsCheckerWebpackPlugin(),
 new webpack.ExternalsPlugin('commonjs', [
    'electron'
  ])
];

我尝试将renderer.ts中的electron作为窗口组件导入:

const electron = window.require('electron');

但是得到了:

window.require is not a function

应该是和electron、react和webpack的交互有关,但是我还没找到解决办法。

webPreferences: 
  nodeIntegration: true, // Changed 
  enableRemoteModule: false,
  contextIsolation: false, // Changed
  nodeIntegrationInWorker: false,
  nodeIntegrationInSubFrames: false,
  preload: MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY,
,

它不给require is not defined

在 renderer.ts 中插入时:

ipcRenderer.on('messageFromMain', (event, message) => 
  console.log(`This is the message from the second window sent via main: $message`);
);

我尝试在preload.js中导入ipcRenderer如下:

window.ipcRenderer = require('electron').ipcRenderer;

但我明白了

TS2339: Property 'ipcRenderer' does not exist on type 'Window & typeof globalThis'.
window.ipcRenderer = require('electron').ipcRenderer;
   |        ^^^^^^^^^^^

遵循这些迹象:https://github.com/electron/electron/issues/9920#issuecomment-672449613 我还在 preload.js 中处理了 ipcRenderer,如下所示:

import  ipcRenderer, IpcRenderer  from 'electron'

declare global 
  namespace NodeJS 
    interface Global 
      ipcRenderer: IpcRenderer
    
  


// Since we disabled nodeIntegration we can reintroduce
// needed node functionality here
process.once('loaded', () => 
  global.ipcRenderer = ipcRenderer
)

但是我在 renderer.ts 中遇到了同样的错误:

ERROR in src/renderer.ts:14:24
TS2304: Cannot find name 'ipcRenderer'.

所以.. 障碍可以表示为: 出于安全考虑如何保存

nodeIntegration:false,
contextIsolation: true,

并且能够同时在 renderer.ts 中导入 ipcRenderer? 必须有办法让 renderer.ts 和 main.ts 相互通信,同时尽可能保证环境安全。

【问题讨论】:

【参考方案1】:

是的。现在它似乎可以使用:

在 main.js 中

webPreferences: 
  nodeIntegration: false,
  enableRemoteModule: false,
  contextIsolation: true,
  nodeIntegrationInWorker: false,
  nodeIntegrationInSubFrames: false,
  preload: MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY,
,

preload.js:

import  ipcRenderer, contextBridge  from 'electron';

contextBridge.exposeInMainWorld(
  'electron',
  
    doThing: () => ipcRenderer.send('do-a-thing')
  
)

index.d.ts:

declare interface Window 
  electron: 
    doThing(): void
  

和 renderer.ts :

import './app';

console.log('renderer.js is so happy to say you ? hello....');

window.electron.doThing();

【讨论】:

以上是关于require 没有在带有 ipcRenderer.on 的 Electron-React-Webpack-Typescript 应用程序中定义的主要内容,如果未能解决你的问题,请参考以下文章

electron 中renderer.js中使用require('electron') 报错require is not defined

为啥我的 ipcMain 没有发送到 Electron 中的 ipcRenderer?

Electron 渲染进程主进程通信 02

如何在反应中导入 ipcRenderer?

07.electron-(渲染进程和主进程)通信

未调用一个渲染器进程/主窗口的多个 js 文件中的 ipcRenderer 侦听器