升级Clojure及ClojureScript后Electron应用报错:goog未定义
我之前在把Electron和ClojureScript结合开发时,升级到CLJS 1.10.x也碰到过一模一样的问题——编译时弹出goog未定义的extern警告,Electron应用直接跑不起来。结合我踩过的坑,给你几个实用的解决方向:
1. 调整CLJS编译配置,显式引入goog externs
CLJS 1.10.x对externs的校验变得更严格了,哪怕是自身依赖的goog库,也可能因为编译配置没跟上而被当成未定义的外部变量。你可以在CLJS的编译配置里,给:compiler选项加上:externs参数,直接指定goog的基础文件:
:compiler { ;; 其他配置... :externs ["goog/base.js"] :optimizations :advanced }
如果用的是Leiningen,这个配置放在:cljsbuild的:builds里;如果是shadow-cljs,对应到:builds的:compiler部分就行。
2. 确保Electron加载顺序正确,让goog先初始化
有时候问题出在Electron的脚本加载顺序上——如果你的主进程或者preload脚本先于CLJS编译后的代码加载,可能会干扰goog的全局变量初始化。你可以试试在Electron的index.html里,把CLJS的输出脚本放在最前面,确保goog先被加载:
<script src="js/ui-release-out/goog/base.js"></script> <script src="js/ui-release-out/main.js"></script> <script>goog.require("your.app.namespace");</script>
3. 切换到更适配Electron的CLJS构建工具
如果用的是原生的cljsbuild,推荐换成shadow-cljs,它对Electron的支持更友好,专门提供了:target :electron-renderer的配置,会自动处理externs、路径解析这些问题,省去很多手动配置的麻烦。比如shadow-cljs的build配置可以这么写:
{:builds {:renderer {:target :electron-renderer :output-dir "resources/public/js/ui-release-out" :main your.app.namespace :optimizations :advanced}}}
4. 检查编译输出路径和资源路径配置
如果你的:output-dir或者:asset-path设置错误,Electron可能找不到goog的文件,导致运行时无法识别goog变量。你可以检查编译后的文件结构,确认goog/base.js确实在resources/public/js/ui-release-out目录下,并且Electron的窗口加载路径是正确的。
附上你遇到的报错信息,方便其他开发者参考:
WARNING: resources/public/js/ui-release-out/inferred_externs.js:19: WARNING - name goog is not defined in the externs.
goog.isArrayLike;
^^^^
Apr 08, 2018 5:14:05 PM com.google.javascript.jscomp.LoggerErrorManager printSummary
WARNING...
内容的提问来源于stack exchange,提问作者Akisame

