微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

哈希为javascript没有全球名称空间污染?

这个问题只适用于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清理这些全局根类型.

原文地址:https://www.jb51.cc/js/152615.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐