被问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引用它
相关推荐
gnip1 小时前
js上下文
前端·javascript
中草药z1 小时前
【Stream API】高效简化集合处理
java·前端·javascript·stream·parallelstream·并行流
不知名raver(学python版)2 小时前
npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR!
前端·npm·node.js
醉方休2 小时前
React中使用DDD(领域驱动设计)
前端·react.js·前端框架
excel2 小时前
📖 小说网站的预导航实战:link 预加载 + fetch + 前进后退全支持
前端
学习3人组2 小时前
React 样式隔离核心方法和最佳实践
前端·react.js·前端框架
世伟爱吗喽2 小时前
threejs入门学习日记
前端·javascript·three.js
朝阳5812 小时前
用 Rust + Actix-Web 打造“Hello, WebSocket!”——从握手到回声,只需 50 行代码
前端·websocket·rust
F2E_Zhangmo2 小时前
基于cornerstone3D的dicom影像浏览器 第五章 在Displayer四个角落显示信息
开发语言·前端·javascript