为何我的Clojure/CLJS应用在Heroku部署时提示react命名空间不可用?
核心问题为npm与cljsjs的react依赖冲突、构建脚本和项目配置不匹配,按以下步骤调整:
- 移除
project.clj中的[cljsjs/react "17.0.2-0"]和[cljsjs/react-dom "17.0.2-0"]依赖。shadow-cljs默认使用npm管理前端依赖,重复引入cljsjs版本会导致命名空间查找逻辑冲突,本地正常是因为本地依赖缓存优先级和Heroku构建环境不一致。 - 调整
bin/build脚本的打包逻辑,你当前使用Leiningen管理项目依赖(有project.clj无deps.edn),原脚本中clojure -A:depstar是Clojure CLI工具的打包命令,依赖deps.edn配置,执行时会找不到对应依赖导致react相关包未被打入构建产物。可以替换为lein对应的uberjar打包命令,也可以补充对应deps.edn配置后再保留该命令。 - 在
shadow-cljs.edn的release配置中补充js依赖解析规则,明确指定react、react-dom从npm引入,避免依赖查找歧义,示例配置:
:release { :compiler-options {:optimizations :advanced} :js-options { :resolve { "react" {:target :npm :require "react"} "react-dom" {:target :npm :require "react-dom"} } } }
- 调整Heroku buildpack顺序,将Node.js buildpack放在Clojure buildpack之前,确保npm install先执行完成,shadow-cljs编译时可以读取到已安装的npm依赖。
- 可以在
bin/build的npm install命令后新增一行ls node_modules/react,推送后查看Heroku构建日志,确认react依赖已正确安装到对应路径,排除npm安装失败的问题。
内容的提问来源于stack exchange,提问作者JohnBradens
相关产品推荐
相关产品推荐

