在ClojureScript中使用TailWindElements-React遇导入问题求助
在ClojureScript中使用TailWindElements-React的问题解决
核心问题根源
TailWindElements-React内部使用了动态import()语法,而Closure Compiler默认无法转译这种语法,加上shadow-cljs的编译目标配置和导入方式不匹配,导致了一系列错误。下面是针对性的解决步骤:
1. 修复Closure编译的「Dynamic import expressions cannot be transpiled」错误
在shadow-cljs.edn中配置,让shadow-cljs跳过对TailWindElements-React的Closure编译,直接保留其原始ESM代码:
{:dependencies [[tailwindcss/tailwindcss "3.3.2"] [tailwind-elements/react "1.0.0"]] ;; 替换为你实际使用的版本 :builds {:app {:target :browser :output-dir "public/js" :asset-path "/js" :modules {:main {:init-fn your.app/init}} ;; 关键配置:标记tailwind-elements/react为ESM模块,跳过Closure编译 :js-options {:resolve {"tailwind-elements/react" {:target :esm}} :external-indexes {:node_modules true}}}}}
2. 正确导入组件(无需动态import)
直接用常规的命名空间引用或require导入组件即可,无需使用动态导入:
(ns your.app (:require ["tailwind-elements/react" :as tw] ["react-dom/client" :as rdom])) (defn init [] ;; React 18+ 挂载方式 (let [root (rdom/createRoot (.getElementById js/document "app"))] (.render root (tw/Button {:variant "primary"} "测试按钮"))))
3. 解决ESM目标下无法挂载DOM的问题
如果将编译目标改为:esm后无法挂载DOM,需要注意两点:
- HTML中引入脚本时必须加上
type="module":<script type="module" src="/js/main.js"></script> - 确保入口函数在DOM加载完成后执行,可以在shadow-cljs配置中添加devtools自动重载:
:builds {:app {:devtools {:after-load your.app/init}}}
4. 消除「shadow_esm_import is not defined」错误
这个错误是因为在非ESM编译目标下使用了shadow-cljs的动态导入API。如果不需要动态加载组件,直接用上面的静态导入方式即可;如果必须用动态导入,确保:target设置为:esm,并且HTML脚本是type="module"格式。
内容的提问来源于stack exchange,提问作者Burning_Beef
相关产品推荐
相关产品推荐

