React 18 降级到17.0.2

这篇教程详细介绍了如何在已经部署了React 18的项目中,逐步降级到React 17.0.2。首先创建新项目,然后卸载React 18和React DOM 18,接着安装React 17和React DOM 17,最后更新`index.js`文件以匹配React 17的配置。通过这些步骤,你可以确保平稳地从React 18过渡到React 17.0.2。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我可能不是唯一一个真正害怕技术变化导致我的代码中断的人,但你不必再害怕了。部署新的 react 18 后,我将向您展示如何轻松降级到 react 17.0.2,以便您有足够的时间为升级做准备。

1. 创建反应应用

  • 创建一个文件夹并将其命名或任何您想要的名称。 react-downgrade-2022 

  • 打开终端并运行 create-react-app

npx create-react-app .

2.卸载react和react-dom

当你创建了一个 react 应用程序时,它会附带 react 18 和 react-dom 18,但这不是我们想要的,因为我们正在尝试降级到 react 17.0.2和 react-dom 17.0.2

{
  "name": "react-downgrade-2022",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.16.4",
    "@testing-library/react": "^13.0.1",
    "@testing-library/user-event": "^13.5.0",
    "react": "^18.0.0", // <===
    "react-dom": "^18.0.0", // <===
    "react-scripts": "5.0.1",
    "web-vitals": "^2.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

 

我们必须卸载 react 18 和 react-dom 18,现在运行
npm uninstall react react-dom

npm uninstall react react-dom
 

这样做是为了我们可以摆脱 react 18 和 react-dom 18,记住,我们正在尝试降级为 react 17 和 react-dom 17。

3 安装 react 17 和 react-dom 17

现在得到我们真正想要的,即再次 react 17 和 react-dom 17,运行 npm install react@17.0.2 react-dom@17.0.2

npm install react@17.0.2 react-dom@17.0.2
 

React 会用一些已弃用的警告标志对你大喊大叫,忽略任何显示的警告标志。

4 更改 index.js

请记住,因为我们已经安装了 react 18,所以会附带一些默认的 react 18 设置,我们必须更改这些设置以匹配 react 17.0.2 index.js 

导航到目录中的文件。 index.js  src 


// react 18

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
 

现在将以下代码复制并粘贴到您的文件中 index.js 


// react 17.0.2

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';

ReactDOM.render(
  <React.StrictMode>
    <App/>
  </React.StrictMode>,
  document.getElementById('root')
);
 

5 完成

现在,我们已经成功从 react 18 降级到 react 17.0.2
运行 npm start

npm start

 

ERESOLVE could not resolve tnpm ERR! tnpm ERR! While resolving: @alife/cainiao-error-boundary@0.2.1 tnpm ERR! Found: react@17.0.2 tnpm ERR! node_modules/react tnpm ERR! react@"^17.0.2" from the root project tnpm ERR! peer react@"^16.8.0 || ^17.0.0" from @ahooksjs/use-request@2.8.15 tnpm ERR! node_modules/@ahooksjs/use-request tnpm ERR! @ahooksjs/use-request@"^2.8.14" from ahooks@2.10.14 tnpm ERR! node_modules/@alife/cnc-search-page/node_modules/ahooks tnpm ERR! ahooks@"^2.10.12" from @alife/cnc-search-page@0.1.28 tnpm ERR! node_modules/@alife/cnc-search-page tnpm ERR! @alife/cnc-search-page@"^0.1.0" from @alife/wms-web-app-sample@0.1.0 tnpm ERR! node_modules/@alife/wms-web-app-sample tnpm ERR! @ahooksjs/use-request@"^2.8.14" from ahooks@2.10.14 tnpm ERR! node_modules/@alife/perf-table/node_modules/ahooks tnpm ERR! ahooks@"^2.6.1" from @alife/perf-table@1.3.28 tnpm ERR! node_modules/@alife/perf-table tnpm ERR! @alife/perf-table@"^1.3.28" from the root project tnpm ERR! 1 more (@alife/wms-web-app-sample) tnpm ERR! 2 more (build-plugin-ice-request, ahooks) tnpm ERR! 199 more (@alife/panda-i18n, @ali/deep, @alifd/next, ...) tnpm ERR! tnpm ERR! Could not resolve dependency: tnpm ERR! peer react@"^16.x" from @alife/cainiao-error-boundary@0.2.1 tnpm ERR! node_modules/@alife/cainiao-error-boundary tnpm ERR! @alife/cainiao-error-boundary@"^0.2.0" from the root project tnpm ERR! tnpm ERR! Conflicting peer dependency: react@16.14.0 tnpm ERR! node_modules/react tnpm ERR! peer react@"^16.x" from @alife/cainiao-error-boundary@0.2.1 tnpm ERR! node_modules/@alife/cainiao-error-boundary tnpm ERR! @alife/cainiao-error-boundary@"^0.2.0" from the root project tnpm ERR! tnpm ERR! Fix the upstream dependency conflict, or retry tnpm ERR! this command with --force or --legacy-peer-deps tnpm ERR! to accept an incorrect (and potentially broken) dependency resolution. tnpm ERR! tnpm ERR! tnpm ERR! For a full report see: tnpm ERR! /Users/lizhiqiang/.npm/_logs/2025-05-16T06_11_44_821Z-eresolve-report.txt这是什么意思
05-17
### 解决 `tnpm ERESOLVE could not resolve` 错误的方法 当遇到类似于 `ERESOLVE` 的依赖冲突问题时,通常是由于某些包的 peerDependencies 或 dependencies 定义不兼容所致。在这种情况下,您提到的具体问题是 React 17.0.2 和 `@alife/cainiao-error-boundary@0.2.1` 存在 peerDependency 冲突,后者声明其需要 React ^16.x。 以下是几种常见的解决方案及其原理说明: #### 方法一:强制安装依赖 使用 `--force` 参数可以忽略依赖冲突警告并强行安装所需包。这种方法虽然简单粗暴,但在大多数情况下能快速解决问题。然而需要注意的是,这种方式可能会引入潜在的风险,因为忽略了依赖之间的约束条件可能导致运行时错误。 ```bash tnpm install --force ``` 该方法适用于那些对特定版本要求并不严格的库[^1]。 #### 方法二:回退至旧版React 如果项目允许降级,则可以选择将 React 版本降至满足 `@alife/cainiao-error-boundary` 所需范围内的版本 (即 React 16.x),从而消除冲突。 修改 package.json 文件中的相关内容如下: ```json "dependencies": { "react": "^16.14.0", "@alife/cainiao-error-boundary": "^0.2.1" } ``` 随后重新执行安装命令: ```bash tnpm install ``` 此策略确保所有组件都能在其预期环境下工作良好[^2]。 #### 方法三:采用 Legacy Peer Dependency 行为 另一种方式是通过设置标志位告诉 TNPMPackageManager遵循旧式的处理逻辑来解析peer dependency, 即使存在版本差异也予以接受. ```bash tnpm install --legacy-peer-deps ``` 相比起直接运用 force , legacy-peer-deps 更加温和一些因为它仅仅改变了解析规则而不是完全无视它们.[^3] #### 方法四:寻找替代库或者自定义适配层 考虑到长期维护成本以及稳定性考量, 推荐评估是否有其他功能相似却更好支持最新框架生态系统的第三方类库可供替换原生引用;又或者是自行创建一层中间件用来桥接新老接口间的差距使得二者得以共存而互不影响各自独立运作状态之下达成目的.[^4] 以上便是针对此类场景下较为通用有效的四种处置手段介绍完毕! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值