前面我们介绍了 Visual Studio Code 各种基础能力,包括常用快捷键、全局配置(User Setting)等内容。我们还没怎么谈到插件、工程方面的运用。虽然现在 VSCode 已经支持多种语言,如 Python、PHP,甚至 Java、C/C++。但作为其最早支持的语言,也是我最喜欢的编程语言——JavaScript,尽管它的弱类型、动态类型等特性在以前是 IDE 的灾难,但是在 VSCode 里,这不再是问题。
jsconfig.json 文件
默认情况下,不需要我们做任何额外配置,VSCode 就已经为 Workspace 内的 js 文件提供了 JavaScript 方面的支持,包括 IntelliSense(智能提示)、Snippets(代码片段)、Debug(调试)、Format(格式化)、Validate(校验)等。但是在以下场景,我们就需要一个叫 jsconfig.json 的文件了:
- 一个 Workspace 中有多个工程,比如前端、后端工程。IntelliSense 应该以工程边界,而不要跨工程提示。
- 使用非相对路径方式的导入工程内的文件,如 import 'lib/util.js',而不是 import '../../lib/util.js'。 就像 package.json 表示所在目录是一个 NodeJS 工程,jsconfig.json 表明这个目录是一个 VSCode JavaScript 工程。当然,jsconfig.json 还有很多其他作用,善用它能够极大提升我们的开发效率。因此,即便 Workspace 本身就是一个工程,我们也要在它的根目录下提供这么一个文件。
IntelliSense 工程隔离
我们先来看看 jsconfig.json 带来的 IntelliSense 按工程隔离的特性。如下图所示,当前 Workspace 里有 frontend、backend 两个 Project。每个 Project 下都有一个 xxx_util.js,里面都包含了一个 isOdd 方法——注意,它们的注释不一样。
当我们在的 backend 工程下的 index.js 文件里输入 isO 时,IntelliSense 展示的是 backend 工程下的那个 isOdd方法(注释是 check number is an odd integer in backend),而不会提示 frontend 工程里的。
当我们继续按 Enter 或 Tab 键以确定后,IntelliSense 会在 index.js 文件的顶部自动加入 import { isOdd } from "./backend-util";。是不是很赞?对一个全栈开发或微前端开发者来说,往常多个工程同时打开导致 IntelliSense 里有重复项的烦恼就一去不复返了。
排除工具、中间代码
IntelliSense 工程隔离的问题解决了,接下来我们来看一个工程的内部。在一些比较复杂的工程里,可能包含很多非源代码(src)的目录,如 bin、test,还有编译后的 dist 目录等。默认情况下,这些目录下的 js 文件都会被 IntelliSense 解析,从而出现在源代码的提示里。这一方面会造成重复提示,另一方面也会严重拖慢 IntelliSense。一般我们都会把源代码放到 src 目录,所以我们只需要在 jsconfig.json 中增加配置 "include": [ "src/**/*.js" ]即可。
限定 ES 版本
除了源代码内的模块及其引用(Reference)可以被用于提示,VSCode 还内置了 ES、DOM、NodeJS 库的 API 引用,即 TypeScript 的 lib.d.ts 文件。当我们需要使用内置 API 的时候,IntelliSense 就能提示它们了。VSCode 还可以让我们配置要使用哪个版本的 lib.d.ts。如果用的是 node 10,则可以使用 es2018:
{ "compilerOptions": { "target": "es2018" } }
其他版本的 Node 对应的 ES 版本,可以在 https://node.green/ 这里查看。大体上如下:
NodeJS | compilerOptions.target 6 | es6 或 es2015 8 | es2016 10 | es2018
重载 Project
有些时候,VSCode IntelliSense 可能没起作用,比如新的函数没有出现在提示列表里。这个时候可以使用 JavaScript: Reload Project 命令,重新加载当前文件所在的 Project。如果还是不行,那就使用 Reload Window 命令——重启是能很多解决问题的。
接下来我们还要讲“非相对路径导入”、Click Through、ESLint 等各种特性或插件的使用。
關鍵字: JavaScript Workspace NodeJS