【架构相关】tsconfig.json 与 tsconfig.node.json、tsconfig.app.json 的关系和作用

现代 TypeScript 项目常见的多项目配置模式,特别适用于包含前端和 Node.js 工具链的全栈项目,会同时包含 tsconfig.json 与 tsconfig.node.json、tsconfig.app.json,你知道这是为什么吗?今天就简单介绍一下。

1. 关系说明

  • tsconfig.json 是 TypeScript 项目的根配置文件,常作为基础配置或入口配置,通过 references 字段关联其他子配置(如 tsconfig.node.json 和 tsconfig.app.json),实现多配置的统一管理。
  • tsconfig.app.json:用于应用程序代码的 TypeScript 配置,比如Vue 组件、浏览器环境
  • tsconfig.node.json:用于 Node.js 环境相关代码的 TypeScript 配置,如项目的构建脚本、服务端逻辑等

2. 各配置文件的作用

tsconfig.json(根配置):

作为项目的「总配置」,定义公共编译选项或通过 references 关联其他子配置,方便统一执行构建命令(如 tsc -b)。

  • 不包含具体编译文件("files": \[\])
  • 通过 references 字段建立项目引用关系
  • 支持项目分层构建和增量编译

tsconfig.app.json:

  • 配置应用前端代码的编译选项
  • 通常包括 Vue 组件、浏览器 API 相关代码等

tsconfig.node.json:

  • 配置 Node.js 环境下的代码编译选项
  • 通常包括构建脚本、工具函数等服务端代码

3. 为什么这么做?

  • 模块化管理:将不同环境的代码分开配置,便于维护
  • 增量编译:只重新编译发生变化的部分,提高构建效率
  • 类型检查隔离:不同环境使用不同的编译选项和库定义
  • 项目引用:支持跨项目引用和类型检查

**这种拆分的核心目的是:针对不同运行环境(Node.js vs 浏览器)的差异,配置不同的 TypeScript 编译规则,避免类型检查冲突。**这种结构让 TypeScript 能更精准地进行类型检查,同时保持配置的灵活性和可维护性。

下面附上一部分 tsconfig 的配置代码:

tsconfig.json

复制代码
{
  "files": [],
  "references": [
    { "path": "./tsconfig.app.json" },
    { "path": "./tsconfig.node.json" }
  ]
}

tsconfig.node.json

复制代码
{
  "compilerOptions": {
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
    "target": "ES2023",
    "lib": ["ES2023"],
    "module": "ESNext",
    "types": ["node"],
    "skipLibCheck": true,

    /* Bundler mode */
    "moduleResolution": "bundler", // 使用 bundler 模块解析策略
    "allowImportingTsExtensions": true,
    "verbatimModuleSyntax": true,
    "moduleDetection": "force",
    "noEmit": true,

    /* Linting */
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "erasableSyntaxOnly": true,
    "noFallthroughCasesInSwitch": true,
    "noUncheckedSideEffectImports": true
  },
  "include": ["vite.config.ts"]
}

tsconfig.app.json

复制代码
{
  "extends": "@vue/tsconfig/tsconfig.dom.json",
  "compilerOptions": {
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
    "types": ["vite/client"],

    /* Linting */
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "erasableSyntaxOnly": true,
    "noFallthroughCasesInSwitch": true,
    "noUncheckedSideEffectImports": true
  },
  "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
}
相关推荐
小天源12 小时前
智叟云集系统架构解析:从品牌 AI 可见度监测到前后端协同
人工智能·react.js·系统架构·node.js·react·ai监测·ai品牌监测
工具派16 小时前
JSON转Excel后18位订单号不对了?数字精度与类型边界实测
json·excel
阿皮 API17 小时前
Shopee虾皮商品详情API接口调用实战:Python获取东南亚商品数据与JSON解析
开发语言·python·json
死磕音视频18 小时前
让大模型稳定输出 JSON:结构化输出的三种方法与 Python 校验实践
json·大模型api·pydantic·结构化输出
今天的砖头有点烫手啊19 小时前
Java 序列化到底怎么选?从 Serializable 到 Protobuf 的演进与选型
java·json
小白学鸿蒙19 小时前
OpenHarmony 预置应用配置详解:/system/etc/app/ 下的 5 个 JSON
json·openharmony·预置应用
用户61227166502420 小时前
电费 9 毛/天:我让一台 9 年前的旧 MacBook 替我上班,它比入门云服务器还能打
node.js
for_ever_love__20 小时前
LangChain 结构化输出:让模型稳定吐出符合 schema 的 JSON
langchain·json
健康活着就好20 小时前
# 手写Promise.all和Promise.race,面试再也不怕了
面试·json
PegasusYu20 小时前
Node.js使用nedb轻量级数据库测试脚本
数据库·electron·node.js·脚本·测试·轻量级·nedb