Haxe javascript没有全球性的名字空间的污染?
-
26-09-2019 - |
题
这个问题只适用于Haxe版本 < 2.10
我已经知道关于haxe一段时间,但从来没有真正发挥了与它直到昨天。是好奇,我决定端口 showdown.js, 一javascript口的 markdown.pl, ,haxe.这是非常简单,和javascript它产生似乎运行(编辑: 如果你想要看到它在行动,检查出来 在这里,).
然而,我注意到,产生的代码垃圾场一吨的东西在全球名称空间...与什么更糟的是,它是否通过分配值 未申报的标识符 没有用的 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源得到我想要什么,或者已经有人已经解决了这个?谷歌上搜索没有打开了多。我很开放的任何建议。与此同时,我要死了,看看有什么样的代码这样的事情会产生...D
答案吗?
这里是一些想法,我已经试过:
后处理
这里是我的愚建立脚本;它做了很好的工作的剥东西出来,但它没有抓住一切。我犹豫是否要删除的修改内在构造原型;我敢肯定,这将打破东西。固定的一切可能的任务,我不想要开始,如果某人已经完成的工作。
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-namespace开关节省了一天
谢谢院长比尔格指出的名字空间的切换。这漂亮多了解决我的问题,与未成年人的位的帮助。这是我目前的建立脚本。我 想想 这种捕获所有的全球变量...
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;
解决方案
我用于编译器中命名空间开关来清洁这些全球根种类多达。
其他提示
HAXE并不意味着被用于在一个JavaScript的Web应用程序编写一个分离可重复使用的部件。这是由编译器发出标准库,每该死的编译的事实证明。 JavaScript的目标的最佳应用是在haXe的完全写一个应用程序,并使用无类型块希望它不会破坏任何东西调用外部的东西。你应该把haXe的输出如Flash短片,无视它在运行的环境,假设它是唯一运行的。
或者你可以尝试用与()块包装的代码。
有一个命名空间(实验)haXe的编译器在这里 http://github.com/webr3/haxe
该JSTM JavaScript发电机的宏观优化haxe出在一些方面:
- javascript输出是分为单独的文件按类型
- 这些文件进行优化
- 一个装载机脚本负荷的需要类型异步
- 只有一个全球性的变量是用于:jstm
- 只的代码实际上是需要运行程序是下载的
- 新种类可以被装载在运行时,这使得能够高度可伸缩的应用程序
检查了 http://code.google.com/p/jstm/ 更多的信息。