是否有这样的开源库,可以让import/require的引入文件,得到文件的引用的链数据结构?

是否有这样的库,可以让import/require的引入文件,得到文件的引用的链数据结构?

比如:有如下的项目文件引用:

a.ts

export class A = {...}

b.ts

export class B = {...}

c.ts

import {B} from './b'
export class C extends B = {...}

d.ts

import {A} from './a'
import {C} from './c'

class D1 extends A {...}
class D2 extends C {...}

我想要对d.ts获取到引用文件的链,想要的结构如下:

{
  filename: "d.ts",
  children: [
    {
      filename: "./a"
    },
    {
      filename: './c',
      children: [
        {
          filename: './b'
        }
      ]
    }
  ]
}
阅读 1.1k
avatarAI BotBETA

对于您的需求,直接存在一个现成的开源库来精确生成这种文件依赖链的数据结构可能不太常见,因为JavaScript和TypeScript的模块系统(如ES Modules、CommonJS等)主要关注于模块加载和执行,而不直接提供完整的依赖链构建工具。但是,您可以通过以下几种方式来实现或近似实现这一功能:

  1. 使用静态代码分析工具
    有一些静态代码分析工具,如ESLint的插件、TypeScript的tslint(已废弃,但类似功能的工具如eslint-plugin-typescript可能存在)或TypeScript编译器本身的某些功能(如--traceResolution),可以用来分析模块的依赖关系。您可能需要编写一些自定义逻辑来解析这些工具的输出,以构建所需的链数据结构。
  2. 编写自定义脚本
    使用Node.js编写一个自定义脚本,该脚本遍历项目中的所有.ts文件,分析importrequire语句,并递归地构建依赖链。这可能需要正则表达式或解析库(如@babel/parser)来解析TypeScript代码。
  3. 使用现有的依赖可视化工具
    有些工具(如Webpack的Bundle Analyzer插件、madge等)可以生成项目的依赖图,但它们可能不直接提供您所需的精确数据结构。您可能需要从这些工具的输出中提取信息,或者修改它们以满足您的需求。
  4. TypeScript编译器API
    使用TypeScript的编译器API(typescript包中的ProgramSourceFile等类)来解析项目中的文件,并构建依赖链。这种方式比较灵活,但需要一定的TypeScript和编译原理知识。

以下是一个简化的概念示例,说明如何使用TypeScript编译器API来开始构建依赖链:

import * as ts from 'typescript';

function buildDependencyGraph(program: ts.Program, sourceFile: ts.SourceFile): any {
    const imports = sourceFile.statements
        .filter(stmt => ts.isImportDeclaration(stmt))
        .map(stmt => stmt.moduleSpecifier.getText());

    const children: any[] = imports.map(moduleSpecifier => {
        const resolvedFile = program.getResolvedModule(sourceFile, moduleSpecifier);
        if (resolvedFile && resolvedFile.resolvedModule) {
            return {
                filename: resolvedFile.resolvedModule.resolvedFileName,
                children: buildDependencyGraph(program, program.getSourceFile(resolvedFile.resolvedModule.resolvedFileName)!)
            };
        }
        return { filename: moduleSpecifier };
    });

    return { filename: sourceFile.fileName, children };
}

// 使用示例(需要适当的错误处理和配置)
const program = ts.createProgram(['path/to/d.ts'], { /* tsconfig options */ });
const graph = buildDependencyGraph(program, program.getSourceFile('path/to/d.ts')!);
console.log(graph);

请注意,这个示例需要您提供适当的路径和TypeScript配置,并且可能需要根据您的具体需求进行调整。此外,resolvedModule可能不是所有情况下都可用,具体取决于您的项目配置和使用的模块解析策略。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏