用假名称替换模块 ID
Replace module ids with fake names
想象一个 AMD Java-Script 应用程序由三个具有这些 ID 的模块组成:
- common/core/api
- common/data/foo
- common/remote/bar
当我使用 r.js 构建优化文件时,这些 ID 仍在编译文件中。海事组织这是不必要的。例如,当我搜索并替换以下内容时,优化文件仍然有效:
- common/core/api -> 一个
- common/data/foo -> b
- common/remote/bar -> c
换人的优势是:
- 更小的文件大小
- 更好的隐蔽性
(是的,你永远不应该相信客户端。不过,替换模块名称需要逆向工程师进行更多的猜测,而不是立即通过模块名称找到应用程序的重要部分)
是否有我遗漏的原因,为什么我没有这样做,或者额外的 tool/command 用一些自动生成的 ID 替换这些 ID?
The advantages of the substitutions are:
- smaller filesize
勉强。我怀疑在实际项目中您是否能够缩小 1% 的尺寸。
- better obscurity
默默无闻名义上会更好,但我怀疑可以处理缩小代码的人会被这种额外的混淆所困扰。
Is there a reason I'm missing why this isn't done
未完成的原因:
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
.
之外处理
or an additional tool/command to substitute those IDs with some auto generated id?
没有工具或配置选项可以为您执行此操作。无论 r.js
为您做什么,理论上都可以在调用 r.js
之前作为构建阶段完成。在将文件传递给 r.js
.
之前,您必须编写自己的工具来执行转换
想象一个 AMD Java-Script 应用程序由三个具有这些 ID 的模块组成:
- common/core/api
- common/data/foo
- common/remote/bar
当我使用 r.js 构建优化文件时,这些 ID 仍在编译文件中。海事组织这是不必要的。例如,当我搜索并替换以下内容时,优化文件仍然有效:
- common/core/api -> 一个
- common/data/foo -> b
- common/remote/bar -> c
换人的优势是:
- 更小的文件大小
- 更好的隐蔽性
(是的,你永远不应该相信客户端。不过,替换模块名称需要逆向工程师进行更多的猜测,而不是立即通过模块名称找到应用程序的重要部分)
是否有我遗漏的原因,为什么我没有这样做,或者额外的 tool/command 用一些自动生成的 ID 替换这些 ID?
The advantages of the substitutions are:
- smaller filesize
勉强。我怀疑在实际项目中您是否能够缩小 1% 的尺寸。
- better obscurity
默默无闻名义上会更好,但我怀疑可以处理缩小代码的人会被这种额外的混淆所困扰。
Is there a reason I'm missing why this isn't done
未完成的原因:
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
. 之外处理
or an additional tool/command to substitute those IDs with some auto generated id?
没有工具或配置选项可以为您执行此操作。无论 r.js
为您做什么,理论上都可以在调用 r.js
之前作为构建阶段完成。在将文件传递给 r.js
.