Renderer Process 模块

  • clipboard
  • contextBridge
  • crashReporter
  • desktopCapturer
  • ipcRenderer
  • nativeImage
  • webFrame

clipboard

clipboard 模块能用于在系统剪贴板上执行复制和粘贴操作。

  • 文本字符串
  • HTML
  • 图片 Image
  • RTF
  • bookmark
  • Buffer

详细 API 参考:clipboard API

contextBridge

contextBridge 模块能用于在独立的上下文中创建一个安全、双向、同步的桥接器。

Main World 是主渲染器代码运行的 JavaScript 上下文。默认情况下,加载到渲染器中的页面将执行此处的代码。

Isolated World 当在 WebPreferences 中启动 contextIsolation,预加载脚本将在此处空间中运行,你可以在安全文档中阅读有关上下文隔离及其影响的更多信息。

// Preload(Isolated World)
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('electron', {
doThing: () => ipcRenderer.send('do-some-thing'),
myPromises: [Promise.resolve().Promise.reject(new Error('whoops'))],
anAsyncFunction: async () => 123,
data: {
myFlags: ['a', 'b', 'c'],
bootTime: 1234,
},
nestedAPI: {
evenDeeper: {
youCanDoThisAsMuchAsYouWant: {
fn: () => ({
returnData: 123,
}),
},
},
},
});
// Renderer(Main World)
window.electron.doThing();

暴露 Node 全局标记

预加载脚本可以使用 contextBridge 为渲染器提供对节点 API 的访问权限。上面描述的支持类型表也适用于通过 contextBridge 暴露的 Node API。请注意,许多节点 API 授予对本地系统资源的访问权。对于向不受信任的远程内容公开哪些全局和 API,要非常谨慎。

const { contextBridge } = require('eelectron');
const crypto = require('crypto');
contextBridge.exposeInMainWorld('nodeCrypto', {
sha256sum(data) {
const hash = crypto.createHash('sha256');
hash.update(data);
return hash.digest('hex');
},
});

crashReporter

crashReporter 模块用于向远程服务器提交奔溃报告。

const { crashReporter } = require('electron');
crashReporter.start({ submitURL: 'https://your-domain.com/url-to-submit' });

你可以使用以下项目接收崩溃报告:

或者使用第三方解决方案:

desktopCapturer

使用 ngvigator.mediaDevices.getUserMedia API 访问有关可用于从桌面捕捉音频和视频的媒体源的信息。

// In the renderer process.
const { desktopCapturer } = require('electron');
desktopCapturer.getSources({ types: ['window', 'screen'] }).then(async (sources) => {
for (const source of sources) {
if (source.name === 'Electron') {
try {
const stream = await navigator.mediaDevices.getUserMedia({
audio: false,
video: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: source.id,
minWidth: 1280,
maxWidth: 1280,
minHeight: 720,
maxHeight: 720,
},
},
});
handleStream(stream);
} catch (e) {
handleError(e);
}
return;
}
}
});
function handleStream(stream) {
const video = document.querySelector('video');
video.srcObject = stream;
video.onloadedmetadata = (e) => video.play();
}
function handleError(e) {
console.log(e);
}

ipcRenderer

ipcRenderer 模块是一个 EventEmitter,它提供了一些方法,因此你可以将同步和异步消息从呈现进程(网页)发送到主进程,还可以从主进程接收回复。

方法说明
ipcRenderer.on(channel, listener)监听 channel 频道,当有新消息到达 listener 时,会执行 listener(event, args...)
ipcRenderer.once(channel, listener)为事件添加一个一次性的 listener,只有在下一次将消息发送到通道时才会调用此 listener,然后将其删除
ipcRenderer.removeListener(channel, listener)从指定 channellistner 队列中删除指定的 listener
ipcRenderer.removeAllListeners(channel)移除指定 channel 所有 listener
ipcRenderer.send(chanel, ...args)通过 channel 向主进程发送异步消息并带上参数
ipcRenderer.invoke(channel, ...args)通过 channel 向主进程发送消息,并异步等待结果
ipcRenderer.sendSync(channel, ...args)通过 channel 向主进程发送消息,并同步等待结果
ipcRenderer.postMessage(channel, message, [transfer])通过 channel 向主进程发送消息,可以选择转移零个或多个 MessagePort 对象的所有权
ipcRenderer.sendTo(webContentsId, channel, ...args)通过 channel 向具有 webContentId 的窗口发送消息
ipcRenderer.sendToHost(channel, ...args)send 类似,但事件将发送到主页面的 <webview> 元素,而不是主进程

ipcRenderer.sendipcRenderer.invoke 方法发送消息携带的参数都将使用结构化克隆算法序列化,就像 window.postMessage 一样,所以原型链将不包括在内(发送 Function、Promise、Symbol、WeakMap 或 WeakSet 会引发异常)。

// Renderer Process
ipcRenderer.invoke('some-name', someArgument).then((result) => {
// do something
});
// Main Process
ipcMain.handle('some-name', async (event, someArgument) => {
const result = await doSomeWork(someArgument);
return result;
});

nativeImage

使用 PNG 或 JPG 文件创建 Tray、Dock 和应用程序图标。

webFrame

webFrame 用于自定义当前网页的呈现方式

const { webFrame } = require('electron');
webFrame.setZoomFactor(2);