react-router vs react-router-dom vs wouter vs @reach/router
前端路由库
react-routerreact-router-domwouter@reach/router类似的npm包:
前端路由库

前端路由库是用于在单页应用(SPA)中管理页面导航和 URL 路径的工具。它们允许开发者定义应用中的不同视图(或组件)与特定 URL 路径之间的映射,从而实现无刷新页面切换。路由库通常提供路由匹配、嵌套路由、动态路由、路由守卫等功能,帮助管理应用的导航状态和历史记录。@reach/router 是一个轻量级的路由库,强调可访问性和简单性,适合需要基本路由功能的项目。react-router 是功能最全的路由库,支持复杂的路由配置、嵌套路由和动态路由,适合大型应用。react-router-domreact-router 的一个子集,专为 Web 应用设计,提供了与 DOM 相关的路由组件。wouter 是一个极简的路由库,注重小巧和性能,适合对包大小敏感的项目。

npm下载趋势
3 年
GitHub Stars 排名
统计详情
npm包名称
下载量
Stars
大小
Issues
发布时间
License
react-router23,599,66756,2424.14 MB1541 个月前MIT
react-router-dom20,542,52056,2425.46 kB1541 个月前MIT
wouter974,2527,74574.8 kB282 个月前Unlicense
@reach/router422,1556,858-1736 年前MIT
功能对比: react-router vs react-router-dom vs wouter vs @reach/router

包大小和性能

  • react-router:

    react-router 是功能最全的路由库,但相对较大。它适合需要丰富路由功能的应用,但可能会对包大小敏感的项目造成影响。

  • react-router-dom:

    react-router-dom 的大小与 react-router 相似,但它提供了专门针对 Web 的组件。对于需要这些组件的 Web 应用来说,增加的开销是值得的。

  • wouter:

    wouter 是一个极小的路由库,几乎不增加任何包大小。它非常适合需要快速加载和低带宽消耗的应用。

  • @reach/router:

    @reach/router 的包大小相对较小,适合对性能敏感的应用。它的设计理念是提供必要的路由功能,而不引入过多的开销。

路由功能

  • react-router:

    react-router 提供全面的路由功能,包括嵌套路由、动态路由、路由守卫等。它支持复杂的路由配置,适合大型应用。

  • react-router-dom:

    react-router-dom 继承了 react-router 的所有功能,并提供了一些与 DOM 相关的组件,如 LinkNavLink。它适合需要这些组件的 Web 应用。

  • wouter:

    wouter 提供基本的路由功能,支持嵌套路由和动态路由。它的功能虽然不如 react-router 丰富,但足够满足大多数简单应用的需求。

  • @reach/router:

    @reach/router 提供基本的路由功能,包括嵌套路由和动态路由。它的 API 简单易懂,适合快速上手。

可访问性

  • react-router:

    react-router 在可访问性方面做得不错,但主要依赖开发者自行实现。它提供的组件和 API 允许开发者创建可访问的应用。

  • react-router-dom:

    react-router-dom 继承了 react-router 的可访问性特性,但同样需要开发者注意实现。它提供的 Link 组件支持可访问性,但具体实现还需开发者把控。

  • wouter:

    wouter 对可访问性的支持较少,主要是一个轻量级的路由库。开发者需要自行确保使用 wouter 时应用的可访问性。

  • @reach/router:

    @reach/router 非常注重可访问性,遵循 WAI-ARIA 标准,确保所有用户,包括残障人士,都能顺利使用。

代码示例

  • react-router:

    react-router 示例

    import { BrowserRouter as Router, Route, Link, Switch } from 'react-router-dom';
    
    const Home = () => <h2>首页</h2>;
    const About = () => <h2>关于</h2>;
    const User = ({ match }) => <h2>用户 ID: {match.params.id}</h2>;
    
    function App() {
      return (
        <Router>
          <nav>
            <Link to="/">首页</Link>
            <Link to="/about">关于</Link>
            <Link to="/user/1">用户 1</Link>
          </nav>
          <Switch>
            <Route path="/" exact component={Home} />
            <Route path="/about" component={About} />
            <Route path="/user/:id" component={User} />
          </Switch>
        </Router>
      );
    }
    
  • react-router-dom:

    react-router-dom 示例

    import { BrowserRouter as Router, Route, Link, Switch } from 'react-router-dom';
    
    const Home = () => <h2>首页</h2>;
    const About = () => <h2>关于</h2>;
    const User = ({ match }) => <h2>用户 ID: {match.params.id}</h2>;
    
    function App() {
      return (
        <Router>
          <nav>
            <Link to="/">首页</Link>
            <Link to="/about">关于</Link>
            <Link to="/user/1">用户 1</Link>
          </nav>
          <Switch>
            <Route path="/" exact component={Home} />
            <Route path="/about" component={About} />
            <Route path="/user/:id" component={User} />
          </Switch>
        </Router>
      );
    }
    
  • wouter:

    wouter 示例

    import { Router, Route, Link } from 'wouter';
    
    const Home = () => <h2>首页</h2>;
    const About = () => <h2>关于</h2>;
    const User = ({ id }) => <h2>用户 ID: {id}</h2>;
    
    function App() {
      return (
        <Router>
          <nav>
            <Link to="/">首页</Link>
            <Link to="/about">关于</Link>
            <Link to="/user/1">用户 1</Link>
          </nav>
          <Route path="/">
            <Home />
          </Route>
          <Route path="/about">
            <About />
          </Route>
          <Route path="/user/:id">
            {({ id }) => <User id={id} />}
          </Route>
        </Router>
      );
    }
    
  • @reach/router:

    @reach/router 示例

    import { Router, Link, Route } from '@reach/router';
    
    const Home = () => <h2>首页</h2>;
    const About = () => <h2>关于</h2>;
    const User = ({ id }) => <h2>用户 ID: {id}</h2>;
    
    function App() {
      return (
        <div>
          <nav>
            <Link to="/">首页</Link>
            <Link to="/about">关于</Link>
            <Link to="/user/1">用户 1</Link>
          </nav>
          <Router>
            <Route path="/" component={Home} />
            <Route path="/about" component={About} />
            <Route path="/user/:id" component={User} />
          </Router>
        </div>
      );
    }
    
如何选择: react-router vs react-router-dom vs wouter vs @reach/router
  • react-router:

    选择 react-router 如果你需要一个功能全面、支持复杂路由配置的库,适合大型应用和需要高度自定义的场景。

  • react-router-dom:

    选择 react-router-dom 如果你正在构建 Web 应用并需要 react-router 提供的所有功能,特别是与 DOM 相关的组件。

  • wouter:

    选择 wouter 如果你需要一个极简、轻量的路由库,且不需要太多额外功能,适合对性能和包大小有严格要求的项目。

  • @reach/router:

    选择 @reach/router 如果你需要一个简单、易于使用且注重可访问性的路由解决方案,适合中小型项目。

react-router的README

react-router is the primary package in the React Router project.

Installation

npm i react-router