Package Exports
- choo
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (choo) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
choo 
A framework for creating sturdy web applications. Built on years of industry experience and distills the essence of functional architectures into a productive package.
Features
- minimal size: weighing under
8kb,choois a tiny little framework - single state: immutable single state helps reason about changes
- minimal tooling: built for the cutting edge
browserifycompiler - transparent side effects: using "effects" and "subscriptions" brings clarity to IO
- omakase: composed out of a balanced selection of open source packages
- idempotent: renders seemlessly in both Node and browsers
- very cute: choo choo!
Usage
const choo = require('choo')
const app = choo()
app.model('title', {
state: {
title: 'my-demo-app'
},
reducers: {
'update': (action, state) => ({ title: action.payload })
},
effects: {
'update': (action, state, send) => (document.title = action.payload)
}
})
const mainView = (params, state, send) => choo.view`
<main class="app">
<h1>${state.title}</h1>
<label>Set the title</label>
<input
type="text"
placeholder=${state.title}
oninput=${(e) => send('title:update', { payload: e.target.value })}>
</main>
`
app.router((route) => [
route('/', mainView)
])
const tree = app.start()
document.body.appendChild(tree)Concepts
- state: a single object that contains all application state, should only
ever be modified by
reducers - reducers: syncronous functions that modify
state - effects: asyncronous functions that perform IO. Effects should call
send()when done - subscriptions: streams of data that can either be written to or read from
API
app = choo()
Create a new choo app
app.model(name?, obj)
Create a new model. Models modify data and perform IO. Obj takes the following arguments:
- state: object. Key value store of initial values
- reducers: object. Syncronous functions that modify state. Each function
has a signature of
(action, state) - effects: object. Asyncronous functions that perform IO. Each function has
a signature of
(action, state, send)wheresendis a reference toapp.send()
If a name string is passed as a first argument, reducers and signatures
will be prefixed by the name. So if name is "user" and a reducer called
"update" is registered, it would be accessed as 'user:update' in send().
choo.view`html`
Tagged template string HTML builder. See
yo-yo for full documentation. Views
should be passed to app.router()
app.router(params, state, send)
Creates a new router. See
sheet-router for full
documentation. Registered views have a signature of (params, state, send),
where params is URI partials.
tree = app.start()
Start the application. Returns a DOM element that can be mounted using
document.body.appendChild().
Packages used
- views:
yo-yo - models:
send-action,xtend - routes:
sheet-router
Optimizing
To bring down file size, consider running the following browserify
transforms:
- unassertify - remove
assert()statements which reduces file size. Use as a--globaltransform - varify - replace
constwithvarstatements. Use as a--globaltransform - uglifyify - minify your code using
UglifyJS2. Use as a
--globaltransform
Packages that work well together
Installation
$ npm install choo