Closure编译器更新字符串属性名称引用

时间:2014-04-21 00:03:59

标签: javascript google-closure-compiler

假设我们对具有类似下面对象功能的对象进行了轮询,并且我想使用_.invoke之类的内容调用每个fn。我们可以在通过_.invoke(pool, "fn")进行gcc高级最小化之前轻松完成此操作,没问题。但是,在minifcation fn可能是c或其他一些属性名称之后......无论如何提示 gcc是否有字符串引用属性名称?我希望它在完成代码缩小后更新我对_.invoke(pool, "c")的调用调用。

有关问题的可重现示例,请尝试在此脚本上使用高级编译运行gcc:

// ==ClosureCompiler==
// @externs_url http://cdn.jsdelivr.net/g/underscorejs
// @compilation_level ADVANCED_OPTIMIZATIONS
// ==/ClosureCompiler==
var pool = [{fn: function() {}, prop2: 1}, {fn: function() {}, prop2: 2}, {fn: function() {}, prop2: 3}]
_.invoke(pool, "fn");

哪个产生明显不等同的代码:

_.invoke([{a:function(){},b:1},{a:function(){},b:2},{a:function(){},b:3}],"fn");

我希望得到的编译代码是

_.invoke([{a:function(){},b:1},{a:function(){},b:2},{a:function(){},b:3}],"a");

2 个答案:

答案 0 :(得分:2)

只需引用您不希望gcc重命名的媒体名称:

var pool = [{"fn": function() {}, "prop2": 1}, {"fn": fun ...

另请参阅:inconsistent property names

答案 1 :(得分:2)

有几种方法:

1)引用原始属性定义:

{"fn": ...}

2)在extern文件中提供定义:

/** @type {Object} */
var methods;
methods.fn;

3)使用神奇的“JSCompiler_renameProperty”方法:

_.invoke(pool, JSCompiler_renameProperty("fn"));

这用得不多(因此有更高的机会出现片状),不建议使用基于类型的优化。请注意,您提供了一个存根实现,如:

function JSCompiler_renameProperty(a) { return a; }

如果您希望代码在未编译的情况下运行或在没有警告的情况下编译。