我在Heroku上部署了一个clojurescript应用程序,当触发某个事件时,该应用程序会给出错误消息。该事件触发得很好,并且效果在本地计算机上发生,但不是在线发生。
这是我在控制台中遇到的错误:
[Error] TypeError: a.zi is not a function. (In 'a.zi(xr.b(b))', 'a.zi' is undefined)
(anonymous function) (app.js:1143:299)
MG (app.js:1145:298)
NG (app.js:1147:192)
LG (app.js:1142:524)
(anonymous function) (app.js:1144:242)
MG (app.js:1145:298)
b (app.js:1142:570)
(anonymous function) (app.js:1065:272)
对此我有什么意义,甚至可以在哪里开始调试?
答案 0 :(得分:0)
这两个字母的函数名称是Google Closure Compiler(GCC)完成高级优化后得到的。
通常情况发生在我身上,是因为我指的是Javascript库。假设库A发布了功能foo
... ...假设它在浏览器中发布为(有效)window.A = { foo: function () {}; };
。
根据您(:required ,,,)
的情况,GCC可能会感到困惑,并认为在看到foo
的任何地方都可以重命名。不是。有几种方法可以告诉您不要这样做。但首先,调试:
通常,我要做的第一件事是使用:simple
优化而不是:advanced
重新部署。您的软件包大小将更大,但不会重命名,因此至少您可以在devtools中找到罪魁祸首。根据您使用的是lein-figwheel,figwheel.main,ShadowCLJS还是clojurescript.main来编译cljs,更改这些设置的位置将有所不同:
https://clojurescript.org/reference/compiler-options#optimizations
另一个技巧是打开伪名称和打印效果,然后重新部署。
https://clojurescript.org/reference/compiler-options#pseudo-names https://clojurescript.org/reference/compiler-options#pretty-print
一旦找到它,您可能希望用(set! *warn-on-infer* true)
包围问题代码。这为您提供了一些提示,您可能希望在其中提供自己的编译器提示。这些也会选择(例如,如果您使用传单,则(defn a-fn [^js/L.LatLng pos] (.toString pos))
将选择.toString
退出GCC的重命名)。
https://clojurescript.org/guides/externs#externs-inference
最后,本文还有更多提示:https://dev.solita.fi/2020/06/25/taming-cljs-advanced-compilation.html