MyReact
                                
                                
                                
                                    MyReact copied to clipboard
                            
                            
                            
                        A React like framework. can be used to replace all of the react/react-dom api for test、learn、debug ... ꒰ঌ( ⌯' '⌯)໒꒱
MyReact -- a React like framework
Examples
Online Next.js example https://mrwangjusttodo.github.io/MrWangJustToDo.io/
Install
# install
pnpm add @my-react/react @my-react/react-dom
start in Next.js
# quick start in next.js
pnpm add -D @my-react/react-refresh @my-react/react-refresh-tools
# next.config.js
const withNext = require("@my-react/react-refresh-tools/withNext");
modules.export = withNext(nextConfig);
start in Vite
# quick start in vite
pnpm add -D @my-react/react-refresh @my-react/react-vite
# vite.config.ts
import react from "@my-react/react-vite";
export default defineConfig({
  plugins: [react()],
});
Packages
Development
clone this project
pnpm install
pnpm gen:gql
pnpm build
pnpm dev:ssr / dev:csr / dev:next / dev:vite
Api
| @my-react/react | @my-react/react-dom | @my-react/react-reactive | @my-react/react (hook) | @my-react/react-refresh | @my-react/react-refresh-tools | @my-react/react-vite | 
|---|---|---|---|---|---|---|
| createELement | render | createReactive | useState | babel plugin | webpack plugin | vite plugin | 
| cloneElement | renderToString | reactive | useEffect | refresh runtime | next.js plugin | |
| isValidElement | findDOMNode | ref | useLayoutEffect | webpack loader | ||
| Children | hydrate | computed | useRef | |||
| lazy | createPortal | watch | useMemo | |||
| forwardRef | unmountComponentAtNode | onBeforeMount | useReducer | |||
| createContext | createRoot (new) | onBeforeUnmount | useCallback | |||
| createRef | hydrateRoot (new) | onBeforeUpdate | useContext | |||
| memo | renderToNodeStream | onMounted | useImperativeHandle | |||
| Component | renderToStaticMarkup | onUnmounted | useDebugValue | |||
| PureComponent | renderToStaticNodeStream | onUpdated | useSignal | |||
| StrictMode | renderToPipeableStream (new) | useDeferredValue (new) | ||||
| Fragment | renderToReadableStream (new) | useId (new) | ||||
| Suspense | useInsertionEffect (new) | |||||
| startTransition | useSyncExternalStore (new) | |||||
| useTransition (new) | 
Vue like reactive api
import { reactive, createReactive, onMounted, onUnmounted } from "@my-react/react-reactive";
const useReactiveApi_Position = () => {
  const position = reactive({ x: 0, y: 0 });
  let id = null;
  const action = (e) => ((position.x = e.clientX), (position.y = e.clientY));
  onMounted(() => {
    window.addEventListener("mousemove", action);
  });
  onUnmounted(() => {
    window.removeEventListener("mousemove", action);
  });
  return position;
};
const Reactive1 = createReactive({
  setup(props, context) {
    const position = useReactiveApi_Position();
    const data = reactive({ a: 1 });
    const click = () => data.a++;
    return { data, click, position };
  },
  // or add a render function
  // render: (state, props, context) => xxx
});
const App = () => {
  return (
    <Reactive1 title="hello">
      {({ data, click, position, title }) => (
        <>
          <p>{data.a}</p>
          <button onClick={click}>click</button>
          <p>
            {position.x} {position.y}
          </p>
          {title}
        </>
      )}
    </Reactive1>
  );
};
License
MIT