远程对象的生命周期

Electron 确保只要渲染进程中的远程对象一直存在(换句话说,没有被回收),主进程中的相应对象就不会被释放。 当远程对象被垃圾回收后,主进程中的相应对象将被解除引用。

如果远程对象在渲染进程中泄露(例如存储在映射中,但从未释放),则主进程中的相应对象也将被泄漏,所以您应该非常小心,不要泄漏远程对象。

但是,字符串和数字等主要值的类型是通过复制发送的。

将回调传递给主进程

remote

首先,为了避免死锁,传递给主进程的回调被异步调用。 您不应该期望主进程获得传递回调的返回值。

Array.map
  1. // 主进程 mapNumbers.js
  2. exports.withRendererCallback = (mapper) => {
  3. return [1, 2, 3].map(mapper)
  4. }
  5. exports.withLocalCallback = () => {
  6. return [1, 2, 3].map(x => x + 1)
  7. }
  1. // 渲染进程
  2. const mapNumbers = require('electron').remote.require('./mapNumbers')
  3. const withRendererCb = mapNumbers.withRendererCallback(x => x + 1)
  4. const withLocalCb = mapNumbers.withLocalCallback()
  5. console.log(withRendererCb, withLocalCb)
  6. // [undefined, undefined, undefined], [2, 3, 4]

如您所见,渲染器回调的同步返回值不是预期的,而且在主进程中也与相同回调的返回值不符。

其次,传递给主进程的回调将持续到主进程垃圾回收。

close
  1. require('electron').remote.getCurrentWindow().on('close', () => {
  2. // window was closed...
  3. })

但请记住, 回调是由主进程引用的, 直到你显式卸载它。 如果不这样做, 每次重新加载窗口时这个回调将再次被安装, 每次重启时都会泄漏一个回调。

close

为了避免这个问题,请确保清除对传递给主进程的渲染器回调的引用。 这涉及到清理事件处理程序, 或者确保主进程被明确告知取消引用来自正在退出的渲染程序的回调。

访问主进程中的内置模块

remoteelectron
  1. const app = require('electron').remote.app
  2. console.log(app)

方法

remote
remote.require(module)
module
anyrequire(module)

例如:

  1. project/
  2. ├── main
  3. │ ├── foo.js
  4. │ └── index.js
  5. ├── package.json
  6. └── renderer
  7. └── index.js
  1. // main process: main/index.js
  2. const { app } = require('electron')
  3. app.on('ready', () => { /* ... */ })
  1. // some relative module: main/foo.js
  2. module.exports = 'bar'
  1. // renderer process: renderer/index.js
  2. const foo = require('electron').remote.require('./foo') // bar
remote.getCurrentWindow()
BrowserWindow
BrowserWindowremoveAllListenersblur
remote.getCurrentWebContents()
WebContents
remote.getGlobal(name)
name
anynameglobal[name]

属性

remote.process
NodeJS.Processprocessremote.getGlobal('process')