从零理解 tsconfig.json 和 tsconfig.node.json

974 阅读3分钟

前言

在日常的项目开发中,你是否也曾对项目里同时存在的 tsconfig.json 和 tsconfig.node.json 感到疑惑?别担心,今天就来深入浅出地剖析它们的作用与区别,让大家彻底搞懂这两个文件。

Image

一、tsconfig.json:TypeScript 的核心规则设定

tsconfig.json 是 TypeScript 编译过程中的关键配置文件,它为 TypeScript 编译器提供了项目代码编译的一系列规则指引。简单来说,它就像是 TypeScript 的“使用说明书”,规定了代码如何被理解和转换。

  • • 决定代码能否成功编译 :假如我们在代码中使用了像 optional chaining、import type 这类新语法,但 tsconfig.json 中未声明 "target": "ESNext",TypeScript 编译器就会因 “看不懂” 而报错。
  • • 影响智能提示功能 :当使用路径别名(如 @/utils/index.ts)时,若未在 tsconfig.json 配置相应的 "baseUrl" 和 "paths",VS Code 编辑器就会出现红线报错,无法提供准确的智能提示。
  • • 掌控类型检查的松紧度 :"strict": true 会使代码遵循更严格的规范,减少 any 类型的使用,避免潜在的空值问题;而关闭严格模式则相对宽松,容易放过一些潜在 bug。
  • • 保障团队代码规范一致性 :在一个多人协作的项目团队中,统一的 tsconfig.json 能确保每个成员都按照相同的校验标准编写代码,避免出现 “在自己电脑上没问题,到别人那却报错” 的尴尬情况。

一个典型的 tsconfig.json 配置示例如下:

{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "moduleResolution": "Node",
    "sourceMap": true,
    "jsx": "preserve",
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "declaration": false,
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    },
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noImplicitAny": true,
    "noImplicitThis": true,
    "allowJs": false,
    "checkJs": false,
    "outDir": "./dist",
    "incremental": true,
    "lib": ["ESNext", "DOM"]
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}

在 Vite 项目中,通常 tsconfig.json 会被自动加载,开发者只需根据具体需求对上述配置进行修改调整。

二、tsconfig.node.json:Node.js 环境下的专属配置

tsconfig.node.json 并非 TypeScript 官方强制规定的文件名,而是社区约定俗成的一种配置分离方式。它主要用于配置那些运行在 Node.js 环境中的 TypeScript 代码,例如 vite.config.ts(构建配置文件)、scripts/.ts(本地开发脚本)、server/.ts(若项目包含 Node 后端代码)等。

如果不设置 tsconfig.node.json,可能会出现一些问题。比如在编写一个脚本(如 scripts/generate-sitemap.ts)时,使用了 fs、path、url 等 Node 原生模块,但主 tsconfig.json 是针对浏览器环境的:

  • • 若主 tsconfig.json 设置了 "module": "ESNext",TypeScript 编译器可能不会生成适合 Node 环境的代码。
  • • 缺少 moduleResolution: "node" 会导致模块路径解析失败。

以下是一个常见的 tsconfig.node.json 配置:

{
  "compilerOptions": {
    "target": "ESNext",
    "module": "CommonJS",
    "moduleResolution": "Node",
    "strict": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "types": ["node"],
    "sourceMap": true,
    "incremental": true
  },
  "include": [
    "vite.config.ts",
    "scripts/**/*",
    "build/**/*"
  ],
  "exclude": [
    "node_modules",
    "dist"
  ]
}

三、两者的关键区别

  • • 目标运行环境不同 :tsconfig.json 主要面向浏览器环境,服务于前端代码;而 tsconfig.node.json 专注于 Node.js 环境,用于构建脚本、配置文件以及开发工具脚本等。
  • • 类型声明支持差异 :tsconfig.json 通常包含浏览器相关的类型声明,一般不包含 node 类型;tsconfig.node.json 则显式包含 node 类型,以支持 Node.js 原生模块的类型检查。
  • • 使用场景不同 :tsconfig.json 主要用于项目源码、页面组件、前端逻辑等方面;tsconfig.node.json 则应用于 vite.config.ts、开发工具脚本、构建相关逻辑等场景。
  • • 依赖项不同 :tsconfig.json 的典型依赖项是 Vue 类型(如 vue、@vue/runtime-dom)等前端相关依赖;tsconfig.node.json 的典型依赖项则是 Node.js 类型(如 fs、path)等。
  • • 文件存在必要性不同 :tsconfig.json 是 TypeScript 项目中基本必备的文件;而 tsconfig.node.json 并非必须存在,但推荐进行拆分使用,以便清晰划分职责。
  • • 与主配置的关联方式不同 :tsconfig.json 通常是项目的主配置文件;tsconfig.node.json 可通过 tsconfig.json 的 references 引用它,来建立关联关系。

总之,理解并合理配置 tsconfig.json 和 tsconfig.node.json,对于构建高效、规范的 TypeScript 项目具有重要意义。希望大家在开发过程中,能够根据项目实际需求,灵活运用这两个配置文件,充分发挥它们的优势。