gpt4 book ai didi

javascript - 确定哪些 JavaScript 函数没有被调用

转载 作者:行者123 更新时间:2023-12-04 09:39:00 25 4
gpt4 key购买 nike

想象一下,您有一个使用一些 JavaScript 库的网站,无论是您自己的还是第三方创作的。除了最小化和混淆之外,我想知道是否可以通过删除未使用的函数来进一步减小脚本有效负载的大小。一旦达到一定程度的复杂性,就很难/不可能知道在所有可能的执行路径下最终调用了哪些函数。这让我产生了一个问题:有没有什么工具或方法可以确定,在网页使用一段时间后,哪些用户定义的函数(不是内置函数)没有被调用?

一种明显的可能性是将所有函数定义包装在对注册函数的调用中,这 1) 将函数添加到注册器,以及 2) 注入(inject)一些代码以将函数标记为已被调用。然后就可以查询那些没有被调用的函数的注册器。然而,这种方法极其复杂。最好的办法是在 Web 服务器上编写一个 JavaScript 代码解析器,它由运行时标志(“处于 JS 诊断模式”)启用,它捕获所有 JavaScript 响应并相应地修改代码。但是不需要太多的想象力就可以意识到这将是多么容易出错和困难。

更新 : 澄清一下,我不是在寻找自动删除未使用功能的解决方案,我不会对此感到满意,因为害怕引入不稳定。相反,功能使用的开发时间分析将让我选择要删除的包含/功能,以便最终解决方案可以在发布之前进行适当的测试。

最佳答案

Once you reach a certain level of complexity, it becomes difficult/impossible to know which functions end up getting called under all possible execution paths.



“困难/不可能”中不需要斜线。死代码消除等效于解决停机问题,因此是不可能的。

are there any tools or any ways to determine, after a period of usage of the web page, what user-defined functions (not built-in ones) have not been called?



这介于分析(确定代码的哪些部分已被执行的频率)和覆盖率分析(确定代码的哪些部分已被执行)之间的某个位置。更准确地说,听起来您正在寻找功能覆盖率。

请注意,代码覆盖率经常在测试的上下文中被讨论,以至于对于某些人来说,术语“代码覆盖率”和“测试覆盖率”是同义词,但代码覆盖率与测试无关。它只是指“当我运行特定的工作负载时,代码的哪些部分会被执行?”这个问题。

上述问题中“部分”一词的解释方式不同,它们产生了不同的覆盖范围:
  • 行覆盖:哪些行被执行?
  • 功能覆盖率:执行哪些功能? (这是您感兴趣的。)
  • 语句覆盖率:执行哪些语句?
  • 表达式覆盖:哪些表达式被执行?
  • 分支覆盖:条件的哪些分支被执行?
  • 路径覆盖:通过 block 的哪些路径被执行?

  • 行覆盖率通常没有用,因为您只需重新格式化代码即可更改数字。事实上,在 ECMAScript 中,我总是可以轻松地做到所有行都通过简单地写在一行上来执行。

    这段代码可以说明分支覆盖和路径覆盖之间的区别:

    function foo(bar, baz) {
    if (bar) {
    console.log("bar");
    } else {
    console.log("no bar");
    }

    if (baz) {
    console.log("baz");
    } else {
    console.log("no baz");
    }
    }

    为了覆盖所有分支,我需要两个调用:

    foo(true,  false);
    foo(false, true);

    为了覆盖该函数的所有可能路径,我需要四个调用:

    foo(true,  true);
    foo(true, false);
    foo(false, true);
    foo(false, false);

    如果您根据函数覆盖率进行启发式死代码消除,您将能够删除未使用的函数。如果您根据分支覆盖率执行此操作,您甚至可以从 if 中删除未使用的分支。或 switch陈述。

    如果您正在寻找代码覆盖工具,您可能必须查看测试空间,因为这是它们最常使用的地方。而且您可能必须编写自己的死代码消除工具,或者可能修补现有的压缩程序,以便它可以从代码覆盖运行中读取日志文件并基于此做出决策。

    据我所知,没有现有的工具可以做到这一点,尽管我可能错了。

    关于javascript - 确定哪些 JavaScript 函数没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62412819/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com