如何从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
相关产品推荐
相关产品推荐

