Requirejs 用假名称替换模块ID

Requirejs 用假名称替换模块ID,requirejs,obfuscation,amd,requirejs-optimizer,Requirejs,Obfuscation,Amd,Requirejs Optimizer,设想一个AMD Java脚本应用程序,由三个具有这些ID的模块组成: 通用/核心/api 通用/数据/foo 公共/远程/酒吧 当我使用r.js构建优化文件时,这些ID仍然在编译文件中。我认为这是没有必要的。例如,当我搜索并替换以下内容时,优化的文件仍然有效: 通用/核心/api->a 通用/数据/foo->b 通用/远程/条形->c 替换的优点是: 较小的文件大小 更好的隐蔽性 (是的,您永远不应该信任客户机。不过,替换模块名称需要反向工程师进行猜测,而不是通过模块名称立即查找应用程序

设想一个AMD Java脚本应用程序,由三个具有这些ID的模块组成:

  • 通用/核心/api
  • 通用/数据/foo
  • 公共/远程/酒吧
当我使用r.js构建优化文件时,这些ID仍然在编译文件中。我认为这是没有必要的。例如,当我搜索并替换以下内容时,优化的文件仍然有效:

  • 通用/核心/api->a
  • 通用/数据/foo->b
  • 通用/远程/条形->c
替换的优点是:

  • 较小的文件大小
  • 更好的隐蔽性
    (是的,您永远不应该信任客户机。不过,替换模块名称需要反向工程师进行猜测,而不是通过模块名称立即查找应用程序的重要部分)
  • 是否有一个我不知道为什么不这样做的原因,或者有一个额外的工具/命令用一些自动生成的id替换这些id

    替换的优点是:

  • 较小的文件大小
  • 几乎没有。我怀疑在真正的项目中,你甚至能得到1%的尺寸缩减

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

    我不知道为什么不这么做有什么原因吗

    原因如下:

  • RequireJS仍必须像目前一样运行,因为对于许多用途,将模块重命名为任意值是不可接受的。(我使用RequireJS的地方都是这样。)因此,这将向
    r.js
    添加额外的代码路径,这将需要测试

  • 在某些情况下,RequireJS完全无法执行重命名。考虑这一点:

    define(function (require) {
    var deps = ['a', 'b'];
    if (some_condition)
        deps.push('c');
    require(deps, function () { ... });
    });
    
    RequireJS无法跟踪
    require
    调用中的依赖项,因为令牌
    deps
    不是字符串的文本数组。但是,目前可以在传递给
    r.js
    的配置中进行补偿:
    a
    b
    c
    可以作为显式包含项列出。问题解决了。但是,如果
    r.js
    重命名模块,则必须自动更改名称
    a
    b
    c
    。为此,
    r.js
    必须使用JavaScript解析器来解析代码并对其进行修改。目前尚不清楚的是,在一般情况下,它是否能够找出需要修改的内容

  • 最终,如果将
    r.js
    更改为在可能的情况下执行,则会使
    r.js
    比它复杂得多,以便处理一个相当特殊的需求,而这个需求可以在
    r.js
    之外处理

  • 或者使用其他工具/命令,用自动生成的id替换这些id


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

    之前,您必须编写自己的工具来执行转换,谢谢您的回答。我没有考虑动态构建依赖项,因为我所有的依赖项都是静态的。我现在明白了,替换是一个特例。我已经考虑过编写一个工具,对优化后的文件进行后期处理,并通过regex替换模块名。您的想法是对其进行预优化。你对此有具体的想法吗?我看到的唯一预优化解决方案是重命名文件夹、文件和依赖项,然后启动优化过程。