此问题仅适用于Haxe版本< 2.10
我已经了解haxe一段时间了,但直到昨天才真正玩过它。好奇,我决定将showdown.js(一个markdown.pl的javascript端口移植到haxe。这非常简单,它生成的javascript似乎运行良好(编辑:如果你想看到它的实际效果,请查看here)。
但是,我注意到生成的代码会在全局命名空间中转储大量内容......更糟糕的是,它通过将值分配给未声明的标识符而不使用{{1}来实现}关键字,所以即使你用一个闭包来包装整个东西,它们也是全局的。
例如......
var
我设法用sed清理了大部分内容,但我也被这样的东西打扰了:
if(typeof js=='undefined') js = {}
...
Hash = function(p) { if( p === $_ ) return; {
...
EReg = function(r,opt) { if( r === $_ ) return; {
...
这是一些非常令人讨厌的javascript。
是否存在不会污染全局变量的haxe的分支或克隆?是否值得修改haxe源以获得我想要的东西,或者有人已经解决了这个问题?谷歌搜索没有太多。我愿意接受任何建议。与此同时,我很想看看这个东西会产生什么样的PHP代码...:D
以下是我尝试过的一些想法:
后处理
这是我简陋的构建脚本;它可以很好地剥离东西,但它并没有抓住一切。我对删除对内置构造函数原型的修改犹豫不决;我相信这会破坏事情。修复一切可能是一项任务,如果某人已完成工作,我不想重新开始......
{
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);
}
}
- js-namespace开关可以保存当天
感谢Dean Burge指出名称空间切换。这几乎解决了我的问题,只需要一些帮助。这是我当前的构建脚本。我认为这会抓住所有全局变量......
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
答案 0 :(得分:7)
我使用namespace switch on the compiler来清理那些全局根类型。
答案 1 :(得分:3)
Haxe并不打算用于在javascript Web应用程序中编写隔离的可重用组件。这可以通过编译器为每个该死的编译发出标准库来证明。 javascript目标的最佳使用是完全用haxe编写应用程序,并使用无类型块调用外部东西,希望它不会破坏任何东西。您应该将haxe输出视为闪存剪辑,忽略它运行的环境,假设它是唯一运行的东西。
或者您可以尝试使用with()块包装代码。
答案 2 :(得分:2)
这里有一个命名空间(实验性)haxe编译器http://github.com/webr3/haxe
答案 3 :(得分:1)
JSTM JavaScript生成器宏以多种方式优化haxe输出: