如何将配置不同的shadow-cljs项目A导入项目B并正常使用?
解决方案:跨shadow-cljs配置的项目导入问题
针对你遇到的两个shadow-cljs项目因npm依赖管理方式不同导致的导入失败问题,这里有几个干净的解决思路:
方案一:让项目A输出不包含第三方依赖的模块
既然项目B用webpack统一管理npm依赖,那可以让项目A打包时不把自身的npm依赖打包进产物,转而让B的webpack去解析这些依赖。具体操作:
- 修改项目A的
shadow-cljs.edn,给:npm-moduletarget添加打包配置:
{:targets {:npm-module {:output-dir "dist" :release {:js-options {:bundle-npm false}}}}}
这里的:bundle-npm false是关键,它会让shadow-cljs只打包A自身的CLJS代码,把所有npm依赖标记为外部引用。
2. 执行打包命令:
shadow-cljs release npm-module
- 在项目B中安装本地打包后的A:
npm install ../project-A/dist
此时项目B的webpack会自动解析A的外部npm依赖,从自身的node_modules中加载,避免依赖处理冲突。
方案二:让项目B单独处理项目A的依赖
如果不想修改项目A的打包流程,可以直接在项目B的配置中,把项目A纳入shadow-cljs的处理范围,跳过webpack的外部管理:
- 在项目B的
shadow-cljs.edn的:dependencies里直接引用本地项目A:
:dependencies [[project-A "file:../project-A"]]
- 修改
:js-options配置,排除项目A,不让它被交给webpack处理:
:js-options {:js-provider :external :external-index "target/index.js" :external-exclusions ["project-A"]}
这样shadow-cljs会自己编译项目A的代码,同时用自身的:shadow js-provider处理A的npm依赖,而项目B的其他JS代码依然由webpack管理,实现两种配置的兼容。
为什么之前的方法会失败?
你之前直接打包项目A的:npm-module默认会把A的所有npm依赖一起打包进产物,而项目B用webpack管理依赖时,会出现重复打包、模块解析规则冲突的问题,导致编译失败。上面的两种方案都是从「隔离依赖处理逻辑」的角度解决这个冲突。
内容的提问来源于stack exchange,提问作者Antoine
相关产品推荐
相关产品推荐

