isomorphic web apps with rum - clojutre.org · leveraged immutability. may 2013 jan 2014 react om...

35
Isomorphic web apps with Rum by Nikita Prokopov

Upload: others

Post on 04-Aug-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

Isomorphic web apps with Rumby Nikita Prokopov

Page 2: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

NOVOSIBIRSK

MOSCOW

Page 3: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

not existing

not programming

studying programming

not programming Clojure :(

programming Clojure

programming ClojureScript

speaking at ClojuTRE (we’re here)

1985

2001

2005

2012

2015

2016

Page 4: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent
Page 5: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

HISTORY

Page 6: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

May2013

React

Page 7: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

May2013

Dec2013

React Om

Page 8: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

Om

Centralized state atom

Asynchronous rendering

Leveraged immutability

Page 9: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

May2013

Jan2014

React OmReagent

Page 10: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

Reagent

Reactive atoms

Hiccup syntax

Page 11: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

May2013

Feb2014

React OmReagentQuiescent

Page 12: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

Quiescent

Minimal

No state model

Pure functional, no OOP

Page 13: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

May2013

Dec2014

Jan2014

React OmReagentQuiescent

Rum

Page 14: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

May2013

Dec2014

July Nov2015

Jan2014

React OmReagentQuiescent

HoplonPump

FreactiveRum

re-frame

Om.Next

foam

Page 15: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

IDEA

Page 16: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

Rum motivation

Borrow all the good stuff

Mix Om, Reagent, Quiescent models

Be compatible with DataScript

Page 17: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

Rum motivation

Borrow all the good stuff

Mix Om, Reagent, Quiescent and other models

Be compatible with DataScript any storage

Be future-proof

Page 18: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

Solution

Not opinionated

Don’t commit to anything

Build for extension

Page 19: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

Library, not a framework

No mandatory state model

Open, decomplected architecture

Well-defined internals are treated as API

Clear Rum/React mapping, escape hatches

Minimal code base (~900 LOC)

Page 20: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

IMPLEMENTATION

Page 21: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

(rum/defc label [text class] [:div.lbl {:class class} text])

(rum/mount (label "Hello" "header") js/document.body)

Page 22: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

Simpler than React

functions, not classes

arguments, not propsno this (duh)

DOM as data

Page 23: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

(def mixin { :will-mount (fn [state] (assoc state :key (atom nil))) })

(rum/defc label < mixin [text class] [:div.label {:class class} text])

Page 24: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

State

is immutable

lifecycle methods are pure

can’t update component directly

can’t close over a thing that will later change

Page 25: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

Mixins

Pure, composable, no methods

Powerful & decomplected:

– Update logic defined per-component

– Emulate Reagent, Quiescent/PureComponent, Om

– Local state is a mixin

Page 26: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

SERVER-SIDE

Page 27: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

rum/defc Hiccup

React.createElement VDOM

DOM

Ŝablono

React.js

Page 28: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

(rum/defc label [text] [:.label text])

React.createClass({ render: function() { return React.createElement("div", { class: "label" }, this.props.text); }});

Page 29: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

rum/defc Hiccup

Markup HTML

Rum

rum/defc Hiccup

React.createElement VDOM

DOM

Ŝablono

React.js

Page 30: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

(rum/defc label [text] [:.label text])

(defn label [text] (str "<div class='label'>" text "</div>"))

Page 31: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

Server-side rendering

Renders to a string

Use same components via CLJC

3× faster than Hiccup in interpreting mode

No state, no lifecycle

Compatible with React.js server-side renderer

Page 32: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

CONCLUSION

Page 33: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

What’s Rum good for?

Complex single-page apps with fine control

Custom/mixed state models

Server-side rendering and templating

Page 34: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

What’s Rum bad for?

Doesn’t teach you how to write apps

Page 35: Isomorphic web apps with Rum - clojutre.org · Leveraged immutability. May 2013 Jan 2014 React Om Reagent. Reagent Reactive atoms Hiccup syntax. May 2013 Feb 2014 React Om Reagent

Contacts

github.com/tonsky/rum

#tonsky/rum at gitter.im

#rum at clojurians.slack.com

@nikitonsky