An implementation of facebook's flux architecture, great Scott!

Capacitor.js is a well tested implementation of facebook's flux architecture written in CoffeeScript, which aims to do the following things:

  • Be as close to the official definition of flux as possible, only making optimizations/features where there's too much boilerplate.
  • Be easy to use, even for beginners, which means it should be easy to do it right, hard to do it wrong.
    • An example is the ActionCreators, which is the only way to dispatch an action without going out of your way.
  • Have all stores be comprised of immutable data with immutable.js
  • Handle relationships between stores with ease, without the boilerplate
  • Be easy to extend, where extensions make sense.
  • Scale well when used in teams by heavily encouraging thought before code, and try to minize how many ways you can solve a single problem.
  • Feel great to use in CoffeeScript
  • Feel just as great to use in TypeScript/ES6
  • Support all the loaders, AMD/CommonJS/ES6/Globals whatever you need.
  • The dispatcher is an implementation detail, you never interact with it manually.
  • Actions are class instances, no giant switch statements needed.
  • Stores listen for actions by using the action classes.
  • Four types of stores to model your data:
    • Store (generic state)
    • EntityStore (anything with an id)
    • ListStore (a list of entities)
    • IndexedListStore (a map from an entity id to a list of entity ids)
  • With these four stores you can model the following:
    • one to one (Entity/Store -> Entity)
    • one to many (Entity/Store -> List -> Entity)
    • many to many (Entity/Store -> IndexedList -> Entity)
  • ActionCreators dispatch actions.
  • Batch change events on stores within a dispatch iteration to simplify store interactions.
  • [ ] Webpack Hot Loader
  • [ ] Chrome Devtools Extension(s)
  • [ ] State snapshots
  • [ ] Replayable action logs
  • lodash
  • immutable-js

Stores now use immutable js for the data. The API is still the same but the data returned is now instances of immutable's classes. See for usage. Unfortunately this completely breaks backwards compatibility.