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文件

VScode启动流程相关推荐

  1. LIteOS学习笔记-7LiteOS启动流程与编译流程

    LIteOS学习笔记-7LiteOS启动流程与编译流程 LiteOS启动流程 1. 启动方式 2. 启动流程 硬件初始化 内核初始化 调试串口初始化 尝试进行网络连接 启动任务调度 LiteOS编译流 ...

  2. Eclipse Theia 揭秘之启动流程篇

    前言 在<Eclipse Theia 框架技术架构揭秘>一文中简单介绍了 Theia 框架整体的技术架构,接下来将通过系列文章从源码角度入手看一下 Theia 核心设计思路,本文从启动流程 ...

  3. 06_frpc启动流程

    frpc 启动流程 背景 Go 语言的几个特性: 没有构造函数 一个文件就是一个模块 每个模块存在一个 func init(),初次调用模块时调用 fpr 整个代码的组织是比较清晰的,使用 ls 可以 ...

  4. 源码分析-Activity的启动流程

    以android 6.0源码为参考,其他版本api会稍有不同 在Activity中,启动一个Activity的方法 @Override public void startActivity(Intent ...

  5. Centos 6启动流程详解

    author:JevonWei 版权声明:原创作品 Centos6 启动流程 POST开机自检 当按下电源键后,会启动ROM芯片中的CMOS程序检查CPU.内存等硬件设备是否正常运行,CMOS中的程序 ...

  6. 2014.4新版uboot启动流程分析

    原文 http://blog.csdn.net/skyflying2012/article/details/25804209 此处转载有稍作修改 最近开始接触uboot,现在需要将2014.4版本ub ...

  7. 解析并符号 读取dll_Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

    一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...

  8. leveldb源码分析:Open启动流程

    leveldb概述 Leveldb 是一个持久化的KV存储系统,主要将大部分数据存储在磁盘上,在存储数据的过程中,根据记录的key值有序存储,当然使用者也可以自定义Key大小比较函数,一个leveld ...

  9. Nginx源码分析:启动流程

    nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> nginx简介 Nginx的作为服务端软件,表现的主要特点是更快.高扩展.高可靠性.低内存消 ...

最新文章

  1. Akka2使用探索1(Remoting)
  2. 应用打包Ubuntu下部署ScriptCase应用一例
  3. java开启线程的方法_Java有几种方法开启线程?怎么实现带有返回值的线程?
  4. python知识:函数abs、delattr、hash、memeryview、index
  5. 手写一个简单的线程池MyThreadPool
  6. 获取当前日期时间并格式化 - 常见格式
  7. 解决pip2安装不成功的问题
  8. 拥抱开放,Serverless 时代的下一征程
  9. Hadoop报错 Failed to locate the winutils binary in the hadoop
  10. kubernetes视频教程笔记 (17)-Job和CronJob
  11. VB2010网络通信服务器
  12. 昂达obook11安装Linux,隐藏超大彩蛋!昂达oBook11居然支持手写笔?
  13. The Bean Validation API is on the classpath but no implementation could be found
  14. 这个充电宝不仅支持无线充,关键还小
  15. Markdown 中的表格合并单元格
  16. 腾讯云对象存储空间分片、断点续传功能的封装与使用
  17. 设计模式学习笔记(二十一:访问者模式)
  18. 限制Input只能输入汉字、数字
  19. 一个程序员的面试经历(一)
  20. Java规则引擎工作原理及其应用

热门文章

  1. TOP100summit:【分享实录】京东1小时送达的诞生之路
  2. 福建农林大学校赛(同步赛)
  3. Hive---DDL
  4. 51单片机基础——串口发送66,数码管显示66
  5. 第十一届蓝桥杯国赛题目
  6. 《JAVA: 学习导图》
  7. 企业微信自动添加手机好友工具
  8. python怎么打开h5文件_python怎么查看h5文件-问答-阿里云开发者社区-阿里云
  9. 面试题 - 头条、京东
  10. Emacs 安装配置使用教程