【问题标题】:How can I deploy a Reagent application, without needing Figwheel?如何在不需要 Figwheel 的情况下部署 Reagent 应用程序?
【发布时间】:2019-08-27 14:14:21
【问题描述】:

我在 Reagent 中编写了一个 Web 应用程序,并使用 Figwheel 在本地开发和运行它,这很棒。现在我想部署它,所以我运行了“lein ring uberwar”。它说“正在编译 ClojureScript...”(3 次!),这听起来很有希望。但是当我部署war文件并访问该页面时,我会得到以下提示:

ClojureScript has not been compiled!
please run lein figwheel in order to start the compiler

在应用程序启动之前。

Figwheel 是否应该参与生产部署?我可以构建一个没有类似 FOUC 的 flash 的 uberwar 吗?

我找到了How do I deploy a single-page app. written in ClojureScript / Figwheel to a static server?,但它似乎是从头开始的(不是特定于试剂的),而且很多链接都已失效。

我不熟悉 figwheel/uberwar 的工作原理,所以我什至不知道该尝试什么。

即使是简单的 0.8.1 试剂项目 AFAICT,也会发生这种情况。

当我第一次访问该页面时,我非常简短地看到了 Figwheel 警告文本。在页面加载之前,我什么都不想看到。 (或者也许让我放一个自定义微调器或其他东西,但一次只放一件事。)我还希望不必打包并向每个客户发送不必要的 Figwheel 代码,因为它不大,但永远不需要它在那里。

【问题讨论】:

    标签: deployment clojure clojurescript reagent figwheel


    【解决方案1】:

    我想你在找lein uberjar:

    ~/expr/cljs-enflame > lein uberjar
    Created /home/alan/expr/cljs-enflame/target/cljs-enflame-0.1.0-SNAPSHOT.jar
    Created /home/alan/expr/cljs-enflame/target/cljs-enflame-0.1.0-SNAPSHOT-standalone.jar
    

    然后您可以部署独立版本,并使用以下命令启动您的程序:

    > java -jar target/cljs-enflame-0.1.0-SNAPSHOT-standalone.jar
    

    您在project.clj 中指定主程序入口点的位置,例如:

    :main  demo.hello
    

    【讨论】:

    • 嗯,你说的一切都是真的,试剂模板已经包含正确的:main,所以我确实得到了一个 jar 文件,它将所有内容编译成一个令人印象深刻的紧凑“app.js”。但它不是一个战争文件,所以我不能把它按原样传递给我的 Tomcat 服务器——看起来我需要用不同的平台提供一个新的服务器环境。有没有办法获得 uberjar 编译的好处,但在 uberwar 中?
    • 我之前没用过uberwar。通常有一个 clj 后端,cljs 文件myapp.js 位于 ./resources/public/compiled/myapp.js` 下,并从 clj 服务器代码中引用。但是,如果您将app.js 编译好,您就不能像其他任何 JS 应用程序一样部署它吗?
    • 一个试剂应用程序具有客户端 JS、服务器端代码、缩小的 CSS 等。这就是单个 warfile 的好处:我将它交给 Tomcat,它就可以工作。制作一个 uberjar(用于编译)只是为了将其解包并单独重新部署这些部分,这听起来比为无 Tomcat 的 Java SE 平台重新配置我的生产服务器需要更多的工作(并且我有更多的机会搞砸)。跨度>
    • ...re-provisioning my production server for a Tomcat-less Java SE platform... 这就是我的意思。如果 Java main() 方法(可能是 Clojure)启动 Jetty 服务器,那么一切都在一个 uberjar 文件中,这很容易。
    • 好的,我已经在下午辞职了,但理想情况下我希望避免这种情况。有没有办法 uberwar 一个具有完整 AOT 编译的试剂应用程序?这两个(uberjar/uberwar)甚至共享相同的 lein 配置文件——为什么输出功能有如此巨大的差异?
    【解决方案2】:

    我认为您的打包过程需要两个步骤:

    • 首先:使用生产配置文件编译 ClojureScript 代码。你可能有类似的东西,lein cljsbuild prod once 或类似的目标。这个想法是您希望生产配置文件生成单个优化的 JavaScript 文件,该文件将由 Tomcat 作为静态资源提供服务。

    • 第二步:为Tomcat构建WAR文件,使用lein ring uberwar。

    根据您从 Web 应用程序提供静态文件的方式,静态资源的路径可能会发生变化,但除非您添加任何其他配置,否则您将按照此答案中的说明提供静态资源:https://stackoverflow.com/a/7820392/483566

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 2021-11-16
      • 2019-12-26
      相关资源
      最近更新 更多