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

如何从ClojureScript导入npm包?solid-js导入失败咨询

解决cljs.main导入solid-js失败的问题

你的问题核心确实是solid-js包根目录没有index.js:cljs.main默认会查找包根的index.js作为模块入口,但solid-js采用了现代ESM的exports字段在package.json里定义多环境入口,而cljs.main的默认模块解析逻辑不支持这种配置——这就是react能正常导入(react包根有index.js),但solid-js不行的原因。shadow-cljs对现代模块规范的支持更完善,所以能自动识别solid-js的入口。

下面是具体的解决办法:

1. 直接指定solid-js的具体入口文件

查看solid-js的package.json可以看到,它的浏览器环境入口是dist/solid.js,CommonJS入口是dist/solid.cjs,你可以直接导入这个具体路径来绕过cljs.main的模块解析限制:

(ns hello.core
    (:require 
        [react :as r]
        ["solid-js/dist/solid.js" :as s]))

(js/console.log r s)

2. 配置cljs.main支持模块exports字段

你已经安装了@cljs-oss/module-deps,可以通过配置让cljs.main使用它来解析支持exports字段的npm包。创建一个cljs.edn配置文件:

{:main hello.core
 :repl-opts {:launch-browser false}
 :npm-deps {:react "18.2.0"
            :solid-js "1.7.5"}
 :foreign-libs [{:file "node_modules/solid-js/dist/solid.js"
                 :provides ["solid-js"]
                 :module-type :es6}]}

然后用以下命令启动编译和REPL:

clj -M --main cljs.main --compile hello.core --repl --config cljs.edn

3. 关于webpack打包的疑问

不需要必须用shadow-cljs。你可以分两步处理:

  • 先用cljs.main编译ClojureScript代码到指定输出目录(比如out/main.js)
  • 配置webpack将这个输出文件作为entry,webpack会自动解析所有依赖的npm模块(包括solid-js,因为webpack完全支持exports字段),最终完成打包

这样既保留了cljs.main的编译能力,又能利用webpack的打包特性。

内容的提问来源于stack exchange,提问作者kmrk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:05:13