ClojureScript的externs文件

什么是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的用法及缺陷。

留言