0

我使用模板创建了一个基本的重新框架应用程序lein new re-frame my-proj。这个特定的项目与需要一些 ES6 模块和 ES6 类的框架(ecsy)交互,例如由用户生成的代码,而不是简单地从 cljs 调用。由于 Clojurescript 当前不生成 ES6 代码,因此我在我的项目中创建了一些包装 ES6 模块,我计划从中调用 cljs 代码。

经过一番折腾,我发现没有必要将这些 js 包装器模块转换为完整的 npm 模块'node_modules',而是我可以简单地将它们放在我的项目的子目录中,例如resources/libs,然后将此目录添加:js-optionsshadow-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。但老实说,这有点压倒性。

4

1 回答 1

0

您可以按照用户指南中要求本地 .js的说明进行操作。

基本上,您将.js文件放入与文件相同的文件夹中.cljs,然后通过(:require ["./foo.js" :as foo]). 无需额外配置。

于 2020-01-25T19:06:54.927 回答