# @electron/remote 中文文档

规范地址：https://npmcn.com/package/%40electron/remote/

版本：2\.1\.4
npm 元数据更新时间：2026-11-02T17:11:54.296Z
中文译文更新时间：2026-11-13T11:58:04.777Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40electron/remote
原文对照：https://npmcn.com/package/%40electron/remote/?lang=original
项目主页：https://github.com/electron/remote#readme
源码仓库：https://github.com/electron/remote

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：73 kB，28 个文件
- 模块格式：CommonJS
- TypeScript 类型：包内自带
- 运行依赖：0 个
- peer 依赖：electron \>= 13\.0\.0
- 首次发布：2020-02-15T00:48:15.178Z
- 最新版本发布：2026-11-02T17:11:53.416Z
- 近 30 天下载量：730582（2026-10-14 至 2026-11-12，npm 官方下载统计）
- 已发布版本数：23（近 12 个月 1 个）

## 中文简介

[![Test](https://github.com/electron/remote/actions/workflows/test.yml/badge.svg)](https://github.com/electron/remote/actions/workflows/test.yml) \[![npm version](http://img.shields.io/npm/v/@electron/remote.svg)(https://npmjs.org/package/@electron/remote) (中文(简体) )

## 安装

```sh
npm install @electron/remote
```

也可以使用：`pnpm add @electron/remote`、`yarn add @electron/remote`、`bun add @electron/remote`

## README

# @ electron/ 远程

[![Test](https://github.com/electron/remote/actions/workflows/test.yml/badge.svg)](https://github.com/electron/remote/actions/workflows/test.yml) [![npm version](http://img.shields.io/npm/v/@electron/remote.svg)](https://npmjs.org/package/@electron/remote)

`@electron/remote` 是一个 [电子](https://electronjs.org/) 连接的模块 JavaScript对象从主要过程到渲染器过程. 这让你 访问仅主进程对象, 如它们在渲染器中可用 进程.

> ⚠️ **警告你们!** 这个模块 [许多微妙 陷阱](https://medium.com/@nornagon/electrons-remote-module-considered-harmful-70d69500f31)几乎总是有更好的方法 完成您的任务 。 譬如说, [`ipcRenderer.invoke`](https://www.electronjs.org/docs/latest/api/ipc-renderer#ipcrendererinvokechannel-args) 可以为许多常用案例服务.

`@electron/remote` 是内置的替换 `remote` 模块 被腐烂并最终被取出的电子.

## 从 `remote`

> **注:** `@electron/remote` 需要电能13或更高.

你要从内地迁出三件事 `remote` 模块改为 `@electron/remote`。 。 。 .

首先,你需要从国家预防机制安装:

```shell
$ npm install --save @electron/remote
```

第二,我们.., `@electron/remote/main` 主体必须初始化 工艺在从渲染器使用之前:

```javascript
// in the main process:
require('@electron/remote/main').initialize()
```

第三个, `require('electron').remote` 在渲染工艺中必须是 替换为 `require('@electron/remote')`。 。 。 .

```javascript
// in the renderer process:

// Before
const { BrowserWindow } = require('electron').remote

// After
const { BrowserWindow } = require('@electron/remote')
```

**说明:** 因为这需要通过 npm 而不是内置模块 模块,如果您正在使用 `remote` 从沙盒过程,你需要 适当配置您的捆绑器以包装 `@electron/remote` 在预装入脚本中。 当然, [使用 `@electron/remote` 造出沙盒来 效率低得多](https://medium.com/@nornagon/electrons-remote-module-considered-harmful-70d69500f31)。 。 。 .

**说明:** 单位 `electron >= 14.0.0`,您必须使用新的 `enable` API 启用每个想要的远程模块 `WebContents` 单独: `require("@electron/remote/main").enable(webContents)`。 。 。 .

单位 `electron < 14.0.0`, (中文(简体) ), `@electron/remote` 尊重 `enableRemoteModule` 网络首选项 数值。 你必须通过 `{ webPreferences: { enableRemoteModule: true } }` 改为 构造器 `BrowserWindow`s. 应获准使用 `@electron/remote`。 。 。 .

# API 参考

这个 `remote` 模块提供了进行进程间通信的简单方式 (IPC)介于渲染器过程(网页)和主过程之间.

在Electron中,图形用户界面相关模块(例如: `dialog`, (中文(简体) ), `menu` (例如)仅指 用于主要工艺,而非制造工艺。 为了使用它们 从渲染器工艺、 `ipc` 模块以发送进程间 向主进程发送信息。 与 `remote` 模块,您可以引用方法 在未明确发送进程间消息的情况下, 类似于 Java 的 [马绍尔群岛](https://en.wikipedia.org/wiki/Java_remote_method_invocation)中创建浏览器窗口的例子 渲染器工艺:

```javascript
const { BrowserWindow } = require('@electron/remote')
let win = new BrowserWindow({ width: 800, height: 600 })
win.loadURL('https://github.com')
```

要做到这一点,首先需要初始化主进程侧 远程模块:

```javascript
// in the main process:
require('@electron/remote/main').initialize()
```

**说明:** 单位 `electron >= 14.0.0` 任意远程模块默认已禁用 `WebContents` 实例并仅为指定的 `WebContents` 在明确呼叫后 `require("@electron/remote/main").enable(webContents)`。 。 。 .

单位 `electron < 14.0.0` 远程模块可以在下列情况下因安全原因被禁用:

-   [`BrowserWindow`](https://www.electronjs.org/docs/latest/api/browser-window) - 通过设置 `enableRemoteModule` 选项到 `false`。 。 。 .
-   [`<webview>`](https://www.electronjs.org/docs/latest/api/webview-tag) - 通过设置 `enableremotemodule` 属性为 `false`。 。 。 .

## 远程对象

返回的每个对象(包括函数) `remote` 模块代表 对象在主进程(我们称之为远程对象或远程函数). 当您引用远程对象的方法时, 请调用远程函数, 或者创建 带有远程构造器(函数)的新对象,您正在实际发送 同步进程间消息.

在上述例子中 `BrowserWindow` 财务报告和审定财务报表 `win` 被远程对象和 `new BrowserWindow` 没有创造 `BrowserWindow` 渲染器中的对象 进程。 相反,它创造了一个 `BrowserWindow` 主进程对象和 返回渲染器过程中相应的远程对象,即: `win` 对象.

**说明:** 仅 [可承担属性](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties) 出席者 当远程对象首先被引用时,可以通过远程访问.

**说明:** 组合和缓冲在 IPC 上复制,如果通过 `remote` 模块。 在渲染器过程中修改它们不会在主上修改它们 过程和反之亦然.

## 远程物体的寿命

电能保证只要在渲染器过程中的远程物体 生命(换言之,没有收集到垃圾),相应的对象 在主进程内不会发布。 当远程对象已经 收集的垃圾,主要过程中的相应对象将是 贬入.

如果远程对象在渲染器过程中被泄露(例如存储在地图上,但 永不释放),主过程中相应的对象也会被泄露出, 所以,你应该非常小心 不要泄露远程物体.

然而,像字符串和数字这样的主值类型是通过复制发送的.

## 向主要进程传递回调

主过程中的代码可以接受渲染器的回调——例如: 页:1 `remote` 模块 - 但使用此模块时应当非常小心 特性.

首先,为了避免陷入僵局,召回程序转移到主要进程 被称为同步。 你不应该期望主进程 获得通过回调的返回值.

例如,您不能使用一个来自渲染器进程的函数 `Array.map` 在主要进程中:

```javascript
// main process mapNumbers.js
exports.withRendererCallback = (mapper) => {
  return [1, 2, 3].map(mapper)
}

exports.withLocalCallback = () => {
  return [1, 2, 3].map(x => x + 1)
}
```

```javascript
// renderer process
const mapNumbers = require('@electron/remote').require('./mapNumbers')
const withRendererCb = mapNumbers.withRendererCallback(x => x + 1)
const withLocalCb = mapNumbers.withLocalCallback()

console.log(withRendererCb, withLocalCb)
// [undefined, undefined, undefined], [2, 3, 4]
```

如你所见,渲染器的回调同步值不是 ,而且没有匹配一个相同的回调值 在主要过程中.

第二,向主要进程发出的回调将持续到 收集垃圾.

例如,以下代码乍一看似乎是无辜的. 它安装一个 调用 `close` 远程对象上的事件 :

```javascript
require('@electron/remote').getCurrentWindow().on('close', () => {
  // window was closed...
})
```

但记住回调是按主进程引用的,直到你 明确解开它。 如果做不到的话,每次重新装入窗口时 将再次安装回调, 每次重新启动时会漏出一个回调 .

更糟糕的是,因为之前安装的回调的背景 在主要过程中,如果 `close` 事件已释放.

为了避免这个问题, 请确保您清理所有对渲染器召回的引用 传递到主进程。 这涉及清理事件处理者,或 \* 确保明确告知主要程序,以删除出现的回调 从一个正在退出的渲染器过程.

## 访问主进程内置模块

主要进程中的内置模块作为获取器添加于 `remote` 模块,这样您就可以像 `electron` 模块.

```javascript
const app = require('@electron/remote').app
console.log(app)
```

## 方法

这个 `remote` 模块有以下方法:

### `remote.require(module)`

-   `module` 字符串

回返 `any` - 物体由 `require(module)` 在主要过程中. 由相对路径指定的模块将相对于切入点解决 讨论主要进程.

譬如说.

```sh
project/
├── main
│   ├── foo.js
│   └── index.js
├── package.json
└── renderer
    └── index.js
```

```js
// main process: main/index.js
const { app } = require('@electron/remote')
app.whenReady().then(() => { /* ... */ })
```

```js
// some relative module: main/foo.js
module.exports = 'bar'
```

```js
// renderer process: renderer/index.js
const foo = require('@electron/remote').require('./foo') // bar
```

### `remote.getCurrentWindow()`

回返 `BrowserWindow` - 这个网页所属的窗口.

**说明:** 不使用 `removeAllListeners` 打开 `BrowserWindow`。使用此工具 删除全部 [`blur`](https://developer.mozilla.org/en-US/docs/Web/Events/blur) 听众, 禁用触摸栏按钮上的事件, 以及其他意外事件 后果.

### `remote.getCurrentWebContents()`

回返 `WebContents` - 这个网页的网页内容.

### `remote.getGlobal(name)`

-   `name` 字符串

回返 `any` - 全球变量: `name` (例如:. `global[name]`)主要为: 进程.

## 属性

### `remote.process` _只读_

A 类 `NodeJS.Process` 对象。 这个 `process` 对象。 这是相同的 `remote.getGlobal('process')` 但缓存.

# 覆盖已曝光物体

没有过滤, `@electron/remote` 将提供对 JavaScript 的访问 任何渲染器请求的对象。 为了控制可以访问的东西, `@electron/remote` 为应用程序提供返回自定义结果的机会 为其中任何 `getGlobal`, (中文(简体) ), `require`, (中文(简体) ), `getCurrentWindow`, (中文(简体) ), `getCurrentWebContents`, (中文(简体) ), 或任何内建模块属性.

以下事件将首先在 `app` 电子模块,以及 然后在具体 `WebContents` 它请求对象。 当发射时 页:1 `app` 模块,在 `Event` 对象将是 `WebContents` 请求的源头 如果有人打来电话 `preventDefault`,该请求将被拒绝。 如果有的话 `returnValue` 参数是: 在结果上设定,然后该数值将返回到渲染器,而不是 默认.

## 活动

### 事件: '远程要求'

回返情况:

-   `event` 活动
-   `moduleName` 字符串

何时出院 `remote.require()` 在 `webContents`。 。 。 . 通话 `event.preventDefault()` 将防止模块被返回. 自定义值可以通过设置返回 `event.returnValue`。 。 。 .

### 活动:“远取全球”

回返情况:

-   `event` 活动
-   `globalName` 字符串

何时出院 `remote.getGlobal()` 在 `webContents`。 。 。 . 通话 `event.preventDefault()` 将防止全球返回. 自定义值可以通过设置返回 `event.returnValue`。 。 。 .

### 活动:“远地建造”

回返情况:

-   `event` 活动
-   `moduleName` 字符串

何时出院 `remote.getBuiltin()` 在 `webContents`,包括当内建模块作为属性访问时(例如. `require("@electron/remote").BrowserWindow`) (中文(简体) ). 通话 `event.preventDefault()` 将防止模块被返回. 自定义值可以通过设置返回 `event.returnValue`。 。 。 .

### 活动: '远取- 当前窗口'

回返情况:

-   `event` 活动

何时出院 `remote.getCurrentWindow()` 在 `webContents`。 。 。 . 通话 `event.preventDefault()` 这将防止对象被返回. 自定义值可以通过设置返回 `event.returnValue`。 。 。 .

### 事件 : “ 远程获取当前网络内容 ”

回返情况:

-   `event` 活动

何时出院 `remote.getCurrentWebContents()` 在 `webContents`。 。 。 . 通话 `event.preventDefault()` 这将防止对象被返回. 自定义值可以通过设置返回 `event.returnValue`。 。 。 .

## 常见问题

### @electron/remote 是什么？

\[\(https://npmjs\.org/package/@electron/remote\) \(中文\(简体\) \)

### 如何安装 @electron/remote？

在项目目录运行 npm install @electron/remote，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：electron（\>= 13\.0\.0）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @electron/remote 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @electron/remote 支持 ESM 还是 CommonJS？

以 CommonJS 形式发布，可以直接 require\(\)；在 ES Module 项目中也可以用 import 引入（Node\.js 会把 module\.exports 作为默认导出）。

### @electron/remote 可以商用吗？

@electron/remote 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @electron/remote 的下载量有多少？

根据 npm 官方下载统计，@electron/remote 在 2026/10/14 – 2026/11/12 这 30 天内被下载 730,582 次，日均约 24,353 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @electron/remote 还在维护吗？

最新版本 2\.1\.4 发布于 2026/11/03（10 天前）；至今共发布 23 个版本，其中过去 12 个月发布了 1 个；首次发布于 2020/02/15。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

