/ferp

Functional Reactive JS App Framework for the Web and Node

Primary LanguageJavaScriptMIT LicenseMIT

ferp

Ferp is the easiest, functional-reactive, zero dependency javascript app framework for nodejs and modern browsers.

But...what is it?

  • Presentation Agnostic - Tie this into your favorite front-end libraries like React and Vue, or commandline tasks like an interactive prompt or sever.
  • Functional+Reactive - Makes it easy to test, control side effects, and keep things immutable.
  • Simple - Everything is standard javascript, there is no misdirection or magic.

What it isn't

  • A vdom implementation - You have to provide your own presentation layer. But the good news is, you can basically pick any one you want.
  • A new language - This isn't like Elm, in the sense of the language. You can always bring this into typescript, but I don't plan on supporting any other languages out of the box.

Where did this come from

Like any great idea, it's based on other (much smarter) people's work, namely:

  • Evan Czaplicki's Elm, the language that made me see the power of the dark side functional reactive programming.
  • Jorge Bucaran's hyperapp, a tiny but powerful functional front-end framework.

Installing

npm install --save ferp

Or grab it from unpkg

<script src="https://unpkg.com/ferp"></script>
<script>
  const { ferp } = window;
</script>

Importing

// es6
import { app, effects } from 'ferp';

// unpkg
import { app, effects } from 'https://unpkg.com/ferp?module=1';

// from a script tag
// <script src="https://unpkg.com/ferp"></script>
const { app, effects } = window.ferp;

// es5/node
const { app, effects } = require('ferp');

Migrating from 0.x to 1.x

See this handy migration guide!

Creating an app

Here's an app that infinitely adds a counter, and logs it.

const ferp = require('ferp');

const initialState = 0;

const incrementAction = (state) => [state + 1, ferp.effects.act(incrementAction)];

ferp.app({
  init: [initialState, ferp.effects.act(incrementAction)],
});

Quick anatomy of an app

Every app needs an init tuple, with the initial state, and initial side effect (or ferp.effects.none() if there isn't one). There is also a subscribe method for managing long-term side-effects, like intervals or websocket communication, and observe to watch for application changes.

You can read more about setting up an application here in the docs.

More docs

Still have questions?