Clojure 多页应用的试剂配置

Clojure 多页应用的试剂配置,clojure,clojurescript,reagent,figwheel,shadow-cljs,Clojure,Clojurescript,Reagent,Figwheel,Shadow Cljs,我的项目.clj已经 :cljsbuild {:builds {:app {:source-paths ["src/cljs" "src/cljc"] :compiler {:output-to "target/cljsbuild/public/js/app.js" :output-dir "target/cljsbuild/public/js/ou

我的
项目.clj
已经

  :cljsbuild {:builds
              {:app
               {:source-paths ["src/cljs" "src/cljc"]
                :compiler {:output-to "target/cljsbuild/public/js/app.js"
                           :output-dir "target/cljsbuild/public/js/out"
                           :main "my.core"
                           :asset-path "/js/out"
                           :optimizations :none
                           :source-map true
                           :pretty-print true}}}}
我在我的
list.html
中包括
app.js
,使用

{% block page-scripts %}
{% script "/js/app.js" %}
{% endblock %}
在我的
列表.cljs
的末尾,我有

(r/render [list] (.getElementById js/document "content"))
到目前为止还不错

现在,我希望有另一个页面,比如说
detail.cljs
,我也希望类似地呈现

(r/render [detail] (.getElementById js/document "content"))
问题是,我只有一个
app.js
,并将其包含在
detail中。html
也将在那里呈现列表内容。顺便说一句,我想要一个用于
列表
页面的url,另一个用于
详细信息

问题:


我应该怎么做呢?

使用shadow cljs,您可以在构建规范中使用不同的
init fn
s指定几个模块

您的
shadow cljs.edn
可能包含以下内容:

{:builds {:client {:target "browser"
                   :modules {:some-page {:init-fn org.example.foo/run}
                             :another-page {:init-fn org.example.bar/run
                                            :depends-on #{:some-page}}}}}}

.js
文件的名称是根据模块名称确定的,这里的
一些page.js
另一个page.js

ClojureScript在过去的两年中,使用Deps/CLI工具和Figwheel Main(也称为Figwheel 2.0)比使用旧的Leiningen方法更容易开发。只需查看
figwheel.org
,然后创建多个
*.cljs.edn
文件,例如:

some-page.cljs.edn
another-page.cljs.edn
...
其中每一项都可以简单到:

{:main some-page.core}
并通过以下方式进行编译:

clojure -m figwheel.main --build-once some-page
它将生成一个输出文件

target/public/cljs-out/some-page-main.js

请务必查看Figwheel的文档,以及
clojurescript.org
。当然,一定要从一开始就检查所有的和。享受吧

对于
shadowcljs
,有一个示例应用程序和一个



注意:您也可以查看该功能,但这是比较有限的。

如果您创建了两个完全独立的版本,用户将不得不重新下载每个页面的所有代码。如果用户可能访问多个页面,则最好使用
:modules
拆分代码,并重新使用共享/缓存的代码,因为这样可以大大减少下载大小。理想情况下,您应该拥有两个页面都依赖的
:shared
模块。这样,每一页都只得到所需的内容。如果您使一个页面依赖于另一个页面(如示例所示),则在访问另一个页面时,将执行两个
:init fn
调用。