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(无论是使用 import 还是 CommonJS 模块),这两个文件之间就没有共同的项目上下文。

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

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

jsconfig.json 的位置

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

jsconfig 设置

在更复杂的项目中,您可能会在工作区内定义多个jsconfig.json文件。这样做是为了确保一个项目中的代码不会作为IntelliSense建议给另一个项目中的代码。下面展示的是一个包含clientserver文件夹的项目,显示了两个独立的JavaScript项目。

多个jsconfig

示例

默认情况下,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 选项

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

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

Option Description
noLib Do not include the default library file (lib.d.ts)
target Specifies which default library (lib.d.ts) to use. The values are "ES3", "ES5", "ES6", "ES2015", "ES2016", "ES2017", "ES2018", "ES2019", "ES2020", "ES2021", "ES2022", "ES2023", "ESNext".
module Specifies the module system, when generating module code. The values are "AMD", "CommonJS", "ES2015", "ES2020", "ES2022", "ES6", "Node16", "NodeNext", "ESNext", "None", "System", "UMD".
moduleResolution Specifies how modules are resolved for imports. The values are "Node", "Classic", "Node16", "NodeNext", "Bundler".
checkJs Enable type checking on JavaScript files.
experimentalDecorators Enables experimental support for proposed ES decorators.
allowSyntheticDefaultImports Allow default imports from modules with no default export. This does not affect code emit, just type checking.
baseUrl Base directory to resolve non-relative module names.
paths Specify path mapping to be computed relative to baseUrl option.

您可以阅读更多关于可用的compilerOptionsTypeScript compilerOptions 文档中。

使用 webpack 别名

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

例如,对于别名 'ClientApp':

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

然后使用别名

import Something from 'ClientApp/foo';

最佳实践

尽可能排除不属于项目源代码的JavaScript文件所在的文件夹。

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

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

Component folder to exclude
node exclude the node_modules folder
webpack, webpack-dev-server exclude the content folder, for example dist.
bower exclude the bower_components folder
ember exclude the tmp and temp folders
jspm exclude the jspm_packages folder

当你的JavaScript项目变得太大且性能变慢时,通常是因为像node_modules这样的库文件夹。如果VS Code检测到你的项目变得太大,它会提示你编辑exclude列表。