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模块只有主进程可用,渲染进程不可用;有些只有渲染进程可用,主进程不可用;有些两个进程都可用的原因。