node.js - 你可以在 Typescript Compiler API 中引入排除/包含选项吗?
问题描述
我正在尝试使用 Typescript API 进行一些自定义编译(使用插件等)。
使用命令行编译时,typescript 会自动考虑不仅编译器选项,还包括excludes
键,以及types
键(以及其他内容)。
Typescript API 文档几乎不存在,但我尝试手动进行深度搜索并将这些文件从传递给该createProgram
方法的总文件列表中排除。然而,这对我们的构建性能造成了影响,我认为 Typescript 编译器有一个更有效的解决方案。
这是我的compile.ts
文件中的内容。
import ts from 'typescript';
import keysTransformer from 'ts-transformer-keys/transformer';
import tsConfig from './tsconfig.json';
import fs from 'fs';
const deepFindTsFiles = (dir: string, fileList?: string[]) => {
dir = dir.endsWith('/') ? dir : dir + '/'
const files = fs.readdirSync(dir);
fileList = fileList || [];
files.forEach((file) => {
console.log('file', dir + file);
console.log(tsConfig.exclude.includes(dir + file));
if (fs.statSync(dir + file).isDirectory() && !tsConfig.exclude.includes(dir + file)) {
fileList = deepFindTsFiles(dir + file + '/', fileList);
}
else if (!tsConfig.exclude.includes(dir + file) && file.split('.')[1].includes('ts')) {
fileList!.push(dir + file);
}
});
return fileList;
};
const fileList = deepFindTsFiles(tsConfig.compilerOptions.rootDir);
// the compiler options parsed from tsconfig.json
const { options } = ts.parseJsonConfigFileContent(
tsConfig,
ts.sys,
__dirname
);
// createProgram doesn't seem to have an option for excludes/includes/types
const program = ts.createProgram(fileList, options);
const transformers = {
before: [keysTransformer(program)],
after: []
};
program.emit(undefined, undefined, undefined, false, transformers);
上面的代码正确编译了我的源代码并应用了正确的插件,但是它比使用命令行工具慢得多。
传入该createProgram
方法的只是我的 tsconfig.json 文件中的 compilerOptions 对象,而不是要排除的文件。该方法似乎没有像这样的createProgram
任何参数。
但是,肯定有吗?正确的?我不得不想象这是可能的。但是,文档严重缺乏
解决方案
我设法弄清楚如何使用 tsconfig.json 和 TS 编译器 API 获取文件名列表。
const configPath = ts.findConfigFile(
"./", /*searchPath*/
ts.sys.fileExists,
"tsconfig.json"
);
if (!configPath) throw new Error("Could not find a valid 'tsconfig.json'.");
const configFile = ts.readJsonConfigFile(configPath, ts.sys.readFile);
const { fileNames } = ts.parseJsonSourceFileConfigFileContent(
configFile,
ts.sys,
'./'
);
console.log(fileNames)
这考虑了 tsconfig.json 中指定的包含和排除。这可能不是最好的方法,但我一直在努力解决这个问题。