чтобы начать создавать библиотеку, вам нужно сделать модульную, а модульная — это самовызываемая функция, которая возвращает (что-то). Мы будем использовать «выявленный модульный шаблон».

код:

создайте файл с именем customeRedux.js и поместите в него этот код.

(function () {
  // to global controle your modular
  const customRedux = (function () {
    function createStore(reducer) {
      // declare listeners to fill it with the listener in subscribe func
      let listeners = [];

      // get state
      let state;
      const getState = () => state;

      const dispatch = function (action) {
        state = reducer(state, action);
        // call listener for each time dispatch work
        listeners.forEach((lisner) => lisner());
      };
      dispatch({});

      const subscribe = function (listener) {
        // register listener
        listeners.push(listener);
        console.log(listeners);
      };

      return {
        getState,
        dispatch,
        subscribe,
      };
    }

    return {
      createStore,
    };
  })();

  // add to window object as a property
  if (!window.customRedux) {
    window.$redux = window.customRedux = customRedux;
  }
})();

теперь, после сборки нашего Redux, нам нужно его протестировать, поэтому создайте файл с именем, например, test-my-redux.js, а затем поместите в него этот код.

console.log("$redux");
console.log($redux);

// reducer
const WITHDRAW_MONEY = "WITHDRAW_MONEY";
const DEPOSITE_MONEY = "DEPOSITE_MONEY";

const widthdraw = (amount) => {
  return {
    type: WITHDRAW_MONEY,
    payload: amount,
  };
};
const deposite = (amount) => {
  return {
    type: DEPOSITE_MONEY,
    payload: amount,
  };
};

const bankReducer = (state = 1000, action) => {
  switch (action.type) {
    case WITHDRAW_MONEY:
      return state - action.payload;
    case DEPOSITE_MONEY:
      return state + action.payload;
    default:
      return state;
  }
};

const store = $redux.createStore(bankReducer);
console.log(store);
console.log(store.getState());

store.subscribe(() => {
  console.log("BANK STATE:", store.getState());
  value.innerText = `current Bank Amounth: ${store.getState()}`;
});

/* example UI with Redux */
const amount = document.getElementById("amount");
const diposites = document.getElementById("deposite");
const widthraw = document.getElementById("widthraw");
const currentAmount = document.getElementById("currentAmount");
const value = document.getElementById("value");

value.innerText = `current Bank Amounth: ${store.getState()}`;

diposites.addEventListener("click", function () {
  store.dispatch(deposite(+amount.value));
});
widthraw.addEventListener("click", function () {
  store.dispatch(widthdraw(+amount.value));
});

Html-страница Чтобы протестировать на ней:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Build Your Own Redux (Javascript)</title>
  </head>
  <body>
    <input type="number" placeholder="amount" id="amount" />
    <button id="deposite">deposite</button>
    <button id="widthraw">widthraw</button>
    <p id="value"></p>

    <!--
    <script src="./js/script.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/redux/4.2.0/redux.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/redux-thunk/2.4.2/redux-thunk.js"></script>
    -->
    <script src="./js/customRedux.js"></script>
    <script src="./js/test-my-redux.js"></script>
  </body>
</html>

Конечно, приведенная выше реализация немного наивна и уж точно не готова к продакшену! Есть много вещей, которые не были созданы, например промежуточное ПО, асинхронные вызовы или некоторые пограничные случаи. Основной целью этого поста было лишь показать, как это делается, и я надеюсь, что теперь Redux становится более понятным и простым.