核心内容摘要
Nodejs+vue+ElementUI的校园外卖平台express-mysql
TypeScript学习-
配置文件tsconfig.json上一章咱们用模块把代码拆得明明白白终于摆脱了“大杂烩”困境。
可一执行编译命令tsc又懵了编译后的JS文件跟TS源码混在一起看得眼花缭乱明明写的是ES6语法编译后却变成了老旧的ES3甚至有些测试文件、配置文件也被一并编译……这时候就需要tsconfig.json登场了它就像TS编译的“专属控制面板”能自定义编译目标、输出路径、文件范围等所有规则让编译行为完全按你的想法来。
今天咱们就手把手搞定这个“配置神器”从此告别编译混乱的尴尬。
配置文件生成一行命令搞定初始化刚开始写TS时很多人会手动创建tsconfig.json结果写错字段、漏写配置编译时各种玄学报错。
其实TS早就给咱们准备了“一键生成”命令自动创建包含所有核心配置的模板文件按需修改即可。
# 初始化tsconfig.json需先全局安装TypeScriptnpm install -g typescripttsc --init执行命令后项目根目录会生成一个满是注释的tsconfig.json文件里面包含了TS所有可配置项注释里详细说明了每个配置的作用咱们只需把需要的配置项注释解开修改对应值就行堪称“懒人福音”。
小提示如果项目中存在tsconfig.json执行tsc命令时TS会自动读取该文件的配置若想指定其他配置文件可使用tsc --project 配置文件路径简写tsc -p 路径。
核心配置项吃透compilerOptions与include/excludetsconfig.json的核心是compilerOptions编译选项和include/exclude文件范围控制前者管“怎么编译”后者管“编译哪些文件”二者组合就能覆盖绝大多数项目的需求。
compilerOptions编译行为的“核心控制台”这是配置文件中最关键的部分包含数十个配置项咱们挑最常用、最核心的几个来讲尤其是必开、必配的选项帮你避开90%的编译坑。
{compilerOptions:{//
编译目标ES版本必配把TS编译成对应版本的JStarget:ES6,// 可选值ES
ES
ES6/ES
ES2020等// 类比把“普通话”TS翻译成“方言”对应ES版本适配不同运行环境//
模块系统必配指定生成的模块类型module:ESNext,// 可选值CommonJS、ESNext、UMD等// 适配场景Node.js用CommonJS现代浏览器/框架用ESNext//
输出目录必配编译后的JS文件存放路径outDir:./dist,// 建议放在dist目录与源码隔离// 避坑不配置的话JS文件会和TS文件混在同一目录//
源码目录必配指定TS源码所在目录rootDir:./src,// 源码统一放在src目录编译时按该目录结构输出到outDir// 作用确保dist目录结构与src一致避免文件混乱//
严格模式必开开启所有类型安全校验规则strict:true,// 等价于开启strictNullChecks、noImplicitAny等所有严格规则// 重要性这是TS类型安全的核心不开等于白用TS//
ES模块互操作必开兼容CommonJS和ES模块esModuleInterop:true,// 解决import CommonJS模块如Node.js内置模块的报错问题// 场景导入jQuery、lodash等CommonJS模块时无需额外断言}}补充几个实用配置项按需添加strictNullChecks: true单独开启空值校验strict: true已包含禁止把null/undefined赋值给非空类型noImplicitAny: true禁止隐式any类型strict: true已包含强制所有变量、参数指定类型sourceMap: true生成SourceMap文件方便调试TS源码开发环境开启生产环境关闭resolveJsonModule: true允许导入.json文件并提供类型提示。
include/exclude精准控制编译文件范围默认情况下TS会编译项目根目录下所有.ts、.tsx文件但我们通常需要排除测试文件、配置文件、node_modules等这时候就靠include包含和exclude排除来控制。
{compilerOptions:{/* 省略编译选项 */},// 包含的文件只编译src目录下所有TS文件**表示所有子目录*表示所有文件include:[./src/**/*],// 排除的文件不编译node_modules、测试文件、dist目录exclude:[./node_modules,./src/**/*.test.ts,// 排除所有.test.ts测试文件./dist]}避坑提醒exclude仅对include包含的文件生效若文件不在include范围内即使不排除也不会被编译node_modules目录默认会被排除无需手动添加。
编译模式增量编译与监视模式日常开发中频繁手动执行tsc编译效率很低TS提供了两种高效编译模式大幅提升开发体验。
监视模式开发必备用tsc --watch简写tsc -w开启监视模式TS会实时监听src目录下的TS文件变化一旦文件保存自动触发编译无需手动执行命令。
# 开启监视模式实时编译文件tsc --watch开启后终端会显示编译状态文件修改后会自动重新编译报错信息也会实时更新开发时全程开启即可。
增量编译大型项目优化大型项目中TS文件数量多每次全量编译耗时久增量编译能只编译修改过的文件大幅缩短编译时间。
只需在compilerOptions中添加incremental: true即可。
{compilerOptions:{incremental:true,// 开启增量编译tsBuildInfoFile:./dist/.tsbuildinfo// 存储编译信息的文件下次编译时读取}}原理首次编译时TS会生成.tsbuildinfo文件记录每个文件的编译状态后续编译时仅对比文件变化只重新编译修改过的文件及依赖它的文件适合文件数量超过100个的大型项目。
实战按项目类型配置tsconfig.json不同项目React/Vue/Node.js的配置需求不同下面给出三种常见项目的实战配置直接复制修改即可使用。
React项目配置TSX语法{compilerOptions:{target:ES2020,module:ESNext,outDir:./dist,rootDir:./src,strict:true,esModuleInterop:true,jsx:react-jsx,// 支持React JSX语法React 17无需导入ReactmoduleResolution:NodeNext,// 适配现代Node.js模块解析sourceMap:true,resolveJsonModule:true,lib:[ES2020,DOM]// 引入ES2020语法和DOM API类型},include:[./src/**/*],exclude:[./node_modules,./src/**/*.test.tsx]}
Vue项目配置ViteTSVite项目默认会生成基础TS配置补充核心选项即可{compilerOptions:{target:ES2020,module:ESNext,outDir:./dist,rootDir:./src,strict:true,esModuleInterop:true,jsx:preserve,// Vue JSX语法支持moduleResolution:NodeNext,sourceMap:true,resolveJsonModule:true,lib:[ES2020,DOM],types:[vite/client,vue]// 引入Vite和Vue的类型声明},include:[./src/**/*,*.vue],exclude:[./node_modules]}
Node.js项目配置CommonJS模块{compilerOptions:{target:ES2020,module:CommonJS,// Node.js默认支持CommonJS模块outDir:./dist,rootDir:./src,strict:true,esModuleInterop:true,sourceMap:true,resolveJsonModule:true,lib:[ES2020]// Node.js项目无需DOM库},include:[./src/**/*],exclude:[./node_modules,./src/**/*.test.ts]}
避坑指南与深度
总结strict模式必开不犹豫很多人嫌严格模式麻烦关闭后TS变成“弱类型检查”各种空值、隐式any问题会隐藏到运行时得不偿失。
outDir与rootDir配套使用单独配置其中一个会导致文件路径混乱配套配置能确保编译后目录结构与源码一致。
esModuleInterop别漏开导入CommonJS模块时出现“类型不匹配”报错大概率是没开这个配置开启后即可解决。
不同环境配置区分开开发环境开启sourceMap、watch模式生产环境关闭sourceMap、开启增量编译可创建多个配置文件如tsconfig.dev.json、tsconfig.prod.json分别对应。
配置报错先查字段拼写TS对配置字段拼写敏感比如把“outDir”写成“outdir”会导致配置失效报错时先检查字段名。
最后
总结tsconfig.json不是“玄学配置”而是TS编译的“规则手册”——核心是通过compilerOptions定制编译行为用include/exclude控制文件范围搭配监视模式、增量编译提升开发效率。
不同项目的配置虽有差异但“strict: true”“esModuleInterop: true”等核心选项是通用的掌握这些就能根据项目需求灵活配置让TS编译完全按你的预期执行。