使用 NAPI 或者 Context Aware 在渲染进程中加载 native 模块
HumphreyDanRequiring Native Modules in the Renderer Process to be NAPI or Context Aware
当前在 electron 中加载 native 模块有些困难。比如编译 native 模块时,需要确保 NODE_MODULE_VERSION
版本正确。在同一个进程中加载多个 native 模块实例等问题。
之前官方团队实现了对 chromium 打 patch 的方案,却碰到了很多 tricky 的问题。现在随着 Node 12 Worker Threads 的发布,就可以轻松实现这个功能了。
其实 Node 团队在实现 Worker Thread 时也遇到了在多个 worker 线程中无法加载 native 模块的问题。他们的解决方案是提供了 Context Aware
的 native 模块方案。也就是 native 模块会告诉 Node, 他们可以被安全加载进多个 v8::Context
中,NAN 有个方便的宏 NAN_MODULE_WORKER_ENABLED
可以实现。
所以,Context Aware 模块和 NAPI 模块就可以在 node 中被多次实例化。
也就是说,任何想在渲染进程被加载的 native 模块必须得是 NAPI 或者 Context Aware.
计划时间线.
1、在 Electron6
添加 app.allowRendererProcessReuses
选项
2、在 Electron 7
对非 context-aware 的 native 模块开始提出弃用警告
3、在 Electron 8
对需要使用 app.allowRendererProcessReuses
默认值提出弃用警告
4、在 Electron 9
中切换 app.allowRendererProcessReuses
默认值为 true
5、在 Electron 10
中弃用切换 app.allowRendererProcessReuses
的能力
6、在 Electron 14
中移除切换 app.allowRendererProcessReuses
的能力