mercury

A truly modular frontend framework

  • 所有者: Raynos/mercury
  • 平台:
  • 許可證: MIT License
  • 分類:
  • 主題:
  • 喜歡:
    0
      比較:

Github星跟蹤圖

mercury

build status
NPM version
Coverage Status
David Dependency status
Gitter
Size

Sauce Test Status

A truly modular frontend framework

To understand what I mean by truly modular just read the source

Examples

Hello world

'use strict';

var document = require('global/document');
var hg = require('mercury');
var h = require('mercury').h;

function App() {
    return hg.state({
        value: hg.value(0),
        channels: {
            clicks: incrementCounter
        }
    });
}

function incrementCounter(state) {
    state.value.set(state.value() + 1);
}

App.render = function render(state) {
    return h('div.counter', [
        'The state ', h('code', 'clickCount'),
        ' has value: ' + state.value + '.', h('input.button', {
            type: 'button',
            value: 'Click me!',
            'ev-click': hg.send(state.channels.clicks)
        })
    ]);
};

hg.app(document.body, App(), App.render);

Basic Examples

Intermediate Examples

Unidirectional examples

The following examples demonstrate how you can mix & match
mercury with other frameworks. This is possible because mercury
is fundamentally modular.

Disclaimer: The following are neither "good" nor "bad" ideas.
Your milage may vary on using these ideas

Motivation

Mercury vs React

mercury is similar to react, however it's larger in scope,
it is better compared against om or
quiescent

  • mercury leverages virtual-dom which uses
    an immutable vdom structure
  • mercury comes with observ-struct which uses
    immutable data for your state atom
  • mercury is truly modular, you can trivially swap out
    subsets of it for other modules
  • mercury source code itself is maintainable, the modules it
    uses are all small, well tested and well documented.
    you should not be afraid to use mercury in production
    as it's easy to maintain & fix.
  • mercury encourages zero dom manipulation in your application code. As far as your application is concerned
    elements do not exist. This means you don't need to reference DOM elements when rendering or when handling
    events
  • mercury is compact, it's 11kb min.gzip.js, that's smaller than backbone.
  • mercury strongly encourages FRP techniques and discourages local mutable state.
  • mercury is highly performant, it's faster then React / Om / ember+htmlbars in multiple benchmarks
    TodoMVC benchmark
    animation benchmark
    TodoMVC benchmark source
  • mercury comes with FP features like time-travel / easy undo out of the box.
  • mercury is lean, it's an weekend's read at 2.5kloc. (virtual-dom is 1.1kloc, an evening's read.)
    compared to react which is almost 20kloc (a month's read)

Modules

mercury is a small glue layer that composes a set of modules
that solves a subset of the frontend problem.

If mercury is not ideal for your needs, you should check out
the individual modules and see if you can re-use something.

Alternatively if the default set of modules in mercury doesn't
work for you, you can just require other modules. It's possible
to for example, swap out vtree with
react or swap out observ-struct
with backbone

See the modules README for more
information.

Documentation

See the documentation folder

FAQ

See the FAQ document

API

WIP. In lieu of documentation please see examples :(

Installation

npm install mercury

Development

If you want to develop on mercury you can clone the code

git clone git@github.com:Raynos/mercury
cd mercury
npm install
npm test

npm run tasks

  • npm test runs the tests
  • npm run jshint will run jshint on the code
  • npm run disc will open discify (if globally installed)
  • npm run build will build the html assets for gh-pages
  • npm run examples will start a HTTP server that shows examples
  • npm run dist will create a distributed version of mercury
  • npm run modules-docs will (re)generate docs of mercury modules

Inspirations

A lot of the philosophy and design of mercury is inspired by
the following:

  • react for documenting and explaining the concept
    of a virtual DOM and its diffing algorithm
  • om for explaining the concept and benefits of
    immutable state and time travel.
  • elm for explaining the concept of FRP and having a
    reference implementation of FRP in JavaScript. I wrote a
    pre-cursor to mercury that was literally a
    re-implementation of elm in javascript
    (graphics)
  • reflex for demonstrating the techniques used to
    implement dynamic inputs.

Contributors

  • Raynos
  • Matt-Esch
  • neonstalwart
  • parshap
  • nrw
  • kumavis

MIT Licenced

主要指標

概覽
名稱與所有者Raynos/mercury
主編程語言JavaScript
編程語言JavaScript (語言數: 1)
平台
許可證MIT License
所有者活动
創建於2014-04-01 06:20:47
推送於2020-06-16 08:21:56
最后一次提交2020-06-16 10:19:43
發布數55
最新版本名稱v14.2.0 (發布於 2020-06-16 10:19:43)
第一版名稱v1.0.0 (發布於 2014-04-01 01:17:20)
用户参与
星數2.8k
關注者數101
派生數141
提交數604
已啟用問題?
問題數116
打開的問題數33
拉請求數78
打開的拉請求數0
關閉的拉請求數25
项目设置
已啟用Wiki?
已存檔?
是復刻?
已鎖定?
是鏡像?
是私有?