for additional inspiration, i suggest looking at 
https://github.com/juxt/edge

On Monday, 9 July 2018 17:14:22 UTC+1, Gary Johnson wrote:
>
> Howdy Clojurians,
>
> I recently started developing a new Clojure+Clojurescript web application, 
> and I wanted to see if I could set up my development environment using just 
> the Clojure CLI tools. After a good deal of digging around through 
> tutorials on a number of different websites and a fair amount of 
> experimenting, I've managed to create a very simple (IMHO) configuration 
> that provides me with both development and production mode CLJS->JS 
> compilation, development and production mode ring handlers, and the always 
> delightful FIgwheel development environment all from just the simple 
> "clojure" command. Since I haven't seen this before, I thought I'd share it 
> with all of you in case it helps someone else out there who doesn't need 
> (or want) all of leiningen or boot to develop a simple web app.
>
> Here goes:
>
> Step 1: Create your project structure like so:
>
> ├── cljsbuild.edn
> ├── deps.edn
> ├── figwheel.edn
> ├── resources
> │   └── public
> │       ├── cljs
> │       ├── css
> │       │     ├── style.css
> │       ├── images
> │       └── js
> ├── src
> │   ├── clj
> │   │   └── my_project
> │   │       ├── handler.clj
> │   │       ├── server.clj
> │   │       ├── views.clj
> │   └── cljs
> │       └── my_project
> │           ├── client.cljs
>
> Step 2: Make the deps.edn file (replace :deps and my-project.server 
> namespace as necessary for your project)
>
> {:paths ["src/clj" "resources"]
>
>  :deps {org.clojure/clojure       {:mvn/version "1.9.0"}
>         org.clojure/clojurescript {:mvn/version "1.10.312"}
>         ring                      {:mvn/version "1.7.0-RC1"}
>         ring/ring-defaults        {:mvn/version "0.3.2"}
>         prone                     {:mvn/version "1.6.0"}
>         compojure                 {:mvn/version "1.6.1"}
>         hiccup                    {:mvn/version "1.0.5"}
>         reagent                   {:mvn/version "0.8.1"}}
>
>  :aliases {:run        {:main-opts ["-m" "my-project.server"]}
>            :cljsbuild  {:extra-paths ["src/cljs"]
>                         :main-opts ["-m" "cljs.main" "-co" "cljsbuild.edn" 
> "-c"]}
>            :figwheel   {:extra-deps {org.clojure/tools.nrepl {:mvn/version 
> "0.2.13"}
>                                      cider/cider-nrepl       {:mvn/version 
> "0.17.0"}
>                                      com.cemerick/piggieback {:mvn/version 
> "0.2.2"}
>                                      figwheel-sidecar        {:mvn/version 
> "0.5.14"}}
>                         :main-opts ["-e" 
> "(use,'figwheel-sidecar.repl-api),(start-figwheel!)"]}}}
>
>
> Step 3: Make the cljsbuild.edn file (replace :main for your project)
>
> {:main          "my-project.client"
>  :output-dir    "resources/public/cljs"
>  :output-to     "resources/public/cljs/app.js"
>  :source-map    "resources/public/cljs/app.js.map"
>  :optimizations :advanced
>  :pretty-print  false}
>
> Step 4: Make the figwheel.edn file (replace :ring-handler, :on-jsload, and 
> :main for your project)
>
> {:nrepl-port       7000
>  :nrepl-middleware ["cider.nrepl/cider-middleware"
>                     "cemerick.piggieback/wrap-cljs-repl"]
>  :server-port      3000
>  :ring-handler     my-project.handler/development-app
>  :http-server-root "public"
>  :css-dirs         ["resources/public/css"]
>  :builds [{:id           "dev"
>            :source-paths ["src/cljs"]
>            :figwheel     {:on-jsload "my-project.client/mount-root"}
>            :compiler     {:main          "my-project.client"
>                           :output-dir    "resources/public/cljs/out"
>                           :output-to     "resources/public/cljs/app.js"
>                           :asset-path    "/cljs/out"
>                           :source-map    true
>                           :optimizations :none
>                           :pretty-print  true}}]}
>
>
> Step 5: Write server.clj
>
> (ns my-project.server
>   (:require [ring.adapter.jetty :refer [run-jetty]]
>             [my-project.handler :refer [development-app production-app]])
>   (:gen-class))
>
> (defonce server (atom nil))
>
> (defn start-server! [& [port mode]]
>   (reset! server
>           (run-jetty
>            (case mode
>              "dev"  #'development-app
>              "prod" #'production-app
>              #'production-app)
>            {:port (if port (Integer/parseInt port) 3000)
>             :join? false})))
>
> (defn stop-server! []
>   (when @server
>     (.stop @server)
>     (reset! server nil)))
>
> (def -main start-server!)
>
>
> Step 6: Write handler.clj
>
> (ns my-project.handler
>   (:require [ring.middleware.defaults :refer [wrap-defaults site-defaults
> ]]
>             [ring.middleware.reload :refer [wrap-reload]]
>             [prone.middleware :refer [wrap-exceptions]]
>             [compojure.core :refer [defroutes GET]]
>             [compojure.route :refer [not-found]]
>             [my-project.views :refer [render-page]]))
>
> (defroutes routes
>   (GET "/" [] (render-page))
>   (not-found "Not Found"))
>
> (def development-app (wrap-reload
>                       (wrap-exceptions
>                        (wrap-defaults #'routes site-defaults))))
>
> (def production-app (wrap-defaults #'routes site-defaults))
>
>
> Step 7: Write views.clj
>
> (ns my-project.views
>   (:require [hiccup.page :refer [html5 include-css include-js]]))
>
> (defn render-page []
>   (html5
>    [:head
>     [:title "My Project"]
>     [:meta {:charset "utf-8"}]
>     [:meta {:name "viewport" :content "width=device-width, 
> initial-scale=1"}]
>     (include-css "/css/style.css")
>     (include-js "/cljs/app.js")]
>    [:body
>     [:div#app]
>     [:script {:type "text/javascript"} "my_project.client.mount_root();"
> ]))
>
>
>
> Step 8: Write client.cljs (replace Reagent with whichever front-end 
> library you prefer)
>
> (ns my-project.client
>   (:require [reagent.core :as r]))
>
> (defn root-component []
>   [:div [:h1 "Hello world!"]])
>
> (defn ^:export mount-root []
>   (r/render [root-component]
>             (.getElementById js/document "app")))
>
>
> Step 9: Write some CSS in resources/public/css/style.css
>
> #app {
>   border: 2px solid green;
> }
>
> Step 10: Try out your new dev tools!
>
> At this point, your project setup is complete, and you are ready to start 
> developing your awesome new Clojure+Clojurescript web app. You have the 
> following 3 project management commands available at your command prompt:
>
> *1. Compile Clojurescript to Javascript*
>
> To compile the Clojurescript files under src/cljs to Javascript under 
> resources/public/cljs, navigate to the toplevel project directory and run:
>
> $ clojure -A:cljsbuild
>
> The main Javascript entry point file will be written to 
> resources/public/cljs/app.js. The Clojurescript build options are read from 
> the toplevel cljsbuild.edn file. They are set to use advanced compilation 
> mode for a production build.
>
>
> *2. Run your Web Application *
>
> To compile and run your web application, navigate to the toplevel project 
> directory and run:
>
> $ clojure -A:run [port] [dev|prod]
>
> The website will then be available at http://localhost:3000 or on 
> whichever port you specified. In dev mode, server-side exceptions will be 
> displayed in the browser and Clojure source files will be reloaded whenever 
> you refresh the page. These features are disabled in prod mode. If the 
> second argument to run is omitted, it will default to prod mode.
>
>
> *3. Launch Figwheel*
>
> To start the Figwheel server, navigate to the toplevel project directory 
> and run:
>
> $ clojure -A:figwheel
>
> This will start an http-kit webserver on http://localhost:3000, which 
> serves up the website in dev mode. It will also open an nREPL on port 7000, 
> which provides the special command "(cljs-repl)" to switch from a Clojure 
> REPL to a Clojurescript REPL. Finally, any changes to CLJS or CSS files 
> will automatically be pushed to the browser when the
> files are saved.
>
>
> Okay, folks. That's all from me for now. Setting this all up was quite an 
> interesting learning exercise, but I'm very happy with the results. I hope 
> someone out there finds this setup useful for your next Clojure project. If 
> someone has the power to add this tutorial to the Clojure website (or other 
> documentation site), I think it would be a great addition.
>
> Also, someone should definitely make a *clj-new* project template from 
> this setup. *I'm looking at you, Sean Corfield.* ;-D
>
> Have fun, everyone, and happy hacking!
>
> ~Gary
>
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to