【问题标题】:How to use object name and be safe from obfuscation and minification in JavaScript?如何在 JavaScript 中使用对象名称并避免混淆和缩小?
【发布时间】:2023-01-03 15:07:00
【问题描述】:

在 JavaScript 中,几乎每个对象都有一个 .name 属性,它是一个字符串,是对象本身的名称。

这在其他一些语言中也存在(例如 C#,您可以使用 nameof 函数来获取对象的名称)。

使用.name 可以使代码更简洁,并且在重命名对象时不易出现不一致。

但是,当我们这样做时,在生产环境中,当代码被构建工具缩小和混淆时,我们的对象名称会发生​​变化。

例如,考虑这个函数:


const getFullName = () => { }

console.log(getFullName.name) // prints 'getFullName'

现在在生产中这可能变成:

const aH = () => { }
console.log(aH.name) // prints 'aH'

有没有办法保留对象的原始.name

【问题讨论】:

  • “在 JavaScript 中,几乎每个对象都有一个 .name 属性”是绝对不正确的。在核心 JS 对象之外,只有错误和函数有它。
  • 此外,according to this articlenameof 也不适用于经过混淆处理的 .NET。
  • @AKX,谢谢你纠正我。

标签: javascript


【解决方案1】:

有没有办法保留对象的原始.name

这就是 Source Maps 的用途:

您是否曾经希望在不影响性能的情况下,即使在合并和缩小客户端代码后,也能保持客户端代码的可读性,更重要的是可调试性?那么现在您可以通过源地图的魔力。

【讨论】:

    【解决方案2】:

    简而言之,如果您使用的是破坏名称的缩小器/构建过程,或者您明确混淆了您的代码,那么您的代码不应依赖于 Function.prototype.name 的值。 This is well documented on MDN。 (Function.prototype.name 属性也是只读的,因此您也不能只在运行时编写它。)

    如果您需要运行时内省以外的东西,您的构建过程可能已经有一个选项来设置source maps,但请注意,这允许任何有权访问源映射文件的人到go back to the original source code,从而避免任何混淆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-21
      • 2011-08-07
      • 2011-10-23
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 2019-11-29
      • 2021-06-23
      相关资源
      最近更新 更多