Code Monkey home page Code Monkey logo

pureact's Introduction

Pureact - what React should have been if we knew what it was when it was discovered

This is very small implementation of the idea of React+Redux with a very light weight approach. The result is a small lib (65 lines of code, 10kb incl dependencies gzipped) and superfast (based on snabbdom) with batteries included (a minmal version of Redux).

Get started

Pure functions are a fantastic way to represent a component and an entire app.

    // index.html
    <html><body><script src="index.js"></script></html>
    // index.js
    import Pureact from 'pureact'
    const state = {user: 'John'}
    const App = (props) => <h1>Hi {props.user}</h1>
    Pureact.render(<App {...state} />, document.body)
    // start your app
    $> parcel index.html

Demo

Install Pureact

npm i pureact
npm i -g parcel

Add pureact pragma in .babelrc

"plugins": [
  ["transform-react-jsx", { "pragma": "Pureact.createElement" }]
]

Start coding

Then define your app with pure functions:

    const props = {name}
    const App = (props) => <h1>Hi {props.user}</h1>
    Pureact.render(<App {props} />, document.body))

Run and ship it

// starts dev server and listens to changes
parcel index.html

// package
parcel build index.html // 16kb

Also pure components

...or using components with a pure render function. Only render method is supported, no other lifetime or state methods are implemented (intentional to keep the pure fashion)

    import Pureact, { Component } from 'pureact';
    import logo from './logo.svg';
    import './App.css';

    class App extends Component {
      render() {
        return (
          <div className="App">
            <div className="App-header">
              <img src={logo} className="App-logo" alt="logo" />
              <h2>Welcome to React {this.props.name}!</h2>
            </div>
            <p className="App-intro">
              To get started, edit <code>src/App.js</code> and save to reload.
            </p>
          </div>
        );
      }
    }

    export default App;

A lightweight redux-compatible store is also included

    import Pureact, { createStore } from 'pureact'
    
    const reducer = (state, action) => ({
      ...state,
      name: action.name // naive example
    })

    const store = createStore(reducer)

Plug it in in your render lifecycle:

    const App = (props) => <h1>{props.name}</h1>
    let oldTree
    
    store.subscribe(() => {
      const state = store.getState()
      oldTree = Pureact.render(<App {...state} />, document.body, oldTree)
    })

To dispatch events, just use the dispatcher

    store.dispatch({
      type: 'UPDATE_NAME',
      name
    })

Note that both reducers and actions can be asyncronous (!)

   const reducer = async (state, action) => ({
     user: await user(state.user, action)
   })
   
   store.dispatch(() => fetch('/user').then(user => ({ type: 'UPDATE_USER', user}))

(both promises and thunks are supported)

Hooks are also included (beta - only works for non-lists right now)

    import React, { useState } from 'pureact'
    
    const Name = (props) => {
      const [name, setName] = useState('')
      return <div><input type="text" value={name} onchange={e => setName(e.target.value)}/></div>
    }

Motivation

  • React is a great idea but has become bloated
  • Redux is a great idea but should have been included
  • Pure functions are a great way of describing components

Current state

The lib has been used in production for a year without any problems. With the latest development in React which moves in the same direction (pure functions and state/hooks included you start to wonder why not just use 66 lines of clde instead of thousands?

Let me know if you miss anything important. Either send a pull request or issue. I'm going to try to keep this lib as tiny as possible.

License

MIT, © Copyright 2020 Christian Landgren @ Iteam

pureact's People

Contributors

irony avatar

Stargazers

Roman avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.