vscode使用electron架构,入口点在package.json
中定义
说明入口文件在out/main.js,它对应的源文件在src/main.js,这两个文件是一样的(我也不知道原因,以后搞懂了再补充)。
现在看src/main.js
这里定义了app
这里对ready的事件监听,
//一旦准备就绪,就加载我们的代码
其中调用了onReady()函数,跟进查看,里面定义了startup()函数,后续会根据配置的不同用不同的参数调用这个startup,但只是不同方式的启动而已。
首先获取缓存文件目录地址和语言配置,然后调用startup
跟进startup
第185行代码调用amd的方式来加载vs/code/electron-main/main
模块,进入main process初始化流程。
这里是先加载vscode自己开源的AMD Loader https://github.com/Microsoft/vscode-loader/
然后使用这个loader去加载vscode的主入口文件
“快捷键command+p”搜索查看这个主入口文件
开头就导入了一个配置文件,先不管他
然后出现了一个CodeMain类
翻到最后,看到这里是主启动入口,先初始化主类,然后执行入口函数
我们再回头查看这个CodeMain类:
main方法中调用startup(args)
在main.ts的startup中会创建一个instantiationService
的实例服务。这个服务本身的实现类,通过import可以看到import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService';
然后初始化服务
接下来启动服务启动服务的这个方法中
这里是启动ipc的server,与render的进程进行互相通信。
然后实例服务创建CodeApplication并调用startup()。
这里的createInstance会返回一个app.ts中的类,然后调用src/vs/code/electron-main/app.ts
的startup()。点击startup()跟进到app.ts中。
在startup()
方法中
创建Electron IPC Server,用于主进程和渲染进程间通信
创建服务
创建了第一个窗口
openFirstWindow
中
接下来是open our first window,这里用if语句来判断不同情况,然后都是return调用了相同的方法windowsMainService.open()
跟进open()
方法进入到src/vs/platform/windows/electron-main/windows.ts
鼠标放到open()
方法上
可以看到open()方法是在IWindowsMainService
中,往上几行看IWindowsMainService
的定义
然后再根据createDecorator
的作用可以知道调用了同目录下的windowsMainService
,打开src/vs/platform/windows/electron-main/windowsMainService.ts
找到open()方法
往下看到了
这里调用doopen()
方法
再去看一下doopen()
方法的内容
这里多次调用了openInBrowserWindow()
跟进openInBrowserWindow()
看到这里创建了一个窗口
在这方法最后,返回了一个window
,由上图可知这是个CodeWindow
实例
那么现在跟进一下CodeWindow
看看里面到底有什么
可以看到这里定义了一个load()
方法
方法中有负责加载URL的部分
这里的loadURL()
是electron框架中的方法,这里不研究。getUrl()
则在下方代码有定义
查看getUrl()
方法
其返回的是configUrl
查看configUrl的定义
这里又调用了doGetUrl()
查看这个方法
HTML出现了,到此,VS Code中Electron的main process流程跟进完成。
至于判断语句中,到底是启动哪个文件,我目前也还是不太清楚。这两个文件html都是相同的,不同的就是js文件