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

2.3 源码结构

学习2.3~2.13小节前,建议先下载Electron源码并按第10章的内容搭建好Electron源码调试环境,一边看书里的内容一边调试源码,学习效果更好;但这并不是必需的,如果读者仅仅是希望了解一下Electron的运行机制,那么并不需要对照源码学习。

Electron是一个大型的集成项目,我们没打算面面俱到地介绍它的内部细节,首先介绍一下Electron的源码结构,让读者对这个项目有一个宏观的认识,然后再以关键执行细节为切入点介绍Electron的内部构造。

Electron的源码仓储地址为:https://github.com/electron/electron,如下是Electron源码的目录结构及其对应的说明:

  • build:此目录放置构建Electron工程相关的脚本。
  • buildflags:此目录放置一些编译配置文件,可用于构建Electron工程时裁剪掉不必要的模块,比如pdf_viewer、color_chooser、spellchecker、dark_mode_window等。
  • chromium_src:此目录放置一部分从chrome项目中复制过来的代码。
  • default_app:Electron提供的默认应用,你下载的Electron模块的这个路径(node_modules\electron\dist\resources\default_app.asar)下的文件就是它编译的结果。我们打开一个空的Electron项目,默认情况下展示的界面也是这个default_app.asar呈现的,如图2-3所示。
034-1

图2-3 Electron默认窗口界面

  • docs:存放文档的目录,官网API及示例文档内容也是由此而来。
  • lib:此目录下存放了一系列的TypeScript文件,这些文件提供了开发者使用到的所有Electron的JavaScript API,比如app、ipcMain、screen等,也包含一些辅助性的API,比如asar、security-warnings等。然而绝大多数JavaScript API是需要原生支持才能完成其相应功能的,这些支持JavaScript API的原生C++代码被存放在shell目录下,后面会做详细介绍。
  • npm:此目录下存放Electron作为一个npm模块相关的代码,开发者安装的Electron模块(node_modules/electron),就是由这个路径下的内容生成的。
  • patches:此目录下存放了一系列的代码补丁文件,在编译Electron源码前,补丁工具会使用这些文件来修改Node.js、Chromium以及V8等项目的代码,以使这些项目能正常被Electron所集成。下面来看一段补丁代码:
035-1

Electron的编译脚本就是通过这种方式来修改其所依赖项目的源码的。

  • script:此目录下存放编译所需的工具脚本,上面所述的执行补丁文件的脚本也被存放在此目录下。
  • shell:此目录下存放了一系列的C++文件,这是Electron所有API的原生支持代码,子目录的结构也与lib目录一一对应。Electron的入口函数也存放在目录shell\app\electron_main.cc下,如果读者要分析Electron的源码,可以从这个文件开始。
// 为Windows平台定义的入口函数
int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int)
// 为Linux平台定义的入口函数
int main(int argc, char* argv[])
  • spec:此目录下存放渲染进程的测试代码。
  • spec-main:此目录下存放主进程的测试代码。
  • typings:此目录下存放TypeScript类型文件。