用假名称替换模块 ID

Replace module ids with fake names

想象一个 AMD Java-Script 应用程序由三个具有这些 ID 的模块组成:

当我使用 r.js 构建优化文件时,这些 ID 仍在编译文件中。海事组织这是不必要的。例如,当我搜索并替换以下内容时,优化文件仍然有效:

换人的优势是:

  1. 更小的文件大小
  2. 更好的隐蔽性
    (是的,你永远不应该相信客户端。不过,替换模块名称需要逆向工程师进行更多的猜测,而不是立即通过模块名称找到应用程序的重要部分)

是否有我遗漏的原因,为什么我没有这样做,或者额外的 tool/command 用一些自动生成的 ID 替换这些 ID?

The advantages of the substitutions are:

  1. smaller filesize

勉强。我怀疑在实际项目中您是否能够缩小 1% 的尺寸。

  1. better obscurity

默默无闻名义上会更好,但我怀疑可以处理缩小代码的人会被这种额外的混淆所困扰。

Is there a reason I'm missing why this isn't done

未完成的原因:

  1. RequireJS 仍然必须像当前那样运行,因为对于许多用途,将模块重命名为任意值是不可接受的。 (在我使用 RequireJS 的任何地方都是这种情况。)因此,这将向 r.js 添加额外的代码路径,必须对其进行测试。

  2. 在某些情况下,RequireJS 会完全无法执行重命名。考虑一下:

    define(function (require) {
    var deps = ['a', 'b'];
    if (some_condition)
        deps.push('c');
    require(deps, function () { ... });
    });
    

    RequireJS 无法跟踪 require 调用中的依赖项,因为标记 deps 不是字符串的文字数组。但是,目前可能在传递给r.js的配置中进行补偿:abc可以列为明确的夹杂物。问题解决了。但是,如果 r.js 重命名模块,则必须自动更改名称 abc。为此,r.js 必须使用 JavaScript 解析器来解析代码并更改它。目前还不清楚在一般情况下它是否能够弄清楚它需要改变什么。

  3. 最终,如果 r.js 被更改为尽可能做到这一点,这将使 r.js 比现在复杂得多,以便处理相当特殊的需求, 可以r.js.

  4. 之外处理

or an additional tool/command to substitute those IDs with some auto generated id?

没有工具或配置选项可以为您执行此操作。无论 r.js 为您做什么,理论上都可以在调用 r.js 之前作为构建阶段完成。在将文件传递给 r.js.

之前,您必须编写自己的工具来执行转换