升级@vue/tsconfig至0.5.1后vue-tsc报错,添加noEmit:false是否有弊端?
问题背景
把项目升级到最新版@vue/tsconfig(0.5.1版本)后,基于Vite+Vue3构建的项目执行vue-tsc命令时出现如下错误:
Referenced project 'd:/repos/project/tsconfig.node.json' may not disable emit
之前项目运行正常,给tsconfig.node.json添加"noEmit": false就能解决这个问题。错误根源是vue-tsc的破坏性变更:@vue/tsconfig/tsconfig.json默认设置了"noEmit": true,而项目的tsconfig继承了这个配置。
现在疑问是:给Vite专用的tsconfig.node.json添加"noEmit": false有没有弊端?(已知noEmit是用来告诉TypeScript编译时不生成JS文件、类型声明这类输出文件的)
项目根目录的简化配置如下:
tsconfig.json
{ "extends": "@vue/tsconfig/tsconfig.json", "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], "compilerOptions": { "baseUrl": ".", "paths": { "@/*": ["./src/*"] }, "noImplicitAny": false, "allowJs": true, "ignoreDeprecations": "5.0" }, "references": [ { "path": "./tsconfig.node.json" } ] }
tsconfig.node.json
{ "extends": "@vue/tsconfig/tsconfig.json", "include": ["vite.config.*", "vitest.config.*", "cypress.config.*", "playwright.config.*"], "compilerOptions": { "composite": true, "types": ["node"], "noEmit": false // 新增的配置 } }
解答
给tsconfig.node.json设置"noEmit": false没有实际弊端,理由如下:
tsconfig.node.json的作用是给Vite/Vitest等工具的配置文件做类型检查,这些配置文件本身是由Vite通过esbuild直接转译运行的,根本不需要TypeScript生成编译输出文件。- 虽然开启
noEmit: false后,理论上tsc会尝试生成输出,但这些配置文件体积很小,编译耗时可以忽略,而且实际开发中我们不会用到这些生成的文件。更关键的是,vue-tsc的核心作用是做Vue项目的类型检查和组件类型声明生成,它不会为tsconfig.node.json里的文件生成多余输出。 - 由于你的主
tsconfig.json通过references引用了tsconfig.node.json,而TypeScript的复合项目(composite: true)要求被引用的项目必须允许emit(否则无法生成增量编译所需的.tsbuildinfo文件),所以这里设置"noEmit": false是符合复合项目规范的,也是解决当前报错的正确方式。
简单说,这个配置只是为了满足vue-tsc和TypeScript复合项目的要求,不会给项目带来任何负面影响。
内容的提问来源于stack exchange,提问作者Scorix
相关产品推荐
相关产品推荐

