# Clojure Libs/Frameworks/Tooling for rapid web development

**URL:** https://clojureverse.org/t/clojure-libs-frameworks-tooling-for-rapid-web-development/4017
**Category:** General Questions
**Created:** [March 18, 2019, 3:01pm UTC](https://clojureverse.org/t/clojure-libs-frameworks-tooling-for-rapid-web-development/4017 "2019-03-18T15:01:54Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![ecsmix](https://clojureverse.org/letter_avatar_proxy/v4/letter/e/90ced4/32.png) [@ecsmix](https://clojureverse.org/u/ecsmix)
#### Post date: [March 18, 2019, 3:01pm UTC](https://clojureverse.org/t/clojure-libs-frameworks-tooling-for-rapid-web-development/4017/1 "2019-03-18T15:01:55Z")

</div>

Hi everybody,

How are you?

Doing some research about Clojure, all over the net, a lot of people say it needs much less people to achieve the same results with a team of Java or C# developers.  
I was wondering if this is possible only in the senior level of Clojure?

Is it true comparing Spring / Spring boot or .Net Core or Rails vs Clojure?

Can Clojure libs give the same tools/modules that Spring has?

 ![image](https://clojureverse.org/uploads/default/original/2X/4/4f39eaca49956cef297d0d8bec4b1d35829e4a7b.png)

> **[Car Parking Multiplayer MOD APK v4.9.10.3 Latest version Unlimited Money And...](https://thecarparkingmultimodapk.com)**
>
> Download Car Parking Multiplayer MOD APK v4.9.10.3 2026 latest version with unlimited money & gold. All cars unlocked, W16 engine free. Car Parking download for Android 2026.

How can I compose a similar scenario with Clojure?

Thanks.

---

<div class="post-metadata">

### Author: ![jiyinyiyong](https://clojureverse.org/user_avatar/clojureverse.org/jiyinyiyong/32/85_2.png) [@jiyinyiyong](https://clojureverse.org/u/jiyinyiyong)
#### Post date: [March 18, 2019, 5:20pm UTC](https://clojureverse.org/t/clojure-libs-frameworks-tooling-for-rapid-web-development/4017/2 "2019-03-18T17:20:39Z")

</div>

This video might be relevant. (I’m not a real Coast user though…)

Coast is a full stack web framework… [https://github.com/coast-framework/coast](https://github.com/coast-framework/coast)

---

<div class="post-metadata">

### Author: ![seancorfield](https://clojureverse.org/user_avatar/clojureverse.org/seancorfield/32/195_2.png) [@seancorfield](https://clojureverse.org/u/seancorfield)
#### Post date: [March 18, 2019, 9:00pm UTC](https://clojureverse.org/t/clojure-libs-frameworks-tooling-for-rapid-web-development/4017/3 "2019-03-18T21:00:05Z")

</div>

> [@ecsmix](#):
>
> How can I compose a similar scenario with Clojure?

Clojure favors composable libraries over frameworks, so the general approach is to pick a library you like for each piece of functionality and wire them all up together.

A lot of what you show in that Spring diagram isn’t “relevant” to Clojure in that it doesn’t need most of those things because it’s “just” functions operating on data. For example:

- AOP – tends to be just higher-order functions wrapping other functions – Ring middleware is a great example of cross-cutting concerns implemented as higher-order functions
- ORM – we tend to interact with databases in terms of hash maps and sequences of hash maps – no objects means no ORM (yay!)
- DAO – the simplicity of just reading and inserting hash maps mean no need for DAOs (and, again, no objects)
- Context – mostly composition of simple, single-purpose libraries as needed
- MVC – again, composition of libraries: choose Selmer for Django-style templates, Hiccup for HTML-as-data, and whatever other libraries you need in any given situation
- Web – Ring is the keystone of nearly all Clojure web apps, there are various libraries for routing, and lots of a la carte middleware for “utility” stuff
- Core – no objects means no bean factory, but some aspects of DI/IoC and start/stop lifecycyle still exist and libraries like Component, Mount, Integrant, etc handle that

---

<div class="post-metadata">

### Author: ![ecsmix](https://clojureverse.org/letter_avatar_proxy/v4/letter/e/90ced4/32.png) [@ecsmix](https://clojureverse.org/u/ecsmix)
#### Post date: [March 18, 2019, 9:33pm UTC](https://clojureverse.org/t/clojure-libs-frameworks-tooling-for-rapid-web-development/4017/4 "2019-03-18T21:33:34Z")

</div>

Hi guys, thanks for the answers.

@seancorfield, building everything with libs, could create dependencies problems, right?

You really think, the libs approach and writing everything else by hand would offer a more flexible, better and quicker development than Spring, .net core?  
I know the programmer, needs to learn the specifics of the framework besides the language, using libs only could have the same difficulties?

Specially for a beginner/intermediate Clojure user/programmer, would be able to build something like Spring with Clojure libs?

Thanks.

---

<div class="post-metadata">

### Author: ![seancorfield](https://clojureverse.org/user_avatar/clojureverse.org/seancorfield/32/195_2.png) [@seancorfield](https://clojureverse.org/u/seancorfield)
#### Post date: [March 18, 2019, 10:28pm UTC](https://clojureverse.org/t/clojure-libs-frameworks-tooling-for-rapid-web-development/4017/5 "2019-03-18T22:28:00Z")

</div>

> [@ecsmix](#):
>
> building everything with libs, could create dependencies problems, right?

It could. But Clojure has an ethos of encouraging only accretive, fixative changes, rather than breakage, so picking the most recent version of any given library _should_ work (and indeed that is the approach taken by the CLI / `deps.edn` tools).

> [@](#):
>
> more flexible, better and quicker

More flexible? Definitely. Better? That’s subjective but I think so. Quicker? No, not necessarily. But there are any number of web app templates out there to get you started with whatever combination of libraries you prefer – and most of the work in “interesting” web apps is in the domain/business logic/processing. I think framework-based code is a lot more complex, inherently, than Clojure’s composition-of-libraries approach.

Re: frameworks vs libraries, in terms of learning – Clojure libraries tend to be small and focused so learning each is often less work than learning that same feature in a framework.

Some background: prior to Clojure, I worked in a lot of different languages that were pretty much all framework-based in their approach, dating back as far as Motif, and dealing with several proprietary frameworks (such as BroadVision – which started off in C++, then migrated to Java, and I think on to JavaScript?), as well as various C++ and Java frameworks. I’ve also designed and built open source frameworks over the decades. I can comfortably assert they are all much more complicated and harder to understand than any Clojure web app I’ve built with “just” libraries over the last eight or nine years.

When I first came to Clojure, because of that experience, I also looked for frameworks to “help” me. In fact, I even ported one of my own MVC frameworks from another language into Clojure, on top of Ring, Selmer, and Component. We even used it at work for a short while. The more I used it, the more I tweaked it to be more idiomatic and more “Clojure-y” and it didn’t take long before I could see that the framework was buying me so little value for all the code and conventions it was forcing upon my Clojure code. So I sunsetted the project. If you’re curious, I explained why here [fw1-clj/README.md at master · framework-one/fw1-clj · GitHub](https://github.com/framework-one/fw1-clj/blob/master/README.md)

---

<div class="post-metadata">

### Author: ![ecsmix](https://clojureverse.org/letter_avatar_proxy/v4/letter/e/90ced4/32.png) [@ecsmix](https://clojureverse.org/u/ecsmix)
#### Post date: [March 18, 2019, 10:59pm UTC](https://clojureverse.org/t/clojure-libs-frameworks-tooling-for-rapid-web-development/4017/6 "2019-03-18T22:59:13Z")

</div>

> [@seancorfield](#):
>
> Re: frameworks vs libraries, in terms of learning – Clojure libraries tend to be small and focused so learning each is often less work than learning that same feature in a framework.

As always great answers!! Thanks Sean, I will continue my studies with Closure and I hope I become a success case, Beginner to Ninja!! lol…

> [@seancorfield](#):
>
> I explained why here [fw1-clj/README.md at master · framework-one/fw1-clj · GitHub](https://github.com/framework-one/fw1-clj/blob/master/README.md)

> [@seancorfield](#):
>
> then migrated to Java, and I think on to JavaScript?), as well as various C++ and Java frameworks. I’ve also designed and built open source frameworks over the decades. I can comfortably assert they are all much more complicated and harder to understand than any Clojure web app I’ve built with “just” libraries over the last eight or nine years.

Awesome!!

---

<div class="post-metadata">

### Author: ![ecsmix](https://clojureverse.org/letter_avatar_proxy/v4/letter/e/90ced4/32.png) [@ecsmix](https://clojureverse.org/u/ecsmix)
#### Post date: [March 19, 2019, 7:24am UTC](https://clojureverse.org/t/clojure-libs-frameworks-tooling-for-rapid-web-development/4017/7 "2019-03-19T07:24:44Z")

</div>

I just read two relevant posts to this topic.

> **[The Case for Clojure and GraphQL: Replacing Django | Cheesecake Labs](https://cheesecakelabs.com/blog/case-clojure-graphql-replacing-django/)**
>
> In the last few months, I worked on two projects that were similar in scope and complexity; both were API backends for mobile apps, had similar requirements and timeframes. However, one thing set them apart: one was written in Django + REST while the...

> **[A Phoenix Field Guide For Djangonauts | Cheesecake Labs](https://cheesecakelabs.com/blog/phoenix-framework-guide-django-programmers/)**
>
> First, let me get this out of the way: this is not a Django vs Phoenix post. We at Cheesecake Labs believe polyglotism is good; it gives us options. Since the beginning, we’ve mostly been a Django shop for backend services and will continue to be for...

---

<div class="post-metadata">

### Author: ![HolyJak](https://clojureverse.org/user_avatar/clojureverse.org/holyjak/32/1744_2.png) [@HolyJak](https://clojureverse.org/u/HolyJak)
#### Post date: [March 19, 2019, 11:55am UTC](https://clojureverse.org/t/clojure-libs-frameworks-tooling-for-rapid-web-development/4017/8 "2019-03-19T11:55:03Z")

</div>

@ecsmix sorry to nitpick but it is Clojure, not Closure 🙂

---

<div class="post-metadata">

### Author: ![ecsmix](https://clojureverse.org/letter_avatar_proxy/v4/letter/e/90ced4/32.png) [@ecsmix](https://clojureverse.org/u/ecsmix)
#### Post date: [March 19, 2019, 4:49pm UTC](https://clojureverse.org/t/clojure-libs-frameworks-tooling-for-rapid-web-development/4017/9 "2019-03-19T16:49:19Z")

</div>

I know, I do apologize.

---

<div class="post-metadata">

### Author: ![system](https://clojureverse.org/uploads/default/original/2X/5/51079bf9e4b7d9466242c06cf1e43b9f8bd6da14.png) [@system](https://clojureverse.org/u/system)
#### Post date: [September 18, 2019, 4:49am UTC](https://clojureverse.org/t/clojure-libs-frameworks-tooling-for-rapid-web-development/4017/10 "2019-09-18T04:49:23Z")

</div>

This topic was automatically closed 182 days after the last reply. New replies are no longer allowed.
