Compilation ClojureScript优化编译需要在externs文件中声明goog.net.EventType

Compilation ClojureScript优化编译需要在externs文件中声明goog.net.EventType,compilation,clojurescript,Compilation,Clojurescript,IFrameIo Clojure库()可用于促进文件上载。上载过程中更重要的部分之一是事件侦听器,它在成功上载文件后发送成功回调: (goog.events/listen (IframeIo.) (aget goog.net.EventType "SUCCESS") #(success-callback)) 这在本地开发环境中运行良好。但是,一旦代码部署到生产环境,即使上载成功,也不再调用成功回调。经过一些调查,很明显编译过程损坏了goog.net.EventType对象的键: 预期: Obj

IFrameIo Clojure库()可用于促进文件上载。上载过程中更重要的部分之一是事件侦听器,它在成功上载文件后发送成功回调:

(goog.events/listen (IframeIo.) (aget goog.net.EventType "SUCCESS") #(success-callback))
这在本地开发环境中运行良好。但是,一旦代码部署到生产环境,即使上载成功,也不再调用成功回调。经过一些调查,很明显编译过程损坏了goog.net.EventType对象的键:

预期:

Object { SUCCESS: function() ..., ERROR: function() ...}
实际:

Object { az: function() ..., of: function() ...}
解决此问题的唯一方法是创建一个externs文件依赖项,以防止对象被损坏:

在project.clj中:

{:prod
  {:compiler
    {:optimizations :advanced
     :pretty-print false
     :externs ["path/to/googNet-EventType.js"]}}}
googNet-EventType.js:

var goog = {}
goog.net = {}
goog.net.EventType = {}
goog.net.EventType.SUCCESS
编译过程现在保留goog.net.EventType对象的SUCCESS属性,从而成功调用回调


为什么来自goog.net的依赖项会损坏它自己的对象?

这种情况下不需要外部程序。您与Google闭包库的交互是问题的原因。Google Closure库枚举也会缩小:

(goog.events/listen (IframeIo.) 
  goog.net.EventType.SUCCESS #(success-callback))
这就是你想要的。我个人会使用
ns
表单将
goog.events
别名为
gevents
并导入
EventType
,这样我就可以写:

(gevents/listen (IframeIo.) 
  EventType.SUCCESS #(success-callback))
当使用属性语法时,确实不应该使用
aget
访问对象属性。如果出于某种原因确实需要按字符串查找属性,请使用
goog.object.get