Vite转译TypeScript测试文件仅处理入口文件,TSC可完整转译的问题排查
我来帮你排查这个问题~核心原因是Vite和TSC的编译逻辑完全不同:TSC是直接按照tsconfig.json里的include规则遍历所有匹配的文件进行转译;而Vite(底层基于Rollup)是基于入口文件的依赖树来收集需要编译的文件,你当前的配置里Vite没识别到测试套件的其他文件是依赖,所以只处理了runTest.ts。
问题根源拆解
你看,runTest.ts里引用测试套件的路径写的是./suite/index.js——这是编译后的JS文件路径,但Vite打包的时候是处理TS源码,它没法识别到这个JS路径对应的TS源文件,自然不会把suite/index.ts和extension.test.ts纳入编译范围。而TSC不管依赖关系,只要在include里就转,所以能处理整个tests文件夹。
具体修复步骤
1. 修正runTest.ts的依赖引用
先把源码里的路径改成指向TS源文件,让Vite能识别到测试套件的依赖:
// runTest.ts // 原来的代码 // const extensionTestsPath = path.resolve(__dirname, './suite/index.js'); // 修改为下面的TS路径 const extensionTestsPath = path.resolve(__dirname, './suite/index.ts');
放心,等Vite打包完成后,
runTest.ts会变成dist/tests/runTest.js,此时__dirname指向dist/tests,而suite/index.ts也会被编译成dist/tests/suite/index.js,vscode-test会自动找到对应的JS文件运行。
2. 调整Vite Build配置,保留源码目录结构
在vite.config.ts的build.rollupOptions.output里加个preserveModulesRoot: '.',确保编译后的文件结构和源码一致,这样测试文件的路径不会乱:
// vite.config.ts export default defineConfig({ // ...其他原有配置 build: { target: 'esnext', minify: false, emptyOutDir: true, outDir: 'dist', // 和tsconfig的outDir保持一致 lib: { entry: [ resolve(__dirname, 'src/index.ts'), resolve(__dirname, 'tests/runTest.ts'), ], name: 'extension-name', fileName: '[name]', formats: ['cjs'], }, rollupOptions: { external: [ 'vscode', ...builtinModules, ...builtinModules.map((module) => `node:${module}`), ], output: { preserveModules: true, preserveModulesRoot: '.', // 关键:让输出结构和源码完全对应 }, }, }, // ...其他原有配置 });
3. 确认TSConfig配置一致性
不用改tsconfig.json,只要保持include里有./tests/**/*.ts就行,这样Vite在做类型检查的时候能覆盖到测试文件。另外,运行vite build时不用改noEmit: true,Vite会自己处理编译输出。
验证效果
执行vite build后,去dist/tests目录看看:应该能看到runTest.js、suite/index.js、suite/extension.test.js三个文件。然后运行node dist/tests/runTest.js,确认VSCode的集成测试能正常启动并跑起来。
额外小技巧:用Vitest直接跑单元测试
如果你还要写单元测试,不用提前编译,直接用Vitest就行。在vite.config.ts的test配置里加个匹配规则:
test: { coverage: { exclude: [...configDefaults.coverage.exclude ?? '', '**/src/parser/*'], }, include: ['tests/**/*.test.ts'], // 指定单元测试文件的匹配规则 },
之后执行vitest就能直接运行单元测试,Vitest会自动处理转译和依赖,和你的Vite开发环境完美适配~
备注:内容来源于stack exchange,提问作者Kalimah

