vscode代码颜色是全白
vscode源码剖析_html/css
Electron 是基于 Node.js 和 Chromium 的跨平台桌面应用开发框架😪——🦔。使用 JavaScipt 😃🎫_——🦙🐌, HTML 🦂🦢——|🐈, CSS 真正将 Node.js 带到了前端🦕_|🤓。 Electron 通过 BrowserWindow 可以创建一个本地窗口*|🌸🐺,并加载一个 HTML 文档🤭🌥——-🤓🎮, BrowserWindow 中的内容就是一个浏览器窗口🐾☀️--🪁😆,不仅能创建 DOM 元素🐭|_🪴🤥,同时能使用任意的Node模块🐭😁|_😞😺,并且还可以通过 IPC 与主进程通讯🦍_🦠😀。
每一个 Electron 应用都对应一个主进程(main process)🎀——🤠, 主进程通过 BrowserWindow 创建的每个本地窗口对应一个渲染进程(renderer process)🃏——🧸。
vscode的主进程主要负责创建窗口和菜单🌎🌼——*👽,生命周期管理🐋🦅--🎗🦣,自动更新等与系统相关的功能🐬|🐲🦎。
绝大多数代码都是运行在渲染进程中的🐖||🐈🐺,渲染进程负责界面的显示🌤||🐸😔,响应用户操作🐜🐲——🦁。前面说到在浏览器中也可以使用Node模块🏈🦏——_😢🙊,渲染进程还通过Node创建了一个插件子进程🐭|-😹🦒,负责插件的初始化🍄|🐍。另外渲染进程还可以创建Worker执行一些复杂的计算💀-♟,比如markdown的解析🦛|🐟🌾。
每一个渲染进程同时也对应一个插件进程😹-|🌞🦣,插件运行在单独的进程不会对渲染进程造成影响🐗|🐳⛈,这也是vscode比atom要快的原因🐉|🐊🏓。Atom中插件是直接运行在渲染进程中的🤣——🦑🌲,所以当插件很多的时候会卡🪅__🐷。同时又由于vscode的插件运行在一个普通的Node进程中🦝|🌼,所以对UI的操作能力是比较弱的🪡🎏|-🎊,这点不及Atom😾🐹_-🐣。
VSCode Loader 是类似于 RequireJS 的一个异步加载模块( AMD )💐🍂——|🥅。所有的TypeScript源码都被编译成了使用AMD规范的js文件🎾🦢_-🌤,使用时通过这个loader加载🎁————🌘。
虽然主进程(Node进程)是使用CommonJS规范的🧨🦘——😳🐒,但是在浏览器中的代码加载是异步的😔🤬-——🦋,所以使用AMD是没有争议的🥌✨——🌪。在vscode中的一些核心代码🍃——🧨🐉,基本库都是用TypeScript编写的😣🐓_😶😜,也会被编译成AMD规范的js😚——🤠,这些基本代码也会被主进程用到😂🌵--🎄,所以主进程里面也用到了这个loader*😈-🐔😟。同理🎄😄|🥍,插件进程和Worker都会使用这个loader加载代码🎑🐟|😚🕹。
VSCode Loader不仅实现了类似RequireJS的 模块加载 功能🌻🤠|-🐌🌛,还附带几个插件可以加载css( css.js )和 文档 🐤-_🏐🪱,以及实现 多语言 🧸🐦——🥌🎍。
vscode的主要目录结构如下:
base包封装了大量API💀|——⛳🐜,实现常用功能😊🎮--🤨。在vscode中目录结构都是都是按照browser🐳🌱|🦂,common🐖🎳_——🎭,node🌗_🎽,electron的方式划分的😠🦉-_🐽🎋。
browser
browser中实现了一个简单的UI库🥈|🐃,包括 Button 🌱🦁——🦊😆, CheckBox 🌖😷——|🦒🦎, List 🦁__🤿🐨, Scrollbar 等常用组件⛈--🌳。并且封装了一套类似JQuery的DOM操作API(参见 dom.ts 和 builder.ts )😸|-🐿🐸。
common
common包中封装了大量实用工具类🤭🦊————⛅️*。如
另外还有很多其他的工具类🕷_😹🐏,每一个模块的耦合度都很低🎐🥊|-🥉🥌,基本都可以单独拿出来用😑🌳-🦡,学习起来也和容易🐝😱|☀️🦎。这里就不一一介绍了😒|——😋。
node
node包中封装了一些node实现的功能🦢——😡。如
parts
这个包额外定义了一些复杂的UI组件🦩-_🎉🥌,tree 和 quickopen🌹😨_|🦃🪢。
本篇主要了解vscode基本框架的结构😍|*,这两包作为编辑器功能的主要实现🦂🐯————🪅🌼,这里面的逻辑太复杂就不细说了🤢🥇-*🐗。
vscode中基本所有的具体功能实现代码都在这两包中🦉_🤢🐡。platform主要定义了一些服务的接口和简单实现☘️-🐜,workbench则实现了这些接口🎰🍂|😈,并且创建了一个工作台🦍_🪄,构建了一个完整界面结构🦦🐳||🤠。
下面从程序入口开始🥀🦃_——🎐🐂,从源码一步一步来看vscode是怎样运行起来的😄🎑——🤨。
Eletron通过 package.json 中的 main字段 来定义应用入口🐩🐵-——🌤。 main.js 是vscode的入口🎆😷——🦏🪀。
这个模块是一个壳☹️🐕|_🐟,主要解析多语言配置🐸——-*🤤,然后初始化loader🌿|👺,通过loader加载 main.ts 🐍🦡-_🎄🐸。
这里的 bootstrap-amd.js 负责创建一个loader😖_🎖,实现异步加载😼||🤑。
在 main.ts 中依赖一个 env 的模块
该模块负责命令行参数的解析🪀*————🦟,以及读取 package.json 和 product.json 保存软件的一些基本信息⭐️🐜_🪀🎣,主要变量如下🐖🐐-😬*:
在main.ts的main方法中🐽|😝🤿,初始化了主进程中的各个管理器
以上管理器中大量使用了Eletron的 ipc 模块发送接收渲染进程的消息🐒🦇|🐐🌺,来实现主进程和渲染进程的交互🐌|-🙁。
在main.ts的main方法的最后
调用了 windows 模块的 open 方法打开了第一个窗口🌟_|🦋。这里调用了 env.cliArgs 获取命令行参数传递给 open 方法来实现不同的打开方式🥏🌩_-🦄。
在 open 方法中创建一个了 VSCodeWindow 实例🐐|-🎾😹,并且通过 toConfiguration 方法创建了一个 IWindowConfiguration 的对象🌙-🌗*。
IWindowConfiguration 中定义了大量的 env 中的信息🦒|_🐁🙀,包括环境变量😾🌕——|🤥,命令行参数😜-——🐵🐥,软件信息等🦓🐐||🌻。在之后 IWindowConfiguration 会作为参数传递给 VSCodeWindow 的 load 方法🍃🏵_🪀🦌。
VSCodeWindow 包装了一个 BrowserWindow 对象🛷--😡。 load 方法调用 getUrl 加载了一个的 html文件 ✨|🦏🦕。
可以看到 IWindowConfiguration 被序列化成字符串作为参数传递给了 index.html 🦝😻——😑🐵。由于在浏览器进程要获取主进程中 env 模块的数据比较复杂(需要使用 ipc 通讯)🐀|-🐿。所以这里直接将一些基本信息打包成config传递给了浏览器进程*|🎨👿。这时浏览器窗口才正式打开并初始化🏑🐘_🐫🐨。
浏览器的入口在 index.html 中🪅_-🌚🦛。与主进程类似这里也对loader进行了初始化并加载浏览器主模块 main 🦐|——🥊。主要代码如下🦠🎑|_*🐫:
在 main 模块的 startup 方法中进一步加工 config 🥀🐸_|🌞🎭,并创建了一个 workspace 🦦🤥|-🐨。
这里的 environment 就是上文的 config 🦚_——🐍。 IWorkspace 记录了当前打开的文件夹路径等信息(当打开单文件时 IWorkspace 不存在)🌷😦————🌚。
在 openWorkbench 创建了三个基本服务(Service)🐋🌚_🐞,并将 config *|🌱🦚, workspace 等参数传给 WorkbenchShell 🏆——🐆。 WorkbenchShell 获取html文档的 body 节点准备创建界面🐘🦓-🧧👹。
WorkbenchShell 主要负责初始化各服务(Service)🍃🖼——-🪴🌍,并创建了一个 Workbench 完成界面的初始化工作👽🧿-——🦆🐖。
常用的Service比如
initInstantiationService 方法中创建了各个服务🌚|*,并返回 IInstantiationService 🐷——*。
在vscode中随处可见 IInstantiationService 的应用🎄——🦃🤢。以 CloseWindowAction 为例
在构造函数( constructor )中🤨——🎆,后面的参数写法比较特殊
使用了 @IWindowService 这种decorate语法🦣————🛷🪲。当要创建 CloseWindowAction 这个实例时🐐🌗——🐄♠,可以使用 IInstantiationService 只需要传入前两个参数😂🦙|🦖🐯,在 IInstantiationService 中能获取所有的其他服务对象*|_🦍, windowService 这个参数由 IInstantiationService 传入🧐🌗|🌵🍃。
WorkbenchShell 的 createContents 方法还创建了一个 Workbench 负责整个界面的创建⛈|😖🎈。
Workbench 是 IPartService 的具体实现🦇🐥——🌸*❄。vscode由多个Part组成🐈⬛🦒————🐄。
下面的代码展示了各个part的创建🏵|-🌟🍂,并添加到显示列表💮|_🌿。
vscode中几乎每个部分都是可扩展的🪅🦝|_♦🤑。例如最常见的有快捷键命令的注册🎗🐈——-🦏😱,编辑器类型的扩展🦟——🐲,扩展输出面板Channel🐍_🦋。下面以 ViewletRegistry 为例👻|🐞,分析 activitybar 和 sidebar 上面的 Explore 文件浏览器是如何显示的🌹||😒🪴。
通常情况下以 .contribution 结尾的模块😐--🪁👺,都用作扩展点的注册🙉|——🎄👻。由于一般情况下这些模块不会被其他模块依赖🌹————🎣,所以要提供一个入口来加载这些模块🎏-_🎊🐩,这个入口就是 workbench.main 😻⛳__🌧🦍。
其中 Explore 文件浏览器的注册是在 files.contribution 中定义的🐃🦡-😤🎆。
explorerViewlet 模块是 Explore 的界面显示入口🧧🌴|🦟。
platform 中定义了 IRegistry 接口及实现😣🦇_——👻🐏。
add 添加一个注册点🌪_|☁️🐅, as 方法获取一个注册点对象🌦🐬__🦃。
viewlet 模块添加了 ViewletRegistry 🦁_🌺🕸。
之后可以通过 Registry.as(Extensions.Viewlets) 获取 ViewletRegistry 注册不同的 Viewlet 🐷🌼_|🦥🎁。
所有的注册信息储存在 ViewletRegistry 中🐏——🎫🐁,使用时通过 getViewlet 或者 getViewlets 方法获取😢|🪶🍀。 activitybarPart 实现了注册点的读取😝🐦||🐒🐖,并填充 ActionBar 😶|🌵,显示出来🎇*——-🐄🦠。
类似的这种扩展点还有很多🐖——🌴,如:
这种通过注册扩展点的架构方式🥅😘_🎟🧐,使得vscode整体变得很容易扩展🥋🐡|_🌧。
vscode整体架构给人一种很清晰明了的感觉🏉🦗_😐。多进程从主进程到浏览器🕷__🤕,从浏览器到插件系统🏏🪡-😣🤯,服务驱动🌻🪲-🦤*,可扩展的结构🌲_-🥊。
另外无论是UI组件还是工具和加载器都是自身实现的☀️-|🐟,没有借助第三方模块👹😶_🐔🦁,使得耦合性和性能都得到了很好的保障🐇😈-_🦗。这也是vscode速度比Atom快的原因🌪🦤__🎊🐞。
尽管扩展vscode自身是很容易的🦁|*😢,但是目前vscode开放的插件接口还是极其有限*🤑_——🏈。由于为了保证渲染进程的安全和速度🦀_-🌸,插件是一个单独的Node进程🦗🥇_-🐩,插件进程无法创建UI🪄*——_*🍂,这一点使得vscode的插件开放没有Atom灵活🐡🦢|-🐍,很多需要借助UI的插件功能也无法实现🐚——🐇🐤。
微软大法好
Electron 是基于 Node.js 和 Chromium 的跨平台桌面应用开发框架😪——🦔。使用 JavaScipt 😃🎫_——🦙🐌, HTML 🦂🦢——|🐈, CSS 真正将 Node.js 带到了前端🦕_|🤓。 Electron 通过 BrowserWindow 可以创建一个本地窗口*|🌸🐺,并加载一个 HTML 文档🤭🌥——-🤓🎮, BrowserWindow 中的内容就是一个浏览器窗口🐾☀️--🪁😆,不仅能创建 DOM 元素🐭|_🪴🤥,同时能使用任意的Node模块🐭😁|_😞😺,并且还可以通过 IPC 与主进程通讯🦍_🦠😀。
每一个 Electron 应用都对应一个主进程(main process)🎀——🤠, 主进程通过 BrowserWindow 创建的每个本地窗口对应一个渲染进程(renderer process)🃏——🧸。
vscode的主进程主要负责创建窗口和菜单🌎🌼——*👽,生命周期管理🐋🦅--🎗🦣,自动更新等与系统相关的功能🐬|🐲🦎。
绝大多数代码都是运行在渲染进程中的🐖||🐈🐺,渲染进程负责界面的显示🌤||🐸😔,响应用户操作🐜🐲——🦁。前面说到在浏览器中也可以使用Node模块🏈🦏——_😢🙊,渲染进程还通过Node创建了一个插件子进程🐭|-😹🦒,负责插件的初始化🍄|🐍。另外渲染进程还可以创建Worker执行一些复杂的计算💀-♟,比如markdown的解析🦛|🐟🌾。
每一个渲染进程同时也对应一个插件进程😹-|🌞🦣,插件运行在单独的进程不会对渲染进程造成影响🐗|🐳⛈,这也是vscode比atom要快的原因🐉|🐊🏓。Atom中插件是直接运行在渲染进程中的🤣——🦑🌲,所以当插件很多的时候会卡🪅__🐷。同时又由于vscode的插件运行在一个普通的Node进程中🦝|🌼,所以对UI的操作能力是比较弱的🪡🎏|-🎊,这点不及Atom😾🐹_-🐣。
VSCode Loader 是类似于 RequireJS 的一个异步加载模块( AMD )💐🍂——|🥅。所有的TypeScript源码都被编译成了使用AMD规范的js文件🎾🦢_-🌤,使用时通过这个loader加载🎁————🌘。
虽然主进程(Node进程)是使用CommonJS规范的🧨🦘——😳🐒,但是在浏览器中的代码加载是异步的😔🤬-——🦋,所以使用AMD是没有争议的🥌✨——🌪。在vscode中的一些核心代码🍃——🧨🐉,基本库都是用TypeScript编写的😣🐓_😶😜,也会被编译成AMD规范的js😚——🤠,这些基本代码也会被主进程用到😂🌵--🎄,所以主进程里面也用到了这个loader*😈-🐔😟。同理🎄😄|🥍,插件进程和Worker都会使用这个loader加载代码🎑🐟|😚🕹。
VSCode Loader不仅实现了类似RequireJS的 模块加载 功能🌻🤠|-🐌🌛,还附带几个插件可以加载css( css.js )和 文档 🐤-_🏐🪱,以及实现 多语言 🧸🐦——🥌🎍。
vscode的主要目录结构如下:
base包封装了大量API💀|——⛳🐜,实现常用功能😊🎮--🤨。在vscode中目录结构都是都是按照browser🐳🌱|🦂,common🐖🎳_——🎭,node🌗_🎽,electron的方式划分的😠🦉-_🐽🎋。
browser
browser中实现了一个简单的UI库🥈|🐃,包括 Button 🌱🦁——🦊😆, CheckBox 🌖😷——|🦒🦎, List 🦁__🤿🐨, Scrollbar 等常用组件⛈--🌳。并且封装了一套类似JQuery的DOM操作API(参见 dom.ts 和 builder.ts )😸|-🐿🐸。
common
common包中封装了大量实用工具类🤭🦊————⛅️*。如
另外还有很多其他的工具类🕷_😹🐏,每一个模块的耦合度都很低🎐🥊|-🥉🥌,基本都可以单独拿出来用😑🌳-🦡,学习起来也和容易🐝😱|☀️🦎。这里就不一一介绍了😒|——😋。
node
node包中封装了一些node实现的功能🦢——😡。如
parts
这个包额外定义了一些复杂的UI组件🦩-_🎉🥌,tree 和 quickopen🌹😨_|🦃🪢。
本篇主要了解vscode基本框架的结构😍|*,这两包作为编辑器功能的主要实现🦂🐯————🪅🌼,这里面的逻辑太复杂就不细说了🤢🥇-*🐗。
vscode中基本所有的具体功能实现代码都在这两包中🦉_🤢🐡。platform主要定义了一些服务的接口和简单实现☘️-🐜,workbench则实现了这些接口🎰🍂|😈,并且创建了一个工作台🦍_🪄,构建了一个完整界面结构🦦🐳||🤠。
下面从程序入口开始🥀🦃_——🎐🐂,从源码一步一步来看vscode是怎样运行起来的😄🎑——🤨。
Eletron通过 package.json 中的 main字段 来定义应用入口🐩🐵-——🌤。 main.js 是vscode的入口🎆😷——🦏🪀。
这个模块是一个壳☹️🐕|_🐟,主要解析多语言配置🐸——-*🤤,然后初始化loader🌿|👺,通过loader加载 main.ts 🐍🦡-_🎄🐸。
这里的 bootstrap-amd.js 负责创建一个loader😖_🎖,实现异步加载😼||🤑。
在 main.ts 中依赖一个 env 的模块
该模块负责命令行参数的解析🪀*————🦟,以及读取 package.json 和 product.json 保存软件的一些基本信息⭐️🐜_🪀🎣,主要变量如下🐖🐐-😬*:
在main.ts的main方法中🐽|😝🤿,初始化了主进程中的各个管理器
以上管理器中大量使用了Eletron的 ipc 模块发送接收渲染进程的消息🐒🦇|🐐🌺,来实现主进程和渲染进程的交互🐌|-🙁。
在main.ts的main方法的最后
调用了 windows 模块的 open 方法打开了第一个窗口🌟_|🦋。这里调用了 env.cliArgs 获取命令行参数传递给 open 方法来实现不同的打开方式🥏🌩_-🦄。
在 open 方法中创建一个了 VSCodeWindow 实例🐐|-🎾😹,并且通过 toConfiguration 方法创建了一个 IWindowConfiguration 的对象🌙-🌗*。
IWindowConfiguration 中定义了大量的 env 中的信息🦒|_🐁🙀,包括环境变量😾🌕——|🤥,命令行参数😜-——🐵🐥,软件信息等🦓🐐||🌻。在之后 IWindowConfiguration 会作为参数传递给 VSCodeWindow 的 load 方法🍃🏵_🪀🦌。
VSCodeWindow 包装了一个 BrowserWindow 对象🛷--😡。 load 方法调用 getUrl 加载了一个的 html文件 ✨|🦏🦕。
可以看到 IWindowConfiguration 被序列化成字符串作为参数传递给了 index.html 🦝😻——😑🐵。由于在浏览器进程要获取主进程中 env 模块的数据比较复杂(需要使用 ipc 通讯)🐀|-🐿。所以这里直接将一些基本信息打包成config传递给了浏览器进程*|🎨👿。这时浏览器窗口才正式打开并初始化🏑🐘_🐫🐨。
浏览器的入口在 index.html 中🪅_-🌚🦛。与主进程类似这里也对loader进行了初始化并加载浏览器主模块 main 🦐|——🥊。主要代码如下🦠🎑|_*🐫:
在 main 模块的 startup 方法中进一步加工 config 🥀🐸_|🌞🎭,并创建了一个 workspace 🦦🤥|-🐨。
这里的 environment 就是上文的 config 🦚_——🐍。 IWorkspace 记录了当前打开的文件夹路径等信息(当打开单文件时 IWorkspace 不存在)🌷😦————🌚。
在 openWorkbench 创建了三个基本服务(Service)🐋🌚_🐞,并将 config *|🌱🦚, workspace 等参数传给 WorkbenchShell 🏆——🐆。 WorkbenchShell 获取html文档的 body 节点准备创建界面🐘🦓-🧧👹。
WorkbenchShell 主要负责初始化各服务(Service)🍃🖼——-🪴🌍,并创建了一个 Workbench 完成界面的初始化工作👽🧿-——🦆🐖。
常用的Service比如
initInstantiationService 方法中创建了各个服务🌚|*,并返回 IInstantiationService 🐷——*。
在vscode中随处可见 IInstantiationService 的应用🎄——🦃🤢。以 CloseWindowAction 为例
在构造函数( constructor )中🤨——🎆,后面的参数写法比较特殊
使用了 @IWindowService 这种decorate语法🦣————🛷🪲。当要创建 CloseWindowAction 这个实例时🐐🌗——🐄♠,可以使用 IInstantiationService 只需要传入前两个参数😂🦙|🦖🐯,在 IInstantiationService 中能获取所有的其他服务对象*|_🦍, windowService 这个参数由 IInstantiationService 传入🧐🌗|🌵🍃。
WorkbenchShell 的 createContents 方法还创建了一个 Workbench 负责整个界面的创建⛈|😖🎈。
Workbench 是 IPartService 的具体实现🦇🐥——🌸*❄。vscode由多个Part组成🐈⬛🦒————🐄。
下面的代码展示了各个part的创建🏵|-🌟🍂,并添加到显示列表💮|_🌿。
vscode中几乎每个部分都是可扩展的🪅🦝|_♦🤑。例如最常见的有快捷键命令的注册🎗🐈——-🦏😱,编辑器类型的扩展🦟——🐲,扩展输出面板Channel🐍_🦋。下面以 ViewletRegistry 为例👻|🐞,分析 activitybar 和 sidebar 上面的 Explore 文件浏览器是如何显示的🌹||😒🪴。
通常情况下以 .contribution 结尾的模块😐--🪁👺,都用作扩展点的注册🙉|——🎄👻。由于一般情况下这些模块不会被其他模块依赖🌹————🎣,所以要提供一个入口来加载这些模块🎏-_🎊🐩,这个入口就是 workbench.main 😻⛳__🌧🦍。
其中 Explore 文件浏览器的注册是在 files.contribution 中定义的🐃🦡-😤🎆。
explorerViewlet 模块是 Explore 的界面显示入口🧧🌴|🦟。
platform 中定义了 IRegistry 接口及实现😣🦇_——👻🐏。
add 添加一个注册点🌪_|☁️🐅, as 方法获取一个注册点对象🌦🐬__🦃。
viewlet 模块添加了 ViewletRegistry 🦁_🌺🕸。
之后可以通过 Registry.as(Extensions.Viewlets) 获取 ViewletRegistry 注册不同的 Viewlet 🐷🌼_|🦥🎁。
所有的注册信息储存在 ViewletRegistry 中🐏——🎫🐁,使用时通过 getViewlet 或者 getViewlets 方法获取😢|🪶🍀。 activitybarPart 实现了注册点的读取😝🐦||🐒🐖,并填充 ActionBar 😶|🌵,显示出来🎇*——-🐄🦠。
类似的这种扩展点还有很多🐖——🌴,如:
这种通过注册扩展点的架构方式🥅😘_🎟🧐,使得vscode整体变得很容易扩展🥋🐡|_🌧。
vscode整体架构给人一种很清晰明了的感觉🏉🦗_😐。多进程从主进程到浏览器🕷__🤕,从浏览器到插件系统🏏🪡-😣🤯,服务驱动🌻🪲-🦤*,可扩展的结构🌲_-🥊。
另外无论是UI组件还是工具和加载器都是自身实现的☀️-|🐟,没有借助第三方模块👹😶_🐔🦁,使得耦合性和性能都得到了很好的保障🐇😈-_🦗。这也是vscode速度比Atom快的原因🌪🦤__🎊🐞。
尽管扩展vscode自身是很容易的🦁|*😢,但是目前vscode开放的插件接口还是极其有限*🤑_——🏈。由于为了保证渲染进程的安全和速度🦀_-🌸,插件是一个单独的Node进程🦗🥇_-🐩,插件进程无法创建UI🪄*——_*🍂,这一点使得vscode的插件开放没有Atom灵活🐡🦢|-🐍,很多需要借助UI的插件功能也无法实现🐚——🐇🐤。
微软大法好
在 visual studio code编写代码中我们总会遇到代码乱🦇——🦢、格式不规范的问题🐕——_🦃🌗,要解决此类问题将vscode自动格式化代码🐹|-🌾🐜,需要安装插件并进行设置🦐-🌨🍀,具体操作如下🌑-|🐲。
1🌞🦍-🐅😢、首先在code中安装 Prettier -Code formatter(代码格式化程序)
2🧧🕊|🤬🌑、在菜单栏中打开设置
3👹||🐟😳、在搜索条搜索prettier 🦁🌤-🦑🎈,点击“ 在settings中编辑”栏目
4🤖🐥——🦍、添加一条保存时格式化代码的语句 "editor.formatOnSave": true
5🦀🦧——_💥、如果出现错误有可能是在上一条语句中的编写格式或者符号错误🦔__🦚,重现检查编辑即可🤪——|⚡️。
VSCode全称是Visual Studio Code🐺🐃|🦠,这是一款由微软开发且跨平台的免费源代码编辑器🏉_|🪀。该软件支持语法高亮🦡🦁|🌏😢、代码自动补全(又称 IntelliSense)🎖|🌕、代码重构🌜-☘️♦、查看定义功能🙈————*,并且内置了命令行工具和 Git 版本控制系统🌧_🦦🌚。用户可以更改主题和键盘快捷方式实现个性化设置🐰🦚——🐽,也可以通过内置的扩展程序商店安装扩展以拓展软件功能*_🕸🍂。
关于vscode如何自动格式化代码🌷🐁_🦖,我们就分享到这啦🦏🌘-——🌪!
vscode怎么运行代码 怎么操作
1🦌🤡-_🐙、我们打开了一个脚本文件,希望直接执行这个脚本文件,就可以打开命令面板,运行 “在活动终端中运行活动文件”(Run Active File In Active Terminal),这样这个脚本就会在当前打开的集成终端中运行了👻|——🐇。”
2🎗😴-🦢、我们也可以选中编辑器中的某段代码💐🥊-☘️🐕,然后打开命令面板🐋-🖼,运行“在活动终端中运行所选文本”(Run Selected Text In Active Terminal)😹😪-*🌱,这段代码就会在终端中执行🦠_🌛🤓。
vscode怎么运行代码1🐭🦩_-🐇*❄、我们打开了一个脚本文件,希望直接执行这个脚本文件,就可以打开命令面板,运行“在活动终端中运行活动文件”(RunActiveFileInActiveTerminal),这样这个脚本就会在当前打开的集成终端中运行了⛈🦅|🐿。”
2🎁|🦭🐃、我们也可以选中编辑器中的某段代码🐏-🦁,然后打开命令面板🎄_-🌛🎰,运行“在活动终端中运行所选文本”(RunSelectedTextInActiveTerminal)😮🦔_——🐸🦚,这段代码就会在终端中执行*🦡——😄🦕。
如何增强vscode中js代码提示功能这篇文章主要给大家介绍了如何增强vscode中js代码提示功能的相关资料🐋🥎-😥,文中通过示例代码介绍的非常详细😼-💐,对大家具有一定的参考学习价值🌚🐉|——🐪😺,需要的朋友们下面跟着小编一起来学习学习吧🐣_🎋😞。
使用 types 增强vscode中javascript代码提示功能
微软的vscode编辑器是开发typescript项目的不二首选💐🐩|-🤨🐕🦺,其本身也是采用typescript开发的😰🎀|_🌘😬。
使用过ts的同学都知道 *.d.ts 类型声明文件🌼||🎐😐,其管理工具😤🐱|_😿,从最初的 tsd,到后来的 typings,一直到现在的@types,类型声明文件为ts的智能提示🏉🦆————🐡🦡,类型检查提供了有力支持🌥🎋__*。
我们也可以使用类型声明文件😍🪰-🤯*,增强vscode编辑javascript时的智能提示😊😍|🐚🦩。
安装 types 文件
现在♟——🌻⛅️,我们可以不依赖typings直接使用npm安装所需要的types类型文件🌗🛷_——*。
比如🦣|🦉🌝,我们要安装sequelize的类型文件🦟🖼-🥋,可以直接使用💥——🐼🤗:
安装完成后🌾|🐀,我们在 node_modules目录下发现有一个@types目录🌿-|*,该目录里就是所安装的所有的类型声明文件🧩😔-——🌩*。
如果有的第三方npm包官方未提供类型声明文件时😣🦚|😇,可能会安装出错🦡——🌵,找不到相应的包🍄_|🎳。这时🌴——🐗🐉,就没法利用其增强js代码的提示功能🦛_|🐸。
如果你熟悉使用ts如何编写*.d.ts文件👹_-😂,也可以自己写一个🐯🐷——-🦅。
配置 jsconfig.json 文件
对于jsconfig.json文件的详细说明🥀-——🪱😯,请参照这里🙉🦇|🎾🌷。
在jsconfig.json文件中添加🐆😡|🦇🦁:
其中typeAcquisition参数是必配的🐵🦠-——🧐🌲,标识启用类型感知功能🐰🦎_🐱🐼,里面的include标识对哪个包启用☁️😺|☁️🐨。
上面的include不是必须的😡|_🦊,只是用来标识jsconfig.json文件对哪些文件起作用🐹_🤐😫。
开启后🐅🐅_|🐂,如图🏐🐰|-🐙🌴:
我们上图中例子提示的就是sequelize包中Model类的实例方法和属性😎🌵||🤿。
vscode对智能感知的图标🐝🐹|🧶🌞,也给了一定的汇总🙊-🦣😀:
在js文件中启用语义检查
如果要在js中启用类型检查*👻——_🦖😃,可以在文件最上面添加 // @ts-check 注释🙉🐄——🌴🏒。
或者在 jsconfig.json中进行配置🐚🙉_——🐦🦊: