使用Emacs+Cider开发shadow-cljs项目时无cider-error缓冲区及堆栈跟踪
解决Shadow-CLJS+Cider无法调出错误缓冲区/查看堆栈跟踪的问题
以下是针对该问题的具体排查和解决步骤:
1. 确保连接到正确的CLJS REPL环境
CLJ项目的REPL和CLJS项目的REPL是分离的,默认连接可能停留在CLJ环境,导致无法捕获CLJS错误:
- 启动shadow-cljs并完成Cider连接后,执行
M-x cider-switch-to-cljs-repl切换到CLJS专属REPL缓冲区。 - 日常开发时,确保在CLJS REPL或对应CLJS代码缓冲区中执行操作,触发的错误才会被Cider捕获。
2. 调整Shadow-CLJS的Devtools配置
修改shadow-cljs.edn中的:devtools节点,增强错误传递到nREPL的能力:
:devtools {:preloads [reagent-dev-tools.preload] :console-support true :after-load app.main/reload! :repl-verbose true ; 添加该配置,强制将CLJS错误详情发送到nREPL }
- 若怀疑
reagent-dev-tools拦截了错误输出,可以暂时注释:preloads配置,重启shadow-cljs后测试是否恢复正常。
3. 检查Emacs Cider的CLJS相关配置
在Emacs配置文件(如init.el或config.el)中添加/确认以下配置:
; 强制开启CLJS错误缓冲区显示 (setq cider-cljs-show-error-buffer t) ; 设置堆栈跟踪默认过滤CLJS相关内容 (setq cider-stacktrace-default-filters '(:cljs))
添加后重启Emacs或执行M-x eval-buffer生效。
4. 验证Source Map生成状态
确认shadow-cljs正确生成了source map:
- 检查
target/js目录下是否存在与编译后的JS文件对应的.map文件。 - 若没有生成,重新执行
shadow-cljs watch app编译项目,查看终端输出是否有source map相关报错。
5. 手动触发错误测试
在CLJS代码中编写明确的错误代码(如调用未定义函数):
(defn test-error [] (undefined-function))
- 在CLJS REPL中调用
(test-error),或刷新浏览器触发该代码执行,观察Cider是否自动弹出错误缓冲区。 - 若shadow-cljs终端能看到错误但Cider无响应,可尝试重新加载nREPL中间件:重启shadow-cljs并重新建立Cider连接。
内容的提问来源于stack exchange,提问作者Eva
相关产品推荐
相关产品推荐

