clojurescript - 如何在重新框架应用程序的 js 目录上添加影子 cljs 观察程序?
问题描述
我使用模板创建了一个基本的重新框架应用程序lein new re-frame my-proj
。这个特定的项目与需要一些 ES6 模块和 ES6 类的框架(ecsy)交互,例如由用户生成的代码,而不是简单地从 cljs 调用。由于 Clojurescript 当前不生成 ES6 代码,因此我在我的项目中创建了一些包装 ES6 模块,我计划从中调用 cljs 代码。
经过一番折腾,我发现没有必要将这些 js 包装器模块转换为完整的 npm 模块'node_modules'
,而是我可以简单地将它们放在我的项目的子目录中,例如resources/libs
,然后将此目录添加:js-options
到shadow-cljs.edn
:
{:lein true
:nrepl {:port 8777}
:builds {:app {:target :browser
:output-dir "resources/public/js/compiled"
:asset-path "/js/compiled"
:modules {:app {:init-fn re-pure-ecs-simple.core/init
:preloads [devtools.preload]}}
:devtools {:http-root "resources/public"
:http-port 8280}
;;add this
:js-options {:js-package-dirs ["node_modules" "resources/libs"]}}}}
所以现在一切正常,但唯一的问题是如果我在 'resources/public'
中编辑任何 js 文件,lein.bat dev
编译器不会检测到更改。我可以进去对“.cljs”文件进行模拟更改,这确实会导致编译器重新编译,但它仍然没有接收到对“.js”文件(或“.js”文件所做的更改)。 mjs 的文件)。我必须通过 ctrl-c 杀死编译器并重新启动它以传播更改。不幸的是,这需要大约 15 秒来编译,因为它是一个完整的编译。
我尝试添加'resources/libs'
到我的'project.clj'
:
:source-paths ["src/clj" "src/cljs" "resources/libs"]
无济于事。
我还尝试从以下位置删除已编译的 js 文件<my_proj-dir>/resources/public/js/compiled/cljs-runtime
:
rm 'module$node_modules$systems.js' 'module$node_modules$systems.js.map'
在这种情况下,编译器会重新生成文件(在进行模拟 .cljs 更改时),但它仍然使用以前的版本,例如它必须使用缓存版本。
有没有办法可以在这个 js 目录中添加一个观察者,这样我就可以进行增量构建?'src/cljs' 目录上显然已经有一个观察者了。我咨询了shadow-cljs 用户 gd。但老实说,这有点压倒性。
解决方案
您可以按照用户指南中要求本地 .js的说明进行操作。
基本上,您将.js
文件放入与文件相同的文件夹中.cljs
,然后通过(:require ["./foo.js" :as foo])
. 无需额外配置。
推荐阅读
- asp.net - System.Web.UI.DataVisualization.Charting 自定义指定axisX标签
- visual-studio-code - 智能感知行为
- visual-studio-code - vscode 错误:EROFS:只读文件系统,mkdir
- apache-spark - 如何将不同的时区应用于 PySpark 中的时间戳
- javascript - 如何通过 Firefox Web 控制台“单击”执行 JS 功能的按钮?
- reactjs - Material-UI 选项卡:通过覆盖默认主题更改选定选项卡的文本颜色
- javascript - 为什么我使用 React Hooks 得到空对象?
- python - 当我使用类定义绑定函数时,条目未定义错误显示
- python - 没有类的导入函数给我错误
- javascript - 如何在玩笑中使用 ESM 测试?