繁体   English   中英

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

[英]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");

只需引用您不希望gcc重命名的属性名称:

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

另请参见: 不一致的属性名称

有几种方法:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM