【问题标题】:google-closure compiler advanced optimization is munging navigator.battery.level causing TypeErrorgoogle-closure 编译器高级优化正在修改 navigator.battery.level 导致 TypeError
【发布时间】:2013-03-17 19:34:44
【问题描述】:

我正在使用 ClojureScript 检索电池电量:

 navigator.battery.level

在使用简单和空白优化时效果很好。但是当使用高级优化模式时,上面会变成:

navigator.hd.rd

并且由于 navigator.hd 未定义而导致 TypeError。

我该如何解决这个问题?

编辑:

感谢下面的回答。虽然在 ClosureScript 中我不得不做一些讨厌的、嵌套的、agets ......所以我想出了这个:

(defn jget [jobject & props]    
(loop [obj jobject 
       p (map name props)]
    (if (not (empty? p))            
        (let [prop (aget obj (first p))]
            (recur prop (rest p)))
    obj)))

然后这样称呼它:

(jget js/navigator :battery :level)

如果已经有这方面的工具,请告诉我。

【问题讨论】:

    标签: google-closure-compiler clojurescript navigator


    【解决方案1】:

    另一种解决方案是编写一个externs 文件,这是一个JavaScript 文件,其中包含对您要保留其名称的所有对象和方法的引用。在这种情况下,JS 文件看起来像这样:

    //resources/externs/navigator.js
    navigator = {}
    navigator.battery = {}
    navigator.battery.level = function(){};
    

    您会在 ClojureScript 编译器选项中将其称为:

    :externs ["resources/externs/navigator.js"]
    

    就像 Sirko 提出的解决方案一样,这将防止高级模式编译修改 navigator.battery.level 名称。

    【讨论】:

    • 感谢 levland,如果我想自动生成外部文件,可以安全地说给定字符串:“..”,例如:“navigator.battery .level" 文件名应 = , 到 。 应始终分配 = {},.<..>. 应始终分配= 函数(){}。
    • @jdoig 自动生成 extern 通常并不容易。上面的 extern 不包含任何类型信息或嵌套类型。
    【解决方案2】:

    使用

     navigator['battery']['level']
    

    这将保留命名。

    闭包编译器通常会重命名点表示法的变量(如navigator.battery),但保留那些他知道或使用括号表示法的变量(如 navigator['battery'])。

    【讨论】:

    • 正确。 Closure-compiler 目前没有电池状态 API 的外部。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 2016-09-19
    • 2021-04-17
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多