Как настроить figwheel-main для перезагрузки кода, который обслуживает clojure backend - PullRequest
0 голосов
/ 27 июня 2019

Я искал ответ на этот вопрос в Интернете, Google и т. Д., Но я не могу найти ничего, что могло бы помочь мне сделать то, что я пытаюсь:

Вот сценарий - У меня есть код clojure, запускающий экземпляр сервера Jetty и обслуживающий контент, включая html, сгенерированный hiccup.

Я добавил clojurescript в микс для обслуживания внешнего интерфейса с помощью реагента. Например. страница, обслуживаемая Jetty, имеет и div id = "app", и скомпилированный реагентом app.js переписывает dom для этого.

Пока все работает .. Я настроил lein для запуска кода clojure и встраивания кода clojurescript в app.js и поместил его в путь к активу в моей конфигурации lein.

Сейчас я пытаюсь выполнить горячую перезагрузку этого кода app.js с помощью figwheel-main..но я ничего не получаю. Используя figwheel-main, он открывает отдельный URL-адрес браузера, который может выполнять горячую перезагрузку ... но это не связано с бэкэндом clojure, который обслуживает контент. то есть figwheel-main, показывающий код clojurescript на локальном хосте: 9500, тогда как Jetty работает на порту 3000.

Я хочу видеть возможность горячей загрузки app.js, обслуживаемого экземпляром Jetty, когда я изменяю код clojurescript.

Я не могу понять, как это сделать.

Я попробовал конфиги из figwheel-main tutorial -i.e deps.edn и т. д., но не могу понять, как интегрировать его с существующим код закрытия.

(defproject myproject "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
            :url "https://www.eclipse.org/legal/epl-2.0/"}
  :dependencies [[org.clojure/clojure "1.10.0"]
                 [metosin/reitit "0.3.7"]
                 [ring "1.7.1"]
                 [migratus "1.2.3"]
                 [com.h2database/h2 "1.4.199"]
                 [org.postgresql/postgresql "42.2.5"]
                 [org.clojure/java.jdbc "0.7.9"]
                 [cumulus "0.1.2"]
                 [com.layerware/hugsql "0.4.9"]
                 [selmer "1.12.12"]
                 [ring-webjars "0.2.0"]
                 [ring/ring-anti-forgery "1.3.0"]
                 [hiccup "1.0.5"]
                 [org.clojure/clojurescript "1.10.520" :scope "provided"]
                 [reagent "0.8.1"]
                 [cljs-ajax "0.8.0"]
                 [org.webjars.npm/bulma "0.7.4"]
                 [org.webjars/font-awesome "5.3.1"]]
  :main ^:skip-aot myproject.core
  :source-paths ["src/clj"]
  :resource-paths ["resources" "target/public"]
  :target-path "target/%s"
  :clean-targets ^{:protect false}
  [:target-path
   [:cljsbuild :builds :app :compiler :output-dir]
   [:cljsbuild :builds :app :compiler :output-to]]
  :cljsbuild {:builds
              [{:source-paths ["src/cljs"]
                :compiler {:main "myproject.core"
                           :asset-path "js/out"
                           :optimizations :none
                           :source-map true
                           :pretty-print true
                           :output-to "target/cljsbuild/public/js/app.js"
                           :output-dir "target/cljsbuild/public/js/out"}}]}
  :plugins [[lein-cljsbuild "1.1.7"]]
  :profiles {:uberjar {:aot :all}
             :dev {:repl-options
                   {:init-ns myproject.core}}

Я ожидаю, что figwheel-main будет работать с контентом, уже обслуживаемым причалом

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Имейте в виду, что у вас есть две программы, запущенные сейчас, одна в CLJS в браузере и другая в CLJ на бэкэнде. Они общаются по сети, что добавляет сложности.

Если вы уже используете Reagent в своем коде CLJS, вы должны добавить икку там (как компонент Reagent) вместо резервной копии.

Если у вас есть данные на бэкенде, затем извлеките их из кода CLJ бэкэнда с помощью вызова AJAX, затем визуализируйте их на внешнем интерфейсе с помощью hiccup, SVG и т. Д. Мы делаем это с помощью большого приложения CLJ + CLJS на работе, где к внутреннему коду обращаются только через вызовы AJAX (в основном асинхронный вызов подпрограммы).

0 голосов
/ 04 июля 2019

Одним из вариантов может быть запуск веб-сервера (скажем, Nginx, прослушивающего порт 9000) во время разработки, который будет маскировать различные порты, на которых работают Figwheel и Jetty.

Вы можете настроить Nginx для обслуживания местоположения/ для статических файлов путем пересылки запроса на Figwheel через порт 3449 и местоположение /api на Jetty на порту 3000 (где ваш сервер обслуживается Jetty).

Во время разработки вы должны подключиться кпорт 9000, и, похоже, все работает на этом порту.Одна вещь, в которой я не уверен, это веб-сокет, который использует Figwheel, но это стоит попробовать.

Вы можете найти пример в документации по Nginx: https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/, но пример конфигурации будет выглядеть так:

server {
  listen 9000;
  listen [::]:9000;

  location / {
      proxy_pass http://localhost:3449/;
  }

  location /api {
      proxy_pass http://localhost:3000/;
  }

}
...