0

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

  • 通用/核心/api
  • 普通/数据/foo
  • 普通/远程/酒吧

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

  • 通用/核心/api -> 一个
  • 普通/数据/foo -> b
  • 普通/远程/栏-> c

替换的优点是:

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

是否有一个原因我错过了为什么没有这样做或一个额外的工具/命令来用一些自动生成的 ID 替换这些 ID?

4

1 回答 1

0

替换的优点是:

  1. 较小的文件大小

仅仅。我怀疑在实际项目中你甚至可以减少 1% 的尺寸。

  1. 更好的默默无闻

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

有没有理由我错过了为什么这没有完成

未完成的原因:

  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:的配置中进行补偿,a可以将其列为显式包含。问题解决了。但是,如果重命名模块,名称、和必须自动更改。为此,必须使用 JavaScript 解析器来解析代码并对其进行修改。目前尚不清楚在一般情况下它是否能够弄清楚它需要改变什么。bcr.jsabcr.js

  3. 最终,如果在可能r.js的情况下改变它,它会变r.js得比它复杂得多,以便处理可以在外部处理的相当专业的需求r.js

或者一个额外的工具/命令来用一些自动生成的 ID 替换这些 ID?

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

于 2015-09-08T10:31:54.150 回答