You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:05:01