0.1.5 • Published 9 months ago

react-mux v0.1.5

Weekly downloads
-
License
MIT
Repository
-
Last release
9 months ago

React Mux

React Mux is the first transition based, suspense-compatible, typesafe router for react.

Get Started

  • npm install react-mux

  • Setup your router

import { Router } from "react-mux";
import { Root } from "./Root";
import { lazy } from "react";

// Fully compatible with lazy-loading
const Home = lazy(() => import("./routes/Home"));
const About = lazy(() => import("./routes/About"));
const Profile = lazy(() => import("./routes/Profile"));

export const router = new Router();

// Export routes so you can link to them in a typesafe manner
// Also allows for easily changing at which path a route lives
// Root wraps the home component as a layout
export const home = router.createRoute("/", Home, Root);
// These routes inherit the path and layout of home
export const about = home.extendRoute("about", About);
// Supports route params
export const profile = home.extendRoute("profile/:id", Profile);
  • Render your application
import { createRoot } from "react-dom/client";
import { RouterProvider } from "react-mux";
import { StrictMode } from "react";
import { router } from "./router";

createRoot(document.getElementById("root")!).render(
  <StrictMode>
    <RouterProvider path={location.pathname} router={router} />
  </StrictMode>
);
  • Use typesafe links
import { profile } from "../router";
import { Link } from "react-mux";

export default function Home() {
  return (
    // Compile-time error if id is not specified
    <Link to={profile} params={{ id: "zuma" }}>
      Zuma's Profile
    </Link>
  );
}
  • Access typesafe params
import { useParams, useClientSideParams } from "react-mux";
import { profile } from "../router";

export default function Profile() {
  // Use this for SSR or SPA apps
  // Immediatly parses the URL, id is typesafe and always a string
  const { id } = useParams(profile);

  // Use this for SSG apps
  // Parses the URL once the app is on the client and hydrated, id is typesafe but is string | undefined
  // This allows you to pre-render dynamic routes, by initially setting all params to undefined
  // Then the params become available once the page has loaded and is hydrated
  const { id } = useClientSideParams(profile);

  return <h1>{id}'s Profile</h1>;
}

Optional SSG

React mux was designed to allow for the pre-rendering of entire static routes, and the shells of dynamic routes. The static pages can then be served by your API server, such as a Go app. It's recommended the SSG is left to a meta framework such as NextJS or Astro.

// Here is a generic psuedo-code example that can be applied to any framework
// [...path].tsx
import { RouterProvider } from "react-mux";
import { router } from "./router";

// Meta framework params sometimes come in as props
type Props = {
  params: Record<string, string>;
};

export default function page(props: Props) {
  return <RouterProvider router={router} path={props.params.path} />;
}

// Use the router to generate one of each page
export function getStaticParams() {
  // For dynamic routes, default any params to the value `$paramName`
  // `useClientSideParams` can then be used to grab the actual param value later
  return router.map((route) => route.path.replace(":", "$"));
}
0.0.1

9 months ago

0.1.2

9 months ago

0.1.1

9 months ago

0.1.4

9 months ago

0.1.3

9 months ago

0.1.5

9 months ago

0.0.0

1 year ago

0.3.0-alpha18

9 years ago

0.3.0-alpha17

9 years ago

0.3.0-alpha16

9 years ago

0.3.0-alpha15

9 years ago

0.3.0-alpha14

9 years ago

0.3.0-alpha13

9 years ago

0.3.0-alpha12

9 years ago

0.3.0-alpha11

9 years ago

0.3.0-alpha10

9 years ago

0.3.0-alpha9

9 years ago

0.3.0-alpha8

9 years ago

0.3.0-alpha7

9 years ago

0.3.0-alpha6

9 years ago

0.3.0-alpha5

9 years ago

0.3.0-alpha4

9 years ago

0.3.0-alpha3

9 years ago

0.3.0-alpha2

9 years ago

0.3.0-alpha1

9 years ago

0.3.0-alpha0

9 years ago

0.2.0-alpha104

9 years ago

0.2.0-alpha103

9 years ago

0.2.0-alpha102

9 years ago

0.2.0-alpha101

9 years ago

0.2.0-alpha100

9 years ago

0.2.0-alpha99

9 years ago

0.2.0-alpha98

9 years ago

0.2.0-alpha97

9 years ago

0.2.0-alpha-97

9 years ago

0.2.0-alpha96

9 years ago

0.2.0-alpha95

9 years ago

0.2.0-alpha94

9 years ago

0.2.0-alpha93

9 years ago

0.2.0-alpha92

9 years ago

0.2.0-alpha91

9 years ago

0.2.0-alpha90

9 years ago

0.2.0-alpha89

9 years ago

0.2.0-alpha88

9 years ago

0.2.0-alpha87

9 years ago

0.2.0-alpha86

9 years ago

0.2.0-alpha85

9 years ago

0.2.0-alpha84

9 years ago

0.2.0-alpha83

9 years ago

0.2.0-alpha-81

9 years ago

0.2.0-alpha80

9 years ago

0.2.0-alpha79

9 years ago

0.2.0-alpha78

9 years ago

0.2.0-alpha77

9 years ago

0.2.0-alpha76

9 years ago

0.2.0-alpha75

9 years ago

0.2.0-alpha74

9 years ago

0.2.0-alpha73

9 years ago

0.2.0-alpha72

9 years ago

0.2.0-alpha71

9 years ago

0.2.0-alpha70

9 years ago

0.2.0-alpha69

9 years ago

0.2.0-alpha68

9 years ago

0.2.0-alpha67

9 years ago

0.2.0-alpha66

9 years ago

0.2.0-alpha65

9 years ago

0.2.0-alpha64

9 years ago

0.2.0-alpha63

9 years ago

0.2.0-alpha62

9 years ago

0.2.0-alpha61

9 years ago

0.2.0-alpha60

9 years ago

0.2.0-alpha59

9 years ago

0.2.0-alpha58

9 years ago

0.2.0-alpha57

9 years ago

0.2.0-alpha56

9 years ago

0.2.0-alpha55

9 years ago

0.2.0-alpha54

9 years ago

0.2.0-alpha53

9 years ago

0.2.0-alpha52

9 years ago

0.2.0-alpha51

9 years ago

0.2.0-alpha50

9 years ago

0.2.0-alpha48

9 years ago

0.2.0-alpha47

9 years ago

0.2.0-alpha46

9 years ago

0.2.0-alpha45

9 years ago

0.2.0-alpha44

9 years ago

0.2.0-alpha43

9 years ago

0.2.0-alpha42

9 years ago

0.2.0-alpha41

9 years ago

0.2.0-alpha40

9 years ago

0.2.0-alpha39

9 years ago

0.2.0-alpha38

9 years ago

0.2.0-alpha37

9 years ago

0.2.0-alpha36

9 years ago

0.2.0-alpha35

9 years ago

0.2.0-alpha34

9 years ago

0.2.0-alpha33

9 years ago

0.2.0-alpha32

9 years ago

0.2.0-alpha31

9 years ago

0.2.0-alpha30

9 years ago

0.2.0-alpha29

9 years ago

0.2.0-alpha28

9 years ago

0.2.0-alpha27

9 years ago

0.2.0-alpha26

9 years ago

0.2.0-alpha25

9 years ago

0.2.0-alpha24

9 years ago

0.2.0-alpha23

9 years ago

0.2.0-alpha21

9 years ago

0.2.0-alpha20

9 years ago

0.2.0-alpha18

9 years ago

0.2.0-alpha17

9 years ago

0.2.0-alpha16

9 years ago

0.2.0-alpha15

9 years ago

0.2.0-alpha14

9 years ago

0.2.0-alpha13

9 years ago

0.2.0-alpha12

9 years ago

0.2.0-alpha11

9 years ago

0.2.0-alpha10

9 years ago

0.2.0-alpha9

9 years ago

0.2.0-alpha8

9 years ago

0.2.0-alpha7

9 years ago

0.2.0-alpha6

9 years ago

0.2.0-alpha5

9 years ago

0.2.0-alpha4

9 years ago

0.2.0-alpha3

9 years ago

0.2.0-alpha2

9 years ago

0.2.0-alpha1

9 years ago

0.1.0-alpha32

9 years ago

0.1.0-alpha31

9 years ago

0.1.0-alpha30

9 years ago

0.1.0-alpha29

9 years ago

0.1.0-alpha28

9 years ago

0.1.0-alpha27

9 years ago

0.1.0-alpha26

9 years ago

0.1.0-alpha25

9 years ago

0.1.0-alpha-24

9 years ago

0.1.0-alpha24

9 years ago

0.1.0-alpha23

9 years ago

0.1.0-alpha22

9 years ago

0.1.0-alpha21

9 years ago

0.1.0-alpha20

9 years ago

0.1.0-alpha19

9 years ago

0.1.0-alpha18

9 years ago

0.1.0-alpha17

9 years ago

0.1.0-alpha-16

9 years ago

0.1.0-alpha16

9 years ago

0.1.0-alpha15

9 years ago

0.1.0-alpha14

9 years ago

0.1.0-alpha13

9 years ago

0.1.0-alpha12

9 years ago

0.1.0-alpha11

9 years ago

0.1.0-alpha10

9 years ago

0.1.0-alpha8

9 years ago

0.1.0-alpha7

9 years ago

0.1.0-alpha5

9 years ago

0.1.0-alpha4

9 years ago

0.1.0-alpha3

9 years ago

0.1.0-alpha2

9 years ago

0.1.0-alpha1

9 years ago

0.1.0

9 years ago

1.0.0

9 years ago