VScode启动流程
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启动流程相关推荐
- LIteOS学习笔记-7LiteOS启动流程与编译流程
LIteOS学习笔记-7LiteOS启动流程与编译流程 LiteOS启动流程 1. 启动方式 2. 启动流程 硬件初始化 内核初始化 调试串口初始化 尝试进行网络连接 启动任务调度 LiteOS编译流 ...
- Eclipse Theia 揭秘之启动流程篇
前言 在<Eclipse Theia 框架技术架构揭秘>一文中简单介绍了 Theia 框架整体的技术架构,接下来将通过系列文章从源码角度入手看一下 Theia 核心设计思路,本文从启动流程 ...
- 06_frpc启动流程
frpc 启动流程 背景 Go 语言的几个特性: 没有构造函数 一个文件就是一个模块 每个模块存在一个 func init(),初次调用模块时调用 fpr 整个代码的组织是比较清晰的,使用 ls 可以 ...
- 源码分析-Activity的启动流程
以android 6.0源码为参考,其他版本api会稍有不同 在Activity中,启动一个Activity的方法 @Override public void startActivity(Intent ...
- Centos 6启动流程详解
author:JevonWei 版权声明:原创作品 Centos6 启动流程 POST开机自检 当按下电源键后,会启动ROM芯片中的CMOS程序检查CPU.内存等硬件设备是否正常运行,CMOS中的程序 ...
- 2014.4新版uboot启动流程分析
原文 http://blog.csdn.net/skyflying2012/article/details/25804209 此处转载有稍作修改 最近开始接触uboot,现在需要将2014.4版本ub ...
- 解析并符号 读取dll_Spring IOC容器之XmlBeanFactory启动流程分析和源码解析
一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...
- leveldb源码分析:Open启动流程
leveldb概述 Leveldb 是一个持久化的KV存储系统,主要将大部分数据存储在磁盘上,在存储数据的过程中,根据记录的key值有序存储,当然使用者也可以自定义Key大小比较函数,一个leveld ...
- Nginx源码分析:启动流程
nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> nginx简介 Nginx的作为服务端软件,表现的主要特点是更快.高扩展.高可靠性.低内存消 ...
最新文章
- Akka2使用探索1(Remoting)
- 应用打包Ubuntu下部署ScriptCase应用一例
- java开启线程的方法_Java有几种方法开启线程?怎么实现带有返回值的线程?
- python知识:函数abs、delattr、hash、memeryview、index
- 手写一个简单的线程池MyThreadPool
- 获取当前日期时间并格式化 - 常见格式
- 解决pip2安装不成功的问题
- 拥抱开放,Serverless 时代的下一征程
- Hadoop报错 Failed to locate the winutils binary in the hadoop
- kubernetes视频教程笔记 (17)-Job和CronJob
- VB2010网络通信服务器
- 昂达obook11安装Linux,隐藏超大彩蛋!昂达oBook11居然支持手写笔?
- The Bean Validation API is on the classpath but no implementation could be found
- 这个充电宝不仅支持无线充,关键还小
- Markdown 中的表格合并单元格
- 腾讯云对象存储空间分片、断点续传功能的封装与使用
- 设计模式学习笔记(二十一:访问者模式)
- 限制Input只能输入汉字、数字
- 一个程序员的面试经历(一)
- Java规则引擎工作原理及其应用