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

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可能不是所有情况下都可用,具体取决于您的项目配置和使用的模块解析策略。

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

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

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

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

  • 问题内容: 我的Android手机上有一个数据库,我需要将信息保存到SD卡上。 是否可以将数据库文件以可读状态保存到SD卡上?我尚未找到有关如何执行此操作的任何信息。我知道数据库的名称,字段等… 我发现了一些示例,这些示例显示了如何保存到SD卡,但并不是我真正需要的。 将数据库文件复制到SD卡的某些源代码将是完美的。 希望这个问题很清楚。 问题答案: 是。这是我使用的功能: 对于我从事的项目,我在

  • 问题内容: 我的Android手机上有一个数据库,我需要将信息保存到 SD卡上。 是否可以将数据库文件以可读状态保存到SD卡上? 我尚未找到有关如何执行此操作的任何信息。 一些将数据库文件复制到SD卡的源代码将是理想的。 问题答案: 数据库文件与任何其他文件一样,如果您复制二进制文件,它将起作用。 Java没有内置的文件复制方法,因此您可以使用以下方法: 在Java中复制文件的标准简洁方法? 只是

  • 问题内容: 我正在建立一个新的由AJAX驱动的网站,其中包含不同的部分。每个部分都需要一组新的Javascript函数才能运行。我宁愿不要一开始就加载每个脚本,因为可能会有很多脚本。 有没有一种方法可以使用AJAX加载新脚本并删除旧脚本(以确保类似的变量名或函数签名不存在兼容性问题)。 谢谢 编辑 -jQuery很好,它不必是老式的Javascript 问题答案: 三件事: 1)是,您可以加载新脚

  • 这里this输出undefined 但是在vue2 中 request引入 this则不是undefined 我想知道是什么原因 说vue3 没this的这是我没想到的 然后我又写了个demo 看了下 index.html test.js 启动服务,打开浏览器输出还是undefined