• Stars
    star
    386
  • Rank 111,213 (Top 3 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 6 years ago
  • Updated almost 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A tiny library inspired by Redux & Vuex to help you manage state in your JavaScript apps

Beedle

The current build status based on whether tests are passing The Uncompressed size of Beedle The GZIP size of Beedle The Brotli size of Beedle License: MIT

Beedle is a tiny library to help you manage state across your application. Inspired by great libraries like Vuex and Redux, Beedle creates a central store that enables you predictably control and cascade state across your application.

This library was initially created as a prototype for this article on CSS-Tricks, where you learn how to build a state management system from scratch with Vanilla JavaScript.

See the documentation — See the project structure

Demos

How it works

Beedle creates a pattern where a single source of truth, the 'Application State' cascades state across your app in a predictable fashion. To modify state, a set flow of actions and mutations help create a traceable data-flow that makes things a little easier to debug.

Using a Pub/Sub pattern which notifies anything that is subscribed to changes, a fully reactive front-end can be achieved with a few kilobytes of vanilla JavaScript.

A flow diagram that shows an action that calls a mutation, which mutates the state and triggers an update to anything that is listening

As the diagram above shows, a simple, predictable flow is created by pushing data into an action which subsequently calls one or more mutations. Only the mutation can modify state, which helps with keeping track of changes.

Continue reading the documentation

A mini library for small projects

Beedle is inspired by libraries like Redux, but certainly isn't designed to replace it. Beedle is aimed more at tiny little applications or where a development team might be looking to create the smallest possible footprint with their JavaScript.

Performance budget

Beedle is intended to be tiny, so the largest that the uncompressed size will ever get to is 5kb.

Browser support

Beedle is aimed at browsers that support ES6 by default. It also uses a Proxy to monitor state, so anything that supports Proxy will support Beedle.

You could use the Proxy polyfill to support more browsers.

Most major browsers will support Beedle with no issues.

Getting started

You can pull Beedle down via npm or take a zip of this repository. The rest of this guide assumes you've used npm.

1) Install

Run npm install beedle in your project directory.

2) Create a store instance

First up, import it into your JavaScript:

import Store from 'beedle';

Once you've got that you should create some actions, mutations and some initial state:

const actions = {
    saySomething(context, payload) {
        context.commit('setMessage', payload);
    }
};

const mutations = {
    setMessage(state, payload) {
        state.message = payload;

        return state;
    }
};

const initialState = {
    message: 'Hello, world'
};

Once you've got those setup, you can create a Store instance like this:

const storeInstance = new Store({
    actions,
    mutations,
    initialState
});

3) Use in your app

Let's say you've got a text box that you type a message into. When the content is changed, it could dispatch a new message to your store:

// Grab the textarea and dispatch the action on 'input'
const textElement = document.querySelector('textarea');

textElement.addEventListener('input', () => {

    // Dispatch the action, which will subsequently pass this message to the mutation
    // which in turn, updates the store's state
    storeInstance.dispatch('saySomething', textElement.value.trim());
});

4) Listen for changes

Beedle uses the Pub/Sub pattern to transmit changes. Let's attach the message to a DOM element:

// Grab the text element and attach it to the stateChange event
const messageElement = document.querySelector('.js-message-element');

// This fires every time the state updates
storeInstance.subscribe(state => {
    messageElement.innerText = state.message;
});

Head over to the basic demo to see this in action 🚀

Acknowledgements

Thanks to Eli Fitch for giving me the idea to call this Beedle. This matches my preference to call my little projects names based on Zelda. Here's Beedle from Zelda.

Thanks to the incredible people who maintain projects such as Redux, Vuex and MobX et. al. Thanks for making our lives easier and for inspiring this project.

More Repositories

1

modern-css-reset

A bare-bones CSS reset for modern web development.
CSS
2,949
star
2

hylia

Hylia is a lightweight Eleventy starter kit to help you to create your own blog or personal website.
Nunjucks
906
star
3

boilerform

Boilerform is a little HTML and CSS boilerplate to take the pain away from working with forms.
CSS
713
star
4

vanilla-js-state-management

A state management system built with vanilla JavaScript with a little demo included
JavaScript
461
star
5

gorko

A tiny Sass token class generator.
SCSS
442
star
6

goron

A simple design token utility class generator
JavaScript
129
star
7

learneleventyfromscratch.com

In this Eleventy course, we go from a completely empty directory to a full-blown marketing site for a design agency, and along the way, we dive really deep into Eleventy and front-end development best practices.
121
star
8

mybrowser.fyi-project

Where the roadmap and issue tracker for https://mybrowser.fyi live
94
star
9

CUBE-with-tailwind

CSS
91
star
10

11ty-base

Eleventy base project
Nunjucks
87
star
11

npm-uninstall-facebook

CSS
85
star
12

hebra

Hebra is a skeletal Eleventy starter kit that gives you nothing but good ol’ HTML and an RSS feed. It serves as the ideal kick-off point for your projects.
HTML
55
star
13

personal-site-eleventy

My site on Eleventy, powered by WordPress and Notion
JavaScript
54
star
14

some-nice-basic-css

HTML
49
star
15

vanilla-js-state-management-boilerplate

The boilerplate to help you build the vanilla state management system
CSS
43
star
16

tatl

A tiny base component to guide you to a consistent Web Component authoring experience
JavaScript
33
star
17

typemate

A little JavaScript module that fixes your typesetting
JavaScript
31
star
18

stalfos

A skeletal collection of Sass helpers with a handy CSS utility class generator.
JavaScript
31
star
19

companies-that-work-with-ice

This is an open source list that you can contribute to
CSS
31
star
20

11ty-base-no-blog

SCSS
28
star
21

educationlinks.fyi

The Coronavirus Pandemic has resulted in school closures in many countries around the globe, so here is a collection of links to help you and your kids to access loads of resources from around the web.
CSS
28
star
22

personal-site-hylia

My personal site, running on Hylia!
HTML
25
star
23

minimal-react-base

This is a little starting point for if you want to sling some React on a HTML page with some CSS.
JavaScript
22
star
24

11ty-pattern-library

Nunjucks
18
star
25

soot-theme

A VS Code theme that's nice and greyscale
13
star
26

progressive-vue-toggle

A demo of how Vue's scoped slots can be handy for progressive enhancement
HTML
8
star
27

webcomponents.club

My little blog about learning web components
HTML
5
star
28

gorko-themes-demo

SCSS
4
star
29

hylia-preview

HTML
4
star
30

chizlvim

My Vim settings
Vim Script
4
star
31

thanksforthereply.com

A fun little web app to thank reply guys
JavaScript
3
star
32

post-helper

A little helper PWA that makes posting notes to my microblog easier
HTML
3
star
33

time.hankchizljaw.com

CSS
3
star
34

2018-goals

My goals for 2018 in a repo for accountability and for me to keep a log of what I've achieved
3
star
35

beedle-vue-demo

A little demo to show how you can use Beedle with Vue JS without a connector
Vue
2
star
36

vim-jsdoc

Vim Script
2
star
37

belkirk-jekyll-demo

HTML
2
star
38

magical-kicks

HTML
2
star
39

CT4009-php-and-mysql

A basic comment form that saves and retrieves data from a MySQL DB
PHP
1
star
40

2019-goals

Goals that I want to acheive in 2019
1
star
41

11ty-js-template-quick-example

JavaScript
1
star
42

weekly-todos

HTML
1
star
43

demos

A little repo to house demos for content on https://piccalil.li/
CSS
1
star
44

base-front-end-project

A useful front-end base project. A little SCSS framework is included along with a mini jQuery starting point. A HTML5 boilerplate is added for good measure too.
CSS
1
star
45

stalfos.io

The Stalfos documentation website
JavaScript
1
star
46

CT4009-sessions-and-cookies

PHP
1
star
47

gorko-custom-props-demo

A little demo to show Gorko using custom properties
SCSS
1
star