首页 > 其他分享 >升级next@13 react@18 chakra-ui@2

升级next@13 react@18 chakra-ui@2

时间:2024-04-29 09:56:47浏览次数:19  
标签:13 const 18 ssr react ui chakra next

一、升级步骤

1、本地node建议升级到v20(next@13要求node@18,react@18、react-dom@18、chakra-ui@2)

2、支持渐进式升级next13,升级的项目需按 next 官方添加环境变量NEXT_PUBLIC_NEXT13,请devops帮忙Dockerfile构建时添加.env 文件到 pod中

image-20240111-081926.png

3、由于升级 next13,公共组件客户端需要区分nginx与next,nginx项目需要按 create-react-app 官方添加环境变量REACT_APP_IS_NGINX=true,不用改Dockerfile

image-20240123-023922.png

4、由于历史原因,@chakra-ui/theme-tools会升级失败,需要在resolutions指定为新版本"@chakra-ui/theme-tools": "2.1.2"

image-20240108-091648.png

5、yarn add [email protected] [email protected] [email protected] @chakra-ui/[email protected] @emotion/[email protected] @emotion/[email protected] @emotion/[email protected] @emotion/[email protected] [email protected]

6、升级eslint插件 yarn add -D [email protected]

7、mik-ssr-web、mik-ssr-dc、mik-ssr-auth已上 prod环境,需要全量测试,升级后包增加100kb后期解决

8、next官方升级文档Upgrading: App Router Migration

 

二、调试方法

yarn start启动本地调试,通过组件栈与调试面板有助于查找报错原因

image-20231221-015259.png image-20231221-015850.png

 

三、常见业务报错

1、next@13对react-router-dom兼容性不好,可能产生白屏。建议删除react-router-dom,使用next/router、next/link等。如需兼容nginx项目,统一使用useMikRouterMikLink,智能判断next/link、react-router-dom的Link、chakra-ui的Link

  import { useMikRouter, MikLink } from 'michaels-ssr/hooks/nextOrNginx'; export default function Component() { const router = useMikRouter(); // 内部判断next或者nginx,添加react-router-dom的useLocation属性 router.push('/'); console.log('pathname', router.pathname) return <MikLink href='/home' p="30px" bg='tomato'>Home</MikLink> //支持chakra-ui样式 }

2、当useEffect的回调函数是异步函数时,可能产生白屏。async函数隐式返回一个Promise对象,React18框架错误地将其解释为返回的清理函数,这会在组件因导航而卸载时导致错误。

应该用函数包裹一层,需保留{},useEffect(() => { getIpFn() }, [])

  错误写法: useEffect(async () => { const ipText = await fetch(`${env.COMMERCE_API}/shipping/getRequestIp`); }, []);   正确写法: const getIpFn = async () => { const ipText = await fetch(`${env.COMMERCE_API}/shipping/getRequestIp`); } useEffect(() => { getIpFn() }, []); //应该用函数包裹一层,需保留{}

2、next13的next/link的href属性,仅支持 string 与 object,undefined会报如下错误

image-20240123-081544.png

4、水合一致性报错,react18水合检验更严格,会报418、423、425错误

函数组件的typeof window !== 'undefined' 应改为自定义 hook

  import useIsClient from 'michaels-ssr/hooks/useIsClient'; export default function Component() { const isClient = useIsClient(); return isClient ? 'Is Client' : 'Is Server' }

5、useMediaQuery当客户端屏幕宽度与服务端渲染不一致报418、423,建议服务端渲染默认1440

  const [is1440] = useMediaQuery(`(max-width: 1439px)`); const [is1024] = useMediaQuery(`(max-width: 1023px)`);

6、a 标签不能嵌套 a标签

image-20240109-030910.png

7、其他水合一致性报错详见:

next官方文档Text content does not match server-rendered HTML

或 react官方文档hydrateRoot – React

8、ping接口使用正确es6写法

  const ping = require('michaels-ssr/pages/api/ping'); module.exports = ping;

改为

  import ping from 'michaels-ssr/pages/api/ping' export default ping

9、Toast 不弹出
过渡解决方案 在当前页使用standalone toast 参考,同时要保证theme color 值正确可用 Upgrading to v2
_app.jsx example:

  import { createStandaloneToast } from '@chakra-ui/toast' import { withCustomer } from 'michaels-ssr/pages/_appWithOutHeaderFooter'; import CommonLayout from 'michaels-ssr/components/Layout'; const { ToastContainer } = createStandaloneToast() function CustomeLayout(props) { return ( <> <ToastContainer /> <CommonLayout {...props} />; </> ); } export default withCustomer({ newApp: true, Layout: CustomeLayout, });

标签:13,const,18,ssr,react,ui,chakra,next
From: https://www.cnblogs.com/jerry-mengjie/p/18165041

相关文章

  • [转]解决Win7和Linux Deepin双系统时间不同步的问题[2017.3.13 sina blog]
    原博地址:http://xsinger.me/diy/261.html/comment-page-1对于双系统的用户,有时候从Linux回到Windows的时候,时间总相差8小时。为什么LinuxDeepin和Windows双系统会有时间差因为安装LinuxDeepin时选择了UTC(协调世界时)时间,所以LinuxDeepin开机总是从互联网获取时间并且写入BIOS......
  • reactivity api
    reactivityapi:https://v3.vuejs.org/api/reactivity-api获取响应式数据API传入返回备注reactiveplain-object对象代理深度代理对象中的所有成员readonlyplain-objectorproxy对象代理只能读取代理对象中的成员,不可修改refany{value:...}对va......
  • 初中中考阅读理解难题一网打尽!句子结构深度解析+答案揭秘,助你轻松冲刺高分!-013
    PDF格式公众号回复关键字:ZKYDT013原文1Mr.Paternograduatedfromuniversityinhisnineties,didn’the?解析1Mr.Paterno,graduated毕业,fromuniversity从大学,inhisnineties在他90多岁,didn’the?不是吗佩特诺先生九十多岁时从大学毕业,不是吗?2Sixweek......
  • mORMot 1.18 第07章 简单的读写操作
    mORMot1.18第七章简单的读写操作本章描述了典型的数据读写操作。首先,我们将注意力集中在数据上,而不是函数。读取操作返回一个TID,它是一个32位或64位整数(取决于你的内存模型),反映了表的信息。TID在表中的每一行都是唯一的。ORM的新手可能会感到惊讶,但通常你不需要创建SQL查询......
  • 一周-每天1 小时,学习实现一个简单的mini-React (三)G
    关于从0到1实现一个mini-React过程上周写了相对代码实现第一部分,本片文章接着写!崔学社mini-React完整代码whoelse666/mini-React过程-------------day05----------当日目标:实现React.useState对照React的API//一个count++的例子const[count,setCount]......
  • LLM优化:开源星火13B显卡及内存占用优化
    1.背景本qiang~这两天接了一个任务,部署几个开源的模型,并且将本地经过全量微调的模型与开源模型做一个效果对比。部署的开源模型包括:星火13B,Baichuan2-13B,ChatGLM6B等其他两个模型基于transformers架构封装,因此推理服务启动还是十分丝滑,但星火13B是基于Megatron-DeepSpeed框......
  • [TJOI2018] 碱基序列(题库给的什么鬼名字)
    题目描述小豆参加了生物实验室。在实验室里,他主要研究蛋臼质。他现在研究的蛋臼质是由k个氨基酸按一定顺序构成的。每一个氨基酸都可能有a种碱基序列si_j构成。现在小豆有一个碱基串s,小豆想知道在这个碱基上都多少中不同的组合方式可能得到这个蛋白质。即求由k段字符串有序合......
  • 2018-2019 ACM-ICPC, China Multi-Provincial Collegiate Programming Contest
    A.MaximumElementInAStack按照题目模拟就好,栈内的最大值可以维护单调栈解决。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;usingui32=unsignedint;ui32SA,SB,SC;ui32rng61(){SA^=SA<<16;SA^=SA>>5;SA^......
  • Paper——可容错的虚拟机实践系统设计.18162229
    目标:通过主备复制手段设计一个可容错的VM,用于用户运行企业级程序。primary日常工作,一旦它宕机,和它保持lock-step的backup会立刻顶上,外界观察不到这些操作,我们制造了只有一台VM永远在正常运行的假象。要考虑的点:使用什么手段保持primary和backup严格同步在虚拟化单核CPU时和多......
  • 题解:洛谷 P1137 旅行计划
    标签:图论,拓扑,dp题意给定一张\(n\)个点\(m\)条边的DAG,对于每个\(i\),求以它为终点最多经过多少个点?思路由于是DAG,求的是终点\(i\)经过的所有点,而刚好拓扑序就满足这个。那么就可以考虑拓扑排序。设\(f_i\)是以\(i\)为终点的最多结点数,那么就有转移方程\(f_v=m......