Visual Studio Code (简称 VSCode / VSC) 是一款免费开源的现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比 Diff、Git 等特性,支持插件扩展,并针对网页开放和云端应用开发做了优化。软件跨平台支持 Win、Mac 以及Linux,运行流畅,可谓是微软的良心之作……
当然,微软称 VS Code 并非完整版的 Visual Studio,它只是一款轻量级的代码编辑器,而不是一个重量级的完整 IDE (集成开发环境),它的竞争对手将会是 Sublime Text、Atom、VIM、Notepad++、EditPlus 等产品。
Visual Studio Code for Mac 软件截图
VS Code 的编辑器界面依然是微软经典的 VS 风格,对于常接触的人来说会很亲切。在编程语言和语法上支持 C++,PHP,Python,JavaScript,JSON,XML,Batch,F#,DockerFile,Coffee Script,Java,HandleBars,R,Objective-C,PowerShell,Luna,Visual Basic,Markdown,HTML,CSS,LESS,SASS,C#,TypeScript (支持情况)。
VSCode研发历程而谈起 Web IDE,没人能绕开 VSCode,它非常流行,同时又完全开源,总共 350000 行 TypeScript 代码的巨大工程,使用了 142 个开源库。市面上选择基于 VSCode 去修改定制的 IDE 比比皆是:Weex Studio、白鹭Egret Wing、快应用IDE...
我希望从 VSCode 身上看到什么?
- 大型复杂 GUI 软件(如 IDE 类)如何组织功能模块代码
- 如何使用 Electron 技术将 Web 软件桌面化
- 如何在打造插件化开放生态的同时保证软件整体质量与性能
- 如何打造一款好用的、流行的工具软件
- 2015-04 (4年前) 发布
- 2015-11 (发布之后半年)开源
- 2019-05 发布 VSCode Remote Development
团队负责人:Erich Gamma . JUnit 作者之一,《设计模式》作者之一, Eclipse 架构师。2011 加入微软,在瑞士苏黎世组建团队开发基于 web 技术的编辑器,也就是后来的 monaco-editor。VSCode 开发团队从 10 来个人开始,早期成员大多有 Eclipse 开发团队的背景。
”探索一种全新的和桌面 IDE 一样成功的在线开发工具模式“
伴随微软整个的开放开源跨平台风潮,Erich Gamma 敏锐的决定将产品从 Browser Based IDE 转向跨平台的 Desktop IDE,但仍然使用 Web 技术,于是 electron 完美契合,VSCode 团队花了六个月使用 Electron 将 Web 编辑器桌面化,又花了六个月将整个 IDE 插件化,最终 VSCode 成为一个流行的产品同时也成为一个典型的 Electron 客户端开源项目。
产品定位Erich Gamma 在 2017 SpringOne Platform 上有一个 关于 VSCode 的分享,讲解了在他开发 Eclipse 的过往经验基础上,对 VSCode 进行顶层设计时的诸多思路与决策,其中提到过对于 VSCode 的产品定位:
从图中可以看出 VSCode 定位是处于编辑器和 IDE 的中间并且偏向轻量编辑器一侧的。 VSCode 的核心是“编辑器 + 代码理解 + 调试“,围绕这个关键路径做深做透,其他东西非常克制,产品保持轻量与高性能。
点评: 生产力工具类的软件一定要守住主线,否则很可能会变成不收门票的游乐园 牛逼的产品背后一定有牛逼的团队,比如微软挖到 Anders Hejlsberg,接连创造了 C# 和 TypeScript 挖到 Erich Gamma,接连诞生了 monaco 和 vscode 这些明珠
二、Electron 是什么上文提到 VSCode 有一个特性是跨平台,它的跨平台实质是通过 electron 实现的。所以我们需要先简单了解下 electron
官方定义
- 使用 Web 技术来编写 UI,用 chrome 浏览器内核来运行
- 使用 NodeJS 来操作文件系统和发起网络请求
- 使用 NodeJS C++ Addon 去调用操作系统的 native API
- 1 个主进程:一个 Electron App 只会启动一个主进程,它会运行 package.json 的 main 字段指定的脚本
- N 个渲染进程:主进程代码可以调用 Chromium API 创建任意多个 web 页面,而 Chromium 本身是多进程架构,每个 web 页面都运行在属于它自己的渲染进程中
进程间通讯:
- Render 进程之间的通讯本质上和多个 Web 页面之间通讯没有差别,可以使用各种浏览器能力如 localStorage
- Render 进程与 Main 进程之间也可以通过 API 互相通讯 (ipcRenderer/ipcMain)
点评: 普通 web 页面无法调用 native api,因此缺少一些能力 electron 的 web 页面所处的 Render 进程可以将任务转发至运行在 NodeJS 环境的 Main 进程,从而实现 native API 这套架构大大扩展了 electron app 相比 web app 的能力丰富度 但同时又保留了 web 快捷流畅的开发体验,再加上 web 本身的跨平台优势 结合起来让 electron 成为性价比非常高的方案
三、VSCode 技术架构 多进程架构- 主进程:VSCode 的入口进程,负责一些类似窗口管理、进程间通信、自动更新等全局任务
- 渲染进程:负责一个 Web 页面的渲染
- 插件宿主进程:每个插件的代码都会运行在一个独属于自己的 NodeJS 环境的宿主进程中,插件不允许访问 UI
- Debug 进程:Debugger 相比普通插件做了特殊化
- Search 进程:搜索是一类计算密集型的任务,单开进程保证软件整体体验与性能