Compilation ClojureScript优化编译需要在externs文件中声明goog.net.EventType
IFrameIo Clojure库()可用于促进文件上载。上载过程中更重要的部分之一是事件侦听器,它在成功上载文件后发送成功回调: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
(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