这个问题只适用于Haxe版本< 2.10 我已经知道一段时间了,但从来没有真的玩过它直到昨天.好奇,我决定将
showdown.js端口,即
markdown.pl的一个javascript端口加起来.这是非常简单的,它生成的JavaScript似乎运行正常(编辑:如果你想看到它在行动,检查出来
here).
但是,我注意到,生成的代码在全局命名空间中转储了大量的东西…更糟糕的是,它通过将值分配给未声明的标识符,而不使用var关键字,因此即使将整个关闭的东西
例如…
if(typeof js=='undefined') js = {} ... Hash = function(p) { if( p === $_ ) return; { ... EReg = function(r,opt) { if( r === $_ ) return; { ...
我设法用sed清除大部分内容,但是我也受到这样的一些困扰:
{ String.prototype.__class__ = String; String.__name__ = ["String"]; Array.prototype.__class__ = Array; Array.__name__ = ["Array"]; Int = { __name__ : ["Int"]} Dynamic = { __name__ : ["Dynamic"]} Float = Number; Float.__name__ = ["Float"]; Bool = { __ename__ : ["Bool"]} Class = { __name__ : ["Class"]} Enum = { } Void = { __ename__ : ["Void"]} } { Math.__name__ = ["Math"]; Math.NaN = Number["NaN"]; Math.NEGATIVE_INFINITY = Number["NEGATIVE_INFINITY"]; Math.POSITIVE_INFINITY = Number["POSITIVE_INFINITY"]; Math.isFinite = function(i) { return isFinite(i); } Math.isNaN = function(i) { return isNaN(i); } }
这是一些非常不好的JavaScript.
问题
有没有叉子或克隆的haxe不污染全球的地方?是否值得修改haxe来源以获得我想要的,还是有人已经解决了这个问题?谷歌没有变得太多了.我可以接受任何建议.同时,我很想看看这个东西将会生成什么样的PHP代码?
答案?
以下是我尝试过的一些想法:
后期处理
这是我谦虚的脚本;它剥离的东西做得很好,但它并没有抓住所有的东西.我对删除对内置构造函数原型的修改犹豫不决;我确定会打破事情.修复一切可能是一个任务,如果有人已经完成工作,我不想开始
haxe -cp ~/Projects/wmd-new -main Markdown -js markdown.js echo "this.Markdown=(function(){ var \$closure,Float;" > markdown.clean.js; sed "s/^if(typeof js=='undefined') js = {}$/if(typeof js=='undefined') var js = {};/g ; s/^\([ \x09]*\)\([\$_a-zA-Z0-9]* = \({\|function\)\)/\1var \2/g ; /^[ \x09]*\(else \)\?null;$/d ; " markdown.js >> markdown.clean.js echo "return Markdown}());" >> markdown.clean.js; java -jar closure/compiler.jar --js markdown.clean.js \ --compilation_level SIMPLE_OPTIMIZATIONS \ > markdown.cc.js
–js命名空间切换节省了一天
感谢Dean Burge指出命名空间切换.这几乎解决了我的问题,有一点点帮助.这是我当前的构建脚本.我认为这会捕获所有的全局变量…
NS=N\$ haxe -cp ~/Projects/wmd-new -main Markdown --js-namespace $NS -js markdown.js # export our function and declare some vars echo "this.markdown=(function(){var \$_,\$Main,\$closure,\$estr,js,"$NS"" > markdown.clean.js; # strip silly lines containing "null;" or "else null;" sed "/^[ \x09]*\(else \)\?null;$/d ;" markdown.js >> markdown.clean.js # finish the closure echo "return "$NS".Markdown.makeHtml}());" >> markdown.clean.js;
解决方法
我使用
namespace switch on the compiler清理这些全局根类型.