首页 > 解决方案 > a.zi 不是 heroku 上的功能,但应用程序在本地运行良好

问题描述

我在 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)

我该如何理解这一点以及从哪里开始调试它?

标签: herokuclojurescript

解决方案


这些由两个字母组成的函数名称是您在 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))将选择退出 GCC 的重命名)。.toString

https://clojurescript.org/guides/externs#externs-inference

最后,这篇文章还有更多提示:https ://dev.solita.fi/2020/06/25/taming-cljs-advanced-compilation.html


推荐阅读