被问tsconfig.json 和 tsconfig.node.json 有什么作用,我懵了……

背景

事情是这样的,前几天在项目例会上,领导随口问了我我一个看似简单的问题:

"我们项目里有tsconfig.jsontsconfig.node.json ,它们有什么作用?"

活久见,我从来没注意过这个细节,我内心无语,问这种问题对项目有什么用!但机智的我还是回答上来了:不都是typescript的配置文件么。

领导肯定了我的回答,又继续问,那为什么项目中有两个配置文件呢?我机智的说,我理解的不深,领导您讲讲吧,我学习一下。

tsconfig.json 是干嘛的?

说白了,tsconfig.json 就是 告诉 TypeScript:我要用哪些规则来"看懂"和"检查"我写的代码。

你可以把它想象成 TypeScript 的"眼镜",没有它,TS 编译器就会"看不清楚"你的项目到底该怎么理解、怎么校验。

  • 影响代码能不能被正确编译

如果我们用了某些新语法(比如 optional chainingimport type),却没有在 tsconfig 里声明 "target": "ESNext",那 TypeScript 就会报错:看不懂!

  • 影响编辑器的智能提示

如果我们用了路径别名 @/utils/index.ts,但没有配置:

json 复制代码
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  }
}

那 VS Code 就会一直红线报错:"找不到模块"。

  • 影响类型检查的严格程度

比如 "strict": true 会让我们代码写得更规范,少写 any,避免"空值未处理"这类隐患;而关闭了就"宽松模式",你可能一不小心就放过了 bug。

  • 影响团队代码规范一致性

当多个成员一起开发时,统一 tsconfig.json 能让大家都用一样的校验标准,避免"我这边没问题你那边报错"的尴尬。

tsconfig.json文件的一个典型配置如下:

json 复制代码
{
  "compilerOptions": {
    // ECMAScript 的目标版本(决定生成的代码是 ES5 还是 ES6 等)
    "target": "ESNext",

    // 模块系统,这里用 ESNext 是为了支持 Vite 的现代打包机制
    "module": "ESNext",

    // 模块解析策略,Node 方式支持从 node_modules 中解析模块
    "moduleResolution": "Node",

    // 启用源映射,便于调试(ts -> js 映射)
    "sourceMap": true,

    // 启用 JSX 支持(如用于 Vue 的 TSX/JSX 语法)
    "jsx": "preserve",

    // 编译结果是否使用 ES 模块的导出语法(import/export)
    "esModuleInterop": true,

    // 允许默认导入非 ESModule 模块(兼容 CommonJS)
    "allowSyntheticDefaultImports": true,

    // 生成声明文件(一般用于库开发,可选)
    "declaration": false,

    // 设置项目根路径,配合 paths 使用
    "baseUrl": ".",

    // 路径别名配置,@ 代表 src 目录,方便引入模块
    "paths": {
      "@/*": ["src/*"]
    },

    // 开启严格模式(类型检查更严格,建议开启)
    "strict": true,

    // 不检查未使用的局部变量
    "noUnusedLocals": true,

    // 不检查未使用的函数参数
    "noUnusedParameters": true,

    // 禁止隐式的 any 类型(没有类型声明时报错)
    "noImplicitAny": true,

    // 禁止将 this 用在不合法的位置
    "noImplicitThis": true,

    // 允许在 JS 文件中使用 TypeScript(一般不建议)
    "allowJs": false,

    // 允许编译 JS 文件(如需使用 legacy 代码可开启)
    "checkJs": false,

    // 指定输出目录(Vite 会忽略它,一般不用)
    "outDir": "./dist",

    // 开启增量编译(提升大型项目编译效率)
    "incremental": true,

    // 类型定义自动引入的库(默认会包含 dom、esnext 等)
    "lib": ["ESNext", "DOM"]
  },
  // 指定编译包含的文件(推荐指定为 src)
  "include": ["src/**/*"],

  // 排除 node_modules 和构建输出目录
  "exclude": ["node_modules", "dist"]
}

Vite 项目中,一般 tsconfig.json 会被自动加载,所以只需要按需修改上述配置即可。

tsconfig.node.json 又是干嘛的?

tsconfig.node.json 并不是 TypeScript 官方强制的命名,而是一种 社区约定俗成 的分离配置方式。它用于配置运行在 Node.js 环境下的 TypeScript 代码,例如:

  • vite.config.ts(构建配置)
  • scripts/*.ts(一些本地开发脚本)
  • server/*.ts(如果你有 Node 后端)

tsconfig.node.json的一大作用就是针对业务代码和项目中的node代码做区分,划分职责。

如果不写tsconfig.node.json,会出现以下问题:

比如你写了一个脚本:scripts/generate-sitemap.ts,其中用到了 fspathurl 等 Node 原生模块,但主 tsconfig.json 是为浏览器服务的:

  • 设置了 "module": "ESNext",TypeScript 编译器可能不会生成符合 Node 环境要求的代码。
  • 缺少 moduleResolution: "node" 会导致路径解析失败。

常见配置内容:

ruby 复制代码
{
  "compilerOptions": {
    // 使用最新的 ECMAScript 特性
    "target": "ESNext",

    // 使用 CommonJS 模块系统,兼容 Node.js(也可根据项目设置为 ESNext)
    "module": "CommonJS",

    // 模块解析方式设置为 Node(支持 node_modules 和路径别名)
    "moduleResolution": "Node",

    // 启用严格模式,增加类型安全
    "strict": true,

    // 允许默认导入非 ESModule 的模块(如 import fs from 'fs')
    "esModuleInterop": true,

    // 支持 import type 等语法
    "allowSyntheticDefaultImports": true,

    // 添加 Node.js 类型定义
    "types": ["node"],

    // 源码映射(可选)
    "sourceMap": true,

    // 启用增量编译(加快重编译速度)
    "incremental": true
  },
  // 指定哪些文件纳入编译,通常包含 Node 环境下的脚本或配置文件
  "include": [
    "vite.config.ts",
    "scripts/**/*",
    "build/**/*"
  ],
  // 排除构建产物和依赖
  "exclude": [
    "node_modules",
    "dist"
  ]
}

两者区别

对比点 tsconfig.json tsconfig.node.json
目标环境 浏览器(前端代码) Node.js(构建脚本、配置文件)
类型声明支持 浏览器相关,通常不包含 node类型 显式包含 node类型
使用场景 项目源码、页面组件、前端逻辑 vite.config.ts、开发工具脚本、构建相关逻辑
典型依赖项 Vue 类型(如 vue, @vue/runtime-dom Node 类型(如 fs, path
是否必须存在 是,TypeScript 项目基本都要有 否,但推荐拆分使用以清晰职责
是否引用主配置 通常是主配置 可通过 tsconfig.jsonreferences引用它
相关推荐
雨汨14 分钟前
el-input限制输入数字,输入中文后数字校验失效
前端·javascript·vue.js
保持学习ing20 分钟前
帝可得- 人员管理
前端·vue.js·elementui
難釋懷21 分钟前
Vue全局事件总线
前端·javascript·vue.js
独立开阀者_FwtCoder35 分钟前
使用这个新的 ECMAScript 运算符告别 Try/Catch!
前端·javascript·github
云浪35 分钟前
让元素舞动!深度解密 CSS 旋转函数
前端·css
cdcdhj36 分钟前
vue中events选项与$on监听自定义事件他们的区别与不同,以及$emit与$on之间通信和mounted生命周期钩子函数有哪些作用和属性
前端·javascript·vue.js
Jinxiansen02111 小时前
Vue 3 弹出式计算器组件(源码 + 教程)
前端·javascript·vue.js
东京老树根1 小时前
SAP学习笔记 - 开发22 - 前端Fiori开发 数据绑定(Jason),Data Types(数据类型)
前端·笔记·学习
前端 贾公子1 小时前
手写 vue 源码 === runtime-dom 实现
前端·javascript·css
江城开朗的豌豆1 小时前
JavaScript篇:typeof 的魔法:原来你是这样判断类型的!
前端·javascript·面试