{"id":13393162,"url":"https://github.com/magomimmo/modern-cljs","last_synced_at":"2025-05-15T03:08:35.483Z","repository":{"id":44369755,"uuid":"6515538","full_name":"magomimmo/modern-cljs","owner":"magomimmo","description":"A series of tutorials on ClojureScript","archived":false,"fork":false,"pushed_at":"2020-10-09T18:44:09.000Z","size":34172,"stargazers_count":2920,"open_issues_count":37,"forks_count":287,"subscribers_count":116,"default_branch":"master","last_synced_at":"2025-04-14T03:11:40.546Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/magomimmo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-11-03T02:20:48.000Z","updated_at":"2025-04-05T21:13:00.000Z","dependencies_parsed_at":"2022-08-30T07:01:17.002Z","dependency_job_id":null,"html_url":"https://github.com/magomimmo/modern-cljs","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/magomimmo%2Fmodern-cljs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/magomimmo%2Fmodern-cljs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/magomimmo%2Fmodern-cljs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/magomimmo%2Fmodern-cljs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/magomimmo","download_url":"https://codeload.github.com/magomimmo/modern-cljs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254264771,"owners_count":22041794,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-30T17:00:44.375Z","updated_at":"2025-05-15T03:08:30.450Z","avatar_url":"https://github.com/magomimmo.png","language":"Clojure","funding_links":[],"categories":["Clojure","ClojureScript","info","Github","\u003ca name=\"Clojure\"\u003e\u003c/a\u003eClojure"],"sub_categories":["tutorial"],"readme":"## Latest tutorials\n\n### [Tutorial 22 - A reasoned porting of the Official React Tutorial to Reagent - Part II][47]\n\nPart II of a step by step reasoned porting of the [Official React Tutorial][48] to [Reagent][49].\n\n### [Tutorial 21 - A reasoned porting of the Official React Tutorial to Reagent - Part I][46]\n\nPart I of a step by step reasoned porting of the [Official React Tutorial][48] to [Reagent][49].\n\n### [Tutorial 20 - House Keeping][40]\n\nStep by step guide for publishing a library to clojars repository by\nusing `boot`.\n\n# Modern ClojureScript\n\n\u003e **ATTENTION NOTE**: I'm in the process of publishing the\n\u003e [second edition][1] of the series. The main difference from the\n\u003e [first edition][2] regards the use of the [Boot][3] build tool instead\n\u003e of [Leiningen][4]. This second edition is still a draft version and\n\u003e you should be forgiving if you find errors, typos or even bugs in\n\u003e the code.\n\n\n\u003e **WARNING NOTE FOR WINDOWS USERS**: At the moment `boot` does not run\n\u003e on MS Windows less than 10. If this is your case, to be able to\n\u003e follow the `modern-cljs` series you can use use a\n\u003e [virtual machine](https://www.virtualbox.org/) or\n\u003e [docker linux container](https://docs.docker.com/windows/).\n\nModern ClojureScript (`modern-cljs`) is a series of tutorials that\nguide you in creating and running [ClojureScript][5] (CLJS) projects.\n\nCLJS is a compiler for the Clojure programming language that targets\nJavaScript. It emits JavaScript code which runs in web browsers and\nother client-side or server-side JavaScript interpreters\n(e.g. [nodejs][6]).\n\n## Required background\n\nThese tutorials require that you have some prior programming\nexperience.  They assume you've gotten your hands dirty by trying a\nlittle Clojure, even if you're not proficient in it yet. It will also\nbe quite helpful if you have some experience programming for the Web\nusing HTML, JavaScript and the browser DOM.\n\nIf you don't know anything about Clojure (or about Lisp), I recommend\nyou learn a little bit before starting these tutorials.\n\nThere are plenty of outstanding resources on Clojure that are freely\navailable on the Internet, and you can't overestimate the benefit of\nreading a book on Clojure (or another Lisp dialect) to your value as a\nprogrammer.\n\nHere are some book recommendations:\n\n* [Clojure Programming][7]: written by three of the heroes of Clojure,\n  it contains everything you need to know about Clojure and its\n  ecosystem.\n* [Programming Clojure][8]: written by another legendary Clojure\n  developer, it's the easiest path to learning Clojure.\n* [The Joy of Clojure][9]: the title speaks by itself. A must read!\n* [ClojureScript Rationale][41] and [ClojureScript Quick Start][42]\n* [ClojureScript Up and Running][10]: at the moment, it's the only\n  published book on ClojureScript. The book is a bit outdated since\n  ClojureScript is evolving quickly. It's brief and useful, especially\n  if you want to integrate with external JavaScript libraries.\n* [SICP - Structure and Interpretation of Computer Programs][11]: this\n  is the best programming book I've read in my very long career. It\n  uses [Scheme/Racket][12] (a Lisp dialect) rather than Clojure and is\n  available [online][13], in [print][13], or in a\n  [lecture series][14].\n* [On Lisp][15]: if you want to learn about macros, this is the place\n  to start.  It uses Common Lisp (a Lisp dialect) rather than Clojure.\n\n## Required tools\n\nMany people worry about which operating system and editor/IDE are best\nfor developing in Clojure and ClojureScript. I personally use Mac OS\nX, Debian and Ubuntu. I use Emacs as an editor.\n\nBecause I'm an old-timer, [*nix][43] and Emacs are the OS and editor I know best.\nThat being said, in this series of tutorials you're not going to find any\nsuggestions or reference to operating systems or editors. Use whatever tools\nyou already have and know. I have too much respect for people developing\nIDE/plugins for Clojure/CLJS to say that one is better than another, and\nyou don't want to combine learning a new programming language with trying\nto learn a new programming environment.\n\n\u003e NOTE: If you are interested in learning more about Emacs here are some\n[resources to help get you started]\n(https://github.com/magomimmo/modern-cljs/blob/master/doc/supplemental-material/emacs-cider-references.md).\n\nYou will need to have [git][16] and [Java][34] installed and you'll\nneed some familiarity with the [basics of git][17].\n\n## Clojure community documentation\n\nCommunity created clojure documentation sites that you may find helpful are\n[clojuredocs](http://clojuredocs.org/) and [Grimoire](https://www.conj.io/).\n\n## Libraries and tools\n\n[Clojure Toolbox](http://www.clojure-toolbox.com/) is a directory of\nlibraries and tools for CLJ/CLJS.\n\n## Why the name Modern ClojureScript?\n\nYou might wonder why this tutorial series is named `modern-cljs` when\nClojureScript is so recent. I started this series in 2012 while trying\nto port a few examples from the\n[Modern JavaScript: Develop and Design][18] book to ClojureScript, and\nnow it's too late to change.\n\n# The Tutorials\n\nAs said, this is the [second edition][1] of the series and is based on\nthe [Boot][3] build tool. I'm not going to update or support the\n[first edition][2] of the series which was based on the [Leiningen][4]\nbuild tool.\n\n## Introduction\n\nThis series of tutorials guides you in creating and running simple CLJS\nprojects. The bulk of the series follows the progressive enhancement of\na single project.\n\nWhile working through the tutorials I *strongly* suggest you start at\ntutorial 1 and type in all the code for each tutorial yourself.\nIn my experience this is the the best approach if you're not already\nvery fluent with the programming language.\n\n## [Tutorial 1 - The Basics][19]\n\nCreate and configure a very basic CLJS project.\n\n## [Tutorial 2 - Immediate Feedback Principle][20]\n\nApproach as close as possible the Bret Victor Immediate Feedback\nPrinciple to build a very interactive development environment.\n\n## [Tutorial 3 - House Keeping][21]\n\nAutomate the launching of the `boot` command to approach the Immediate\nFeedback Development Environment (IFDE).\n\n## [Tutorial 4 - Modern ClojureScript][22]\n\nHave some fun with CLJS form validation by porting the JavaScript login form\nexample from [Modern JavaScript: Develop and Design][18] to CLJS.\n\n## [Tutorial 5 - Introducing Domina][23]\n\nUse the [Domina library][24] to make our login form validation more Clojure-ish.\n\n## [Tutorial 6 - The Easy Made Complex, and the Simple Made Easy][25]\n\nInvestigate and find two different ways to solve an issue from the last\ntutorial.\n\n## [Tutorial 7 - Introducing Domina Events][26]\n\nUse Domina events for a more Clojure-ish approach to handling DOM events.\n\n## [Tutorial 8 - DOM Manipulation][27]\n\nProgrammatically manipulate DOM elements in response to DOM events.\n\n## [Tutorial 9 - Introducing AJAX][28]\n\nUse AJAX to let the CLJS client-side code communicate with the server.\n\n## [Tutorial 10 - A Deeper Understanding of Domina Events][29]\n\nApply Domina events to the login form example from the\n[4th Tutorial][22].\n\n## [Tutorial 11 - HTML on Top, Clojure on the Bottom][30]\n\nExplore the highest (HTML5) and deepest (Clojure on the server) layers\nof the login form example from the [previous tutorial][29].\n\n## [Tutorial 12 - Don't Repeat Yourself][31]\n\nRespect the [Don't Repeat Yourself (DRY) principle][44] by sharing\nvalidators between the client-side CLJS and the server-side Clojure.\n\n## [Tutorial 13 - Better Safe Than Sorry (Part 1)][32]\n\nSet the stage for unit testing by learning about the `Enlive` template\nsytem and starting the shopping calculator example. Use code\nrefactoring to satisfy the [DRY principle][44] and to solve a cyclic\nnamespaces dependency problem.\n\n## [Tutorial 14 - Better Safe Than Sorry (Part 2)][33]\n\nAdd validators to the `shoppingForm`, and do some unit testing.\n\n## [Tutorial 15 - Better Safe Than Sorry (Part 3)][35]\n\nConfigure a development environment that simultaneously satisfy in a\nsingle JVM the Immediate Feedback Principle by Bret Victor and the\n[Test Driven Development (TDD)][45].\n\n## [Tutorial 16 - On pleasing TDD practitioners][36]\n\nMake the [Test Driven Development][45] Environment more customizable.\n\n## [Tutorial 17 - REPLing with Enlive][37]\n\nIntegrate validators into a web form in such a way that the\nuser will be notified with the corresponding help messages when they\nenter invalid values in the form.\n\n## [Tutorial 18 - Augmented TDD session][38]\n\nComplete the client-side form validation by exploiting the [TDD][45]\nenvironment augmented with CLJ/CLJS REPLs.\n\n## [Tutorial 19 - Livin' on the edge][39]\n\nExplain how to make a library compliant with the new Reader\nConditionals extension on CLJ/CLJS compilers.\n\n## [Tutorial 20 - House Keeping][40]\n\nStep by step guide for publishing a library to clojar repository by\nusing `boot`.\n\n## [Tutorial 21 - A reasoned porting of the Official React Tutorial to Reagent - Part I][46]\n\nPart I of a step by step reasoned porting of the [Official React Tutorial][48] to [Reagent][49].\n\n## [Tutorial 22 - A reasoned porting of the Official React Tutorial to Reagent - Part II][47]\n\nPart II of a step by step reasoned porting of the [Official React Tutorial][48] to [Reagent][49].\n\n# License\n\nCopyright © Mimmo Cosenza, 2012-2016. Released under the Eclipse Public\nLicense, the same license as Clojure.\n\n\n[1]: https://github.com/magomimmo/modern-cljs/tree/master/doc/second-edition\n[2]: https://github.com/magomimmo/modern-cljs/tree/master/doc/first-edition\n[3]: https://github.com/boot-clj/boot\n[4]: http://leiningen.org/\n[5]: https://github.com/clojure/clojurescript.git\n[6]: https://github.com/clojure/clojurescript/wiki/Quick-Start#running-clojurescript-on-nodejs\n[7]: http://www.clojurebook.com/\n[8]: http://pragprog.com/book/shcloj2/programming-clojure\n[9]: http://www.joyofclojure.com/\n[10]: http://shop.oreilly.com/product/0636920025139.do\n[11]: http://mitpress.mit.edu/sicp/\n[12]: http://racket-lang.org/\n[13]: http://mitpress.mit.edu/sicp/full-text/book/book.html\n[14]: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-001-structure-and-interpretation-of-computer-programs-spring-2005/index.htm\n[15]: http://www.paulgraham.com/onlisp.html\n[16]: http://git-scm.com/\n[17]: http://git-scm.com/documentation\n[18]: http://www.larryullman.com/books/modern-javascript-develop-and-design/\n[19]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-01.md\n[20]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-02.md\n[21]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-03.md\n[22]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-04.md\n[23]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-05.md\n[24]: https://github.com/levand/domina\n[25]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-06.md\n[26]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-07.md\n[27]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-08.md\n[28]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-09.md\n[29]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-10.md\n[30]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-11.md\n[31]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-12.md\n[32]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-13.md\n[33]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-14.md\n[34]: https://github.com/clojure/clojurescript.git\n[35]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-15.md\n[36]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-16.md\n[37]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-17.md\n[38]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-18.md\n[39]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-19.md\n[40]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-20.md\n[41]: https://github.com/clojure/clojurescript/wiki/Rationale\n[42]: https://github.com/clojure/clojurescript/wiki/Quick-Start\n[43]: https://en.wikipedia.org/wiki/Unix-like\n[44]: https://en.wikipedia.org/wiki/Don%27t_repeat_yourself\n[45]: https://en.wikipedia.org/wiki/Test-driven_development\n[46]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-21.md\n[47]: https://github.com/magomimmo/modern-cljs/blob/master/doc/second-edition/tutorial-22.md\n[48]: https://facebook.github.io/react/docs/tutorial.html\n[49]: http://reagent-project.github.io/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmagomimmo%2Fmodern-cljs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmagomimmo%2Fmodern-cljs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmagomimmo%2Fmodern-cljs/lists"}