什么是externs文件,为什么要使用externs文件
ClojureScript的编译使用的是Google Closure编译器。由于Google Closure编译器在高级优化模式时会重命名未导出的函数或变量,导致ClojureScript项目里对其它JS库的调用失效。体现在前端就是一些提示变量或方法undefined的错误。
解决办法就是创建externs文件,写入我们需要用到的第三方JS库的方法或变量名。externs文件其实就是一个普通的JavaScript文件,如下
对于普通对象可以用以下方式声明,对象的成员可以留空:
var myobject = {};
可以声明对象的成员:
var myobject = {
foo: {}
};
声明函数,函数输入参数的名称不重要,函数体可留空:
var myfunc = function(a, b){};
可以为函数返回的对象声明类型,例如
/**
* @return {ps.Address}
*/
ps.decode = function(addr){};
ps.Address.code = {};
使用这个定义后,下面的.decode
, -code
都可以避免被Google Closure编译器重命名。
(let [wallet (.decode js/ps addr)]
(println (.-code wallet)))
怎么使用externs文件
在project.clj
的添加ClojureScript的编译配置
;; ...
:optimizations :advanced
:externs ["externs/xfer.js"]
;; ...
infer-externs
由于我们可能在许多不同的地方调用了第三方库,上面编写externs文件的方式很痛苦。最近更新的ClojureScript支持用类型提示的方式,自动生成externs文件,这就是infer-externs
功能。下一篇文章我们将讨论infer-externs
的用法及缺陷。