代码之家  ›  专栏  ›  技术社区  ›  Dagg Nabbit

haxeforjavascript没有全局命名空间污染?

  •  9
  • Dagg Nabbit  · 技术社区  · 14 年前

    此问题仅适用于Haxe版本<2.10

    我知道哈克斯有一段时间了,但直到昨天才真正玩过。出于好奇,我决定离开 showdown.js markdown.pl ,给哈克斯。这非常简单,它生成的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);
     }
    }
    


    问题

    有没有一个分叉或克隆的哈克斯某处,不污染全球?修改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名称空间开关节省了时间

    感谢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;
    
    4 回复  |  直到 13 年前
        1
  •  7
  •   Dean Burge    14 年前

    我使用 namespace switch on the compiler 清除这些全局根类型。

        2
  •  3
  •   artificialidiot    14 年前

    Haxe并不用于在javascript web应用程序中编写一个独立的可重用组件。编译器为每一个该死的编译发出标准库的事实就证明了这一点。javascript目标的最佳用途是完全用haxe编写应用程序,并使用非类型化块调用外部内容,希望它不会破坏任何东西。您应该将haxe输出视为一个flash片段,不考虑它运行的环境,假设它是唯一运行的东西。

        3
  •  2
  •   blackdog66    14 年前

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

        4
  •  1
  •   Cref    14 年前

    1. javascript输出按类型分为不同的文件
    2. 这些文件已优化
    3. 加载程序脚本异步加载所需的类型
    4. 只使用一个全局变量:jstm
    5. 只下载运行应用程序实际需要的代码

    http://code.google.com/p/jstm/