首页 > 解决方案 > 你可以在 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任何参数。

但是,肯定有吗?正确的?我不得不想象这是可能的。但是,文档严重缺乏

标签: node.jstypescript

解决方案


我设法弄清楚如何使用 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 中指定的包含和排除。这可能不是最好的方法,但我一直在努力解决这个问题。


推荐阅读