当前位置: 首页 > 知识库问答 >
问题:

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

柴瀚昂
2024-08-26

是否有这样的库,可以让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个答案

丁弘新
2024-08-26

对于您的需求,直接存在一个现成的开源库来精确生成这种文件依赖链的数据结构可能不太常见,因为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可能不是所有情况下都可用,具体取决于您的项目配置和使用的模块解析策略。

 类似资料:
  • 是否可以在Node.js 代码文件中,既可以使用require引入三方库,又可以使用import引入呢?

  • 请问下,我们知道在一个代码项目中,比如一个方法,这个方法里面可能会调用多个子方法或者其他的类实例的方法。 给一个简单的例子: func1调用了func2,func2调用了func3: 请问一下: 1、在现有的开源库里面,是否有这样的库,可以让给定的方法提取出调用链? 2、是否有比较轻量的库可以实现上面调用链的图形库呢?

  • 本文向大家介绍Python引用(import)文件夹下的py文件的方法,包括了Python引用(import)文件夹下的py文件的方法的使用技巧和注意事项,需要的朋友参考一下 Python的import包含文件功能就跟PHP的include类似,但更确切的说应该更像是PHP中的require,因为Python里的import只要目标不存在就报错程序无法往下执行。要包含目录里的文件,PHP中只需要给

  • 本文向大家介绍React怎样引入svg的文件?相关面试题,主要包含被问及React怎样引入svg的文件?时的应答技巧和注意事项,需要的朋友参考一下

  • 本文向大家介绍php使用include 和require引入文件的区别,包括了php使用include 和require引入文件的区别的使用技巧和注意事项,需要的朋友参考一下 最近有小伙伴,提问了有关于require_once的有关问题,对于程序中遇到的问题,无聊难度大小,只要bug存在就还值得我们去探索,去解决。针对这个问题,我把include和require的详细用法进行归纳。(结合查阅资料和

  • 问题内容: 我想使用JavaScript将数据写入现有文件。我不想在控制台上打印它。我想实际将数据写入。我读了许多已回答的问题,但是他们在控制台上打印的每个位置。在某些地方,他们给出了代码,但是没有用。因此,请任何人帮助我如何实际将数据写入File。 我引用了代码,但是它不起作用:给出错误: 未捕获的TypeError:非法构造函数 在铬和 SecurityError:操作不安全。 在Mozill