[英]Closure Compiler update string property name references
让我们说我们有一个像对象函数的对象轮询,如下所示,我想用_.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");
有几种方法:
1)引用原始属性定义:
{"fn": ...}
2)在extern文件中提供定义:
/** @type {Object} */
var methods;
methods.fn;
3)使用神奇的“JSCompiler_renameProperty”方法:
_.invoke(pool, JSCompiler_renameProperty("fn"));
这用得不多(因此有更高的机会出现片状),不建议使用基于类型的优化。 请注意,您提供了一个存根实现,如:
function JSCompiler_renameProperty(a) { return a; }
如果您希望代码在未编译的情况下运行或在没有警告的情况下编译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.