Haxe的JavaScript没有全球命名空间污染?

这个问题仅适用于Haxe版本<2.10

我已经知道haxe一段时间了,但直到昨天才真正玩过它。 很好奇,我决定将markdown.pl的JavaScript端口showdown.js移植到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源代码是否值得? 谷歌搜索没有很多。 我愿意接受任何建议。 同时,我很想看看这个东西会产生什么样的PHP代码...: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开关保存一天

感谢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;

我使用编译器上的命名空间开关来清理这些全局根类型。


Haxe并不意味着用于在JavaScript Web应用程序中编写独立的可重用组件。 编译器为每个该死的编译发出标准库的事实证明了这一点。 javascript target的最佳使用是完全用haxe编写应用程序,并使用无类型块调用外部的东西,希望它不会破坏任何东西。 你应该像闪光片一样对待haxe输出,而忽略它运行的环境,假设它是唯一运行的。

或者你可以尝试用()块封装代码。


这里有一个命名空间(实验)haxe编译器http://github.com/webr3/haxe

链接地址: http://www.djcxy.com/p/18329.html

上一篇: Haxe for javascript without global namespace pollution?

下一篇: Display string of SVG on canvas