【问题标题】:Mac M1 Attempted import error: 'Switch' is not exported from 'react-router'Mac M1 尝试导入错误:“Switch”未从“react-router”导出
【发布时间】:2022-01-13 04:51:11
【问题描述】:

在 Windows 上,npm run start 可以正常工作,但在 m1 上 npm run start 会出错。
您为什么要这样做?

Failed to compile
./node_modules/react-router-config/esm/react-router-config.js
Attempted import error: 'Switch' is not exported from 'react-router'.
This error occurred during the build time and cannot be dismissed.

"react-router-dom": "^5.3.0", "react-scripts": "^4.0.1",

这是 app.js 代码。

import React from 'react';
import { BrowserRouter } from 'react-router-dom';
import routes from "./Routes";
import {renderRoutes} from "react-router-config";


import theme from './theme';
import {ThemeProvider} from "styled-components";

export default function App() {
    return (
                    <BrowserRouter>
                        {renderRoutes(routes)}
                    </BrowserRouter>
    );
};
``

【问题讨论】:

  • Switch 已替换为 routes 如果您使用的是 react-router v6。所以检查一下。

标签: reactjs react-router


【解决方案1】:

如果您不小心将 react-router-dom 更新到版本 6,它将不再导出 Switch 组件。它被一个Routes 组件替换,必须直接包装/渲染Route 组件。

  1. Switch 替换为Routes 组件。

    import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
    ...
    
    function App() {
      return (
        <Router>
          <Routes>
            <Route path="/" element={<Home/>} />
          </Routes>
        </Router>
      );
    }
    

    按照Upgrading from v5 将您的项目从 v5 迁移到您的应用程序中的 v6,因为有很多重大的组件 API 更改。

  2. 恢复到react-router-dom v5。

    • 运行npm un -s react-router-dom
    • 运行npm i -s react-router-dom@5.3.0

【讨论】:

  • 我有一部分需要立即更新,我真的需要迁移吗?旧版本也会有错误吗?
  • @skksks 我会恢复到 v5 直到准备好升级,特别是如果有非平凡的工作要做的话。
  • react-router-dom 是第 5 版,但我不断收到 switch 错误。
  • 如果您运行的是 RRDv5,那么它当然应该导出一个 Switch 组件。从您的项目目录运行npm list react-router-dom 以查看实际安装的版本。如果您使用的是 v5,请确保您已停止/杀死任何代码观察程序/热重载程序并重新启动您的开发服务器。
  • 您好像安装了两个版本?你在单一回购中运行吗? v6 中的任何一个都应该回滚到 v5 以匹配您应用中的所有使用情况。
【解决方案2】:

问题好像是react-router-dom的版本问题你写的代码好像和version 5兼容,你安装的包很可能是version 6。请检查。

version 6

  1. Switch 替换为 Routes
  2. 路由的默认行为是匹配确切的路由。
  3. component={Loader} 现在必须写为 element={&lt;Loader /&gt;}
  4. useHistory 替换为 useNavigate
  5. 我们列出路线的顺序无关紧要。该算法现在选择最佳匹配。

升级到 v6 的步骤

npm uninstall react-router-dom
npm install react-router-dom@6

然后按照下面提到的教程对代码进行更改。它应该开始正常工作了。

import { BrowserRouter as Router, Routes, Route } from "react-router-dom";

function App() {
  return (
    <Router basename={process.env.PUBLIC_URL}>
      <Routes>
        <Route path="/" element={<Home/>} />
        <Route path="/dashboard" element={<Dashboard/>} />
        <Route path="/*" element={<NotFoundPage/>} />
      </Routes>
    </Router>
  );
}

另外,使用basename={process.env.PUBLIC_URL} 通过.env 文件设置公共网址是一个好习惯。

解决这个问题的另一种方法

另一种方法是恢复到版本 5,但我强烈建议您升级到版本 6,因为它提供了更小的包大小、更好的路由选择、改进的编码风格和更直观的嵌套编码方式路线。

参考文献

  1. Upgrading to v6 Guide
  2. Upgrading to v6 Tutorial

【讨论】:

  • 我有一部分需要立即更新,我真的需要迁移吗?旧版本也会有错误吗?
  • 旧版本有问题。尤其是在处理 404 路由时。我曾遇到过渲染两个组件以升级到版本 6 几乎不需要 30 分钟的情况。我会说这是值得的,因为它提高了整体性能。
猜你喜欢
  • 2023-03-11
  • 2020-11-17
  • 2022-01-12
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 2020-11-01
相关资源
最近更新 更多