heroku - 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)
我该如何理解这一点以及从哪里开始调试它?
解决方案
这些由两个字母组成的函数名称是您在 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
推荐阅读
- r - 我可以在 R 中进行加密并使 API 安全吗
- python - 如何在 django 中根据 url 打开不同的视图
- reactjs - Scrollmagic 场景在页面加载时触发
- laravel - Laravel API:外部 API 的超长超时
- java - 如何从底部工作表片段开始活动
- angular - Appsync 客户端对 GraphQL 突变的 Angular 订阅
- api - 过滤时列表视图重新加载
- ruby-on-rails - 无法使用编辑/更新按钮在 Rails 中编辑视频
- android - Android shell 用户无权访问 /data/local/tmp,即使它是该文件夹的所有者
- powershell - Ansible 剧本,我如何运行 Powershell 脚本*带参数*