深入浅出Electron:原理、工程与实践
上QQ阅读APP看书,第一时间看更新

2.6 不同进程不同的API

在Electron中主进程和渲染进程可以使用的API是不同的,比如app模块和ipcMain模块只能在主进程中使用,ipcRenderer和webFrame等模块只能在渲染进程使用,clipboard和desktopCapturer等模块可以在两个进程中使用,Electron是如何做到的呢?

细心的读者可能已经注意到了,上一小节讲解webpack对TypeScript文件进行转义时,生成的browser_init.js和renderer_init.js两个JavaScript文件就是为不同的进程提供服务的。

生成这两个文件所使用的输入信息是不同的,为生成browser_init.js提供输入信息的是auto_filenames.browser_bundle_deps编译变量,为生成renderer_init.js提供输入信息的是auto_filenames.renderer_bundle_deps编译变量。

我们以auto_filenames.renderer_bundle_deps为例,看一下这个编译变量对应的内容,在filenames.auto.gni文件中有这个编译变量的定义,它的值是一个TypeScript文件路径的数组,代码如下所示:

renderer_bundle_deps = [
  "lib/common/api/clipboard.ts",
  "lib/common/api/deprecate.ts",
  "lib/common/api/module-list.ts",
  "lib/common/api/shell.ts",
  "lib/common/define-properties.ts",
  "lib/common/init.ts",
  "lib/common/ipc-messages.ts",
  "lib/common/reset-search-paths.ts",
  "lib/common/type-utils.ts",
  "lib/common/web-view-events.ts",
  "lib/common/web-view-methods.ts",
  "lib/common/webpack-provider.ts",
  "lib/renderer/api/context-bridge.ts",
  "lib/renderer/api/crash-reporter.ts",
  "lib/renderer/api/desktop-capturer.ts",
  "lib/renderer/api/exports/electron.ts",
  "lib/renderer/api/ipc-renderer.ts",
  "lib/renderer/api/module-list.ts",
  "lib/renderer/api/native-image.ts",
  "lib/renderer/api/web-frame.ts",
  "lib/renderer/init.ts",
  "lib/renderer/inspector.ts",
  "lib/renderer/ipc-renderer-internal-utils.ts",
  "lib/renderer/ipc-renderer-internal.ts",
  "lib/renderer/security-warnings.ts",
  "lib/renderer/web-frame-init.ts",
  "lib/renderer/web-view/guest-view-internal.ts",
  "lib/renderer/web-view/web-view-attributes.ts",
  "lib/renderer/web-view/web-view-constants.ts",
  "lib/renderer/web-view/web-view-element.ts",
  "lib/renderer/web-view/web-view-impl.ts",
  "lib/renderer/web-view/web-view-init.ts",
  "lib/renderer/window-setup.ts",
  "package.json",
  "tsconfig.electron.json",
  "tsconfig.json",
  "typings/internal-ambient.d.ts",
  "typings/internal-electron.d.ts",
]

这个数组是不包含lib/browser/api/app.ts和lib/browser/ipc-main-impl.ts等文件的,但为主进程服务的browser_bundle_deps数组就包含这两个文件。

另外,这两个数组均包含lib/common/api/clipboard.ts和lib/renderer/api/desktop-capturer.ts等文件。

这就是有些Electron模块只有主进程可用,渲染进程不可用;有些只有渲染进程可用,主进程不可用;有些两个进程都可用的原因。