现已发布!阅读有关 11 月份的新功能和修复的信息。

jsconfig.json

什么是 jsconfig.json?

目录中存在 jsconfig.json 文件表示该目录是 JavaScript 项目的根目录。jsconfig.json 文件指定根文件和JavaScript 语言服务提供的功能的选项。

提示: 如果您不使用 JavaScript,则无需担心 jsconfig.json

提示: jsconfig.jsontsconfig.json 的后代,后者是 TypeScript 的配置文件。jsconfig.json 是将 "allowJs" 属性设置为 truetsconfig.json

为什么需要 jsconfig.json 文件?

Visual Studio Code 的 JavaScript 支持可以在两种不同的模式下运行

  • 文件范围 - 无 jsconfig.json:在此模式下,在 Visual Studio Code 中打开的 JavaScript 文件被视为独立的单元。只要文件 a.js 没有显式引用文件 b.ts(使用 importCommonJS 模块),则两个文件之间没有共同的项目上下文。

  • 显式项目 - 使用 jsconfig.json:JavaScript 项目是通过 jsconfig.json 文件定义的。目录中存在此类文件表示该目录是 JavaScript 项目的根目录。该文件本身可以选择列出属于该项目的文件、要从项目中排除的文件以及编译器选项(请参见下文)。

当您的工作区中有一个定义项目上下文的 jsconfig.json 文件时,JavaScript 体验会得到改善。因此,当您在新的工作区中打开 JavaScript 文件时,我们会提示您创建一个 jsconfig.json 文件。

jsconfig.json 的位置

我们通过创建一个 jsconfig.json 文件将代码的这一部分(我们网站的客户端)定义为 JavaScript 项目。将该文件放置在 JavaScript 代码的根目录中,如下所示。

jsconfig setup

在更复杂的项目中,您可能会在工作区中定义多个 jsconfig.json 文件。您会希望这样做,以便一个项目中的代码不会作为 IntelliSense 建议到另一个项目中的代码。下面是一个包含 clientserver 文件夹的项目示例,显示了两个单独的 JavaScript 项目。

multiple jsconfigs

示例

默认情况下,JavaScript 语言服务会分析并为您的 JavaScript 项目中的所有文件提供 IntelliSense。您需要指定要排除或包含哪些文件,以便提供正确的 IntelliSense。

使用 "exclude" 属性

exclude 属性(一个 glob 模式)告诉语言服务哪些文件不是您源代码的一部分。这使性能保持在较高水平。如果 IntelliSense 速度很慢,请将文件夹添加到您的 exclude 列表(如果 VS Code 检测到速度减慢,它会提示您执行此操作)。

{
  "compilerOptions": {
    "module": "CommonJS",
    "target": "ES6"
  },
  "exclude": ["node_modules"]
}

提示: 您需要 exclude 由构建过程生成的文件(例如,dist 目录)。这些文件会导致建议出现两次,并且会降低 IntelliSense 的速度。

使用 "include" 属性

或者,您可以使用 include 属性(一个 glob 模式)显式设置项目中的文件。如果不存在 include 属性,则默认包括包含目录和子目录中的所有文件。当指定 include 属性时,只包含这些文件。下面是一个带有显式 include 属性的示例。

{
  "compilerOptions": {
    "module": "CommonJS",
    "target": "ES6"
  },
  "include": ["src/**/*"]
}

提示: excludeinclude 中的文件路径相对于 jsconfig.json 的位置。

jsconfig 选项

以下是 jsconfig "compilerOptions" 用于配置 JavaScript 语言支持。

提示: 不要被 compilerOptions 混淆,因为 JavaScript 不需要实际编译。此属性的存在是因为 jsconfig.jsontsconfig.json 的后代,后者用于编译 TypeScript。

选项 描述
noLib 不包括默认库文件 (lib.d.ts)
target 指定要使用的默认库 (lib.d.ts)。这些值是 "ES3"、"ES5"、"ES6"、"ES2015"、"ES2016"、"ES2017"、"ES2018"、"ES2019"、"ES2020"、"ES2021"、"ES2022"、"ES2023"、"ESNext"。
module 指定生成模块代码时的模块系统。这些值是 "AMD"、"CommonJS"、"ES2015"、"ES2020"、"ES2022"、"ES6"、"Node16"、"NodeNext"、"ESNext"、"None"、"System"、"UMD"。
moduleResolution 指定如何解析导入的模块。这些值是 "Node"、"Classic"、"Node16"、"NodeNext"、"Bundler"。
checkJs 启用 JavaScript 文件的类型检查。
experimentalDecorators 启用对提议的 ES 修饰符的实验性支持。
allowSyntheticDefaultImports 允许从没有默认导出的模块进行默认导入。这不会影响代码发出,只会影响类型检查。
baseUrl 用于解析非相对模块名称的基本目录。
paths 指定相对于 baseUrl 选项计算的路径映射。

您可以在 TypeScript compilerOptions 文档中阅读有关可用 compilerOptions 的更多信息。

使用 webpack 别名

为了使 IntelliSense 与 webpack 别名一起使用,您需要使用 glob 模式指定 paths 键。

例如,对于别名“ClientApp”

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "ClientApp/*": ["./ClientApp/*"]
    }
  }
}

然后使用别名

import Something from 'ClientApp/foo';

最佳实践

只要有可能,您应该排除那些不属于您的项目源代码的 JavaScript 文件所在的文件夹。

提示: 如果您的工作区中没有 jsconfig.json 文件,VS Code 默认会排除 node_modules 文件夹。

下面是一个表格,将常见的项目组件映射到建议排除的安装文件夹。

组件 要排除的文件夹
node 排除 node_modules 文件夹
webpackwebpack-dev-server 排除内容文件夹,例如 dist
bower 排除 bower_components 文件夹
ember 排除 tmptemp 文件夹
jspm 排除 jspm_packages 文件夹

当您的 JavaScript 项目变得过于庞大并且性能下降时,通常是因为像 node_modules 这样的库文件夹。如果 VS Code 检测到您的项目变得过于庞大,它将提示您编辑 exclude 列表。