用假名替换模块ID

时间:2015-09-07 14:20:38

标签: requirejs obfuscation amd requirejs-optimizer

想象一下AMD Java脚本应用程序,它包含三个具有这些ID的模块:

  • 公共/核心/ API
  • 公共/数据/富
  • 公共/远程/酒吧

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

  • common / core / api - >一个
  • common / data / foo - > B'/ LI>
  • common / remote / bar - > ç

替换的优点是:

  1. 较小的文件大小
  2. 更好的默默无闻 (是的,你永远不要相信客户。但是,替换模块名称需要反向生成器来猜测比通过模块名称立即找到应用程序的重要部分更多)
  3. 有没有理由我错过了为什么没有这样做,或者有一个额外的工具/命令用一些自动生成的id替换这些ID?

1 个答案:

答案 0 :(得分:0)

  

替换的优点是:

     
      
  1. 较小的文件大小
  2.   

勉强。我对实际项目表示怀疑,你甚至可以减少1%的尺寸。

  
      
  1. 更好的默默无闻
  2.   

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

  

我有理由错过为什么没有这样做

原因尚未完成:

  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复杂得多,以便处理相当专业的需求,其中 可以在r.js之外处理。

  4.   

    或其他工具/命令,用一些自动生成的ID替换这些ID?

    没有工具或配置选项可以为您执行此操作。无论r.js为你做什么,理论上都可以在调用r.js之前作为构建阶段完成。在将文件传递给.wrapper .extended之前,您必须编写自己的工具来执行转换。

相关问题