React 18 RC 版本发布啦,生产环境用起来!

大家好,我是若川。持续组织了6个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列

今天给大家带来一个令人兴奋的消息:React 18 RC 版本发布啦!

去年6月份 React 18 发布 alpha 版本的时候,我已经第一时间试用,并且给大家分享了一波:【第一批吃螃蟹】试用 React 18 !

不过 alpha 毕竟还是属于内部测试版本,可能还包括一些 bug,功能也有很多没放出来,大家不能在生产里去用。

这次发布的是 RC 版本(Release Candidate候选版本):基本和最终发布的 stable 版本一样,功能上不会再有太大变化,也更加稳定,大家可以尝试在生产环境里用起来了 ~

安装

安装最新的 React 18 RC 版本:

npm install react@rc react-dom@rc

客户端渲染 API 的更新

如果你是第一次安装 React 18 ,可能会在控制台看到一个警告:

Use createRoot instead. Until you switch to the new API, your app will behave as if it’s running React 17. Learn more: https://reactjs.org/link/switch-to-createroot

这是因为 React 18 中引入了一个新的 Root API,它支持了最新的 concurrent renderer,让你可以自己决定是否启用并发渲染的能力。

// 以前
import { render } from 'react-dom';
const container = document.getElementById('app');
render(<App tab="home" />, container);// 现在
import { createRoot } from 'react-dom/client';
const container = document.getElementById('app');
const root = createRoot(container);
root.render(<App tab="home" />);

同时,unmountComponentAtNode 也改为了 root.unmount

// 以前
unmountComponentAtNode(container);// 现在
root.unmount();

另外,React 还将之前 render 函数的回调函数干掉了,因为通常它在配合 Suspense 一起使用的时候得不到预期的效果:

// 以前
const container = document.getElementById('app');
ReactDOM.render(<App tab="ConardLiHome" />, container, () => {console.log('rendered');
});// 现在
function AppWithCallbackAfterRender() {useEffect(() => {console.log('rendered');});return <App tab="ConardLiHome" />
}const container = document.getElementById('app');
const root = ReactDOM.createRoot(container);
root.render(<AppWithCallbackAfterRender />);

还有一点, 如果你之前用了带 hydrate 的服务端渲染,需要升级到:hydrateRoot

// 以前
import { hydrate } from 'react-dom';
const container = document.getElementById('app');
hydrate(<App tab="home" />, container);// 现在
import { hydrateRoot } from 'react-dom/client';
const container = document.getElementById('app');
const root = hydrateRoot(container, <App tab="home" />);

服务端渲染 API 的更新

在这个版本中,React 为了完全支持服务端的 Suspense 和流式SSR,改进了 react-dom/serverAPI,旧的 Node.js 流式 API 将会被完全弃用:

  • renderToNodeStream 弃用⛔️️,使用时将发出警告。

  • 对应新版 Node 环境的流式传输 API 为:renderToPipeableStream

另外,React 在这个版本还引入了新的 renderToReadableStream 来支持 Deno、Cloudflare worker 等其他环境的流式 SSRSuspense

renderToString、renderToStaticMarkup 这两个 API 还可以继续用,但是对 Suspense 支持就不那么友好了。

想了解更多,可以看 React 18 官方工作组的博客:https://github.com/reactwg/react-18/discussions/22

批处理

React 中的批处理简单来说就是将多个状态更新合并为一次重新渲染,由于设计问题,在 React 18 之前,React 只能在组件的生命周期函数或者合成事件函数中进行批处理。默认情况下,Promise、setTimeout 以及其他异步回调是无法享受批处理的优化的。

// React 18 之前function handleClick() {setCount(c => c + 1);setName('ConardLi');// 在合成事件中,享受批处理优化,只会重新渲染一次
}setTimeout(() => {setCount(c => c + 1);setName('ConardLi');// 不会进行批处理,会触发两次重新渲染
}, 1000);

React 18 开始,如果你使用了 createRoot,所有的更新都会享受批处理的优化,包括Promise、setTimeout 以及其他异步回调函数中。

// React 18 function handleClick() {setCount(c => c + 1);setName('ConardLi');// 只会重新渲染一次
}setTimeout(() => {setCount(c => c + 1);setName('ConardLi');// 只会重新渲染一次
}, 1000);

如果你有特殊的渲染需求,不想进行批处理,也可以使用 flushSync 手动退出:

import { flushSync } from 'react-dom';function handleClick() {flushSync(() => {setCounter(c => c + 1);});// 更新 DOMflushSync(() => {setFlag(f => !f);});// 更新 DOM
}

想了解更多可以看 React 18 官方工作组的博客:https://github.com/reactwg/react-18/discussions/21

用于第三方库的 API

React 18 的更新机制对于很多第三方 React 库都是阻断性的,如果想要适配 React 18,这些库可能要通过下面这些 API 做一些改造:

  • useId 是一个新的 Hook,用于在客户端和服务端生成唯一id,同时避免 hydration 的不兼容,这可以解决 React 17 以及更低版本的问题。

  • useSyncExternalStore 是一个新的 Hook,它允许外部存储通过强制同步更新来支持并发读取。推荐把这个新的 API 推荐应用到任何与 React 外部状态集成的库。

  • useInsertionEffect 是一个新的 Hook,它可以解决 CSS-in-JS 库在渲染中动态注入样式的性能问题。

放弃对 IE 的支持

e98bfcefe15ef81277737b22c98d49ce.png

在这个版本中,React 正式放弃了对 Internet Explorer 的支持。如果你的业务在 IE 还有用户,只能继续使用 React 17 及以下的版本了~。

如果大家想了解更多内容,欢迎查看 React 官方博客:https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html

327d5ab9cac449749c2c8b8d05992490.gif

················· 若川简介 ·················

你好,我是若川,毕业于江西高校。现在是一名前端开发“工程师”。写有《学习源码整体架构系列》20余篇,在知乎、掘金收获超百万阅读。
从2014年起,每年都会写一篇年度总结,已经写了7篇,点击查看年度总结。
同时,最近组织了源码共读活动,帮助3000+前端人学会看源码。公众号愿景:帮助5年内前端人走向前列。

161c43ec1b122cc85d16110cf8be826f.png

识别方二维码加我微信、拉你进源码共读

今日话题

略。分享、收藏、点赞、在看我的文章就是对我最大的支持~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿拉伯语排版设计_针对说阿拉伯语的用户的测试和设计

阿拉伯语排版设计Let me start off with some data to put things into perspective “Why?”让我从一些数据入手&#xff0c;以透视“为什么&#xff1f;”的观点。 Arabic is the 5th most spoken language worldwide, with 420 million speakers, and is an official lang…

SVN:“SVN”不是内部命令,解决方法

1、安装完TortoiseSVN-1.6.16.21511-x64-svn-1.6.17.msi 2、在运行窗口cmd---svn&#xff0c;提示&#xff1a; “SVN” 不是内部命令 郁闷&#xff0c;小有纠结 解决方法&#xff1a;安装Slik-Subversion-1.6.17-x64.msi 命令行窗口关闭&#xff0c;再次打开命令行窗口&#x…

7个月,4000+人,500+源码笔记,诚邀你参加源码共读~

大家好&#xff0c;我是若川。按照从易到难的顺序&#xff0c;前面几期&#xff08;比如&#xff1a;validate-npm-package-name、axios工具函数&#xff09;很多都只需要花2-3小时就能看完&#xff0c;并写好笔记。但收获确实很大。开阔视野、查漏补缺、升职加薪。已经有400笔…

火焰和烟雾的训练图像数据集_游戏开发者是烟雾和镜子的大师

火焰和烟雾的训练图像数据集Video games are incredible. They transport us to new worlds, allow us to partake in otherwise impossible situations, and empower us in our every day lives. Games can make us feel like a part of something bigger than ourselves, per…

平衡树SPLAY

一个比线段树代码还要又臭又长的数据结构&#xff0c;各式各样的函数&#xff0c;咱也不知道别人怎么记住的&#xff0c;咱也不敢问 SPLAY的性质 1.某个节点的左子树全部小于此节点&#xff0c;右子树全部大于此节点 2.中序遍历splay输出的序列是按从小到大的顺序 &#xff08;…

为支持两个语言版本,我基于谷歌翻译API写了一款自动翻译的 webpack 插件

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列本文来…

全球 化 化_全球化设计

全球 化 化重点 (Top highlight)Designing for a global audience can feel daunting. Do you localize your product? Or, do you internationalize your product? And what does that even entail?为全球观众设计可能会令人生畏。 您是否将产品本地化&#xff1f; 还是您将…

springMVC_数据的处理过程

1、DispatcherServlet&#xff1a;作为前端控制器&#xff0c;负责分发客户的请求到 Controller 其在web.xml中的配置如下&#xff1a; <servlet><servlet-name>dispatcherServlert</servlet-name><servlet-class>org.springframework.web.servlet.Dis…

JavaScript 新增两个原始数据类型

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列JavaS…

axure低保真原型_如何在Google表格中创建低保真原型

axure低保真原型Google Sheets is a spreadsheet, just like Microsoft Excel.Google表格是一个电子表格&#xff0c;就像Microsoft Excel一样。 Most people associate it with calculating numbers. But Google Sheets is actually great for organizing your ideas, making…

Lerna 运行流程剖析

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列Lerna…

手动创建线程池 效果会更好_创建更好的,可访问的焦点效果

手动创建线程池 效果会更好Most browsers has their own default, outline style for the :focus psuedo-class.大多数浏览器对于&#xff1a;focus psuedo-class具有其默认的轮廓样式。 Chrome’s default outline styleChrome浏览器的默认轮廓样式 This outline style is cr…

eazy ui 复选框单选_UI备忘单:单选按钮,复选框和其他选择器

eazy ui 复选框单选重点 (Top highlight)Pick me! Pick me! No, pick me! In today’s cheat sheet we will be looking at selectors and how they differ. Unlike most of my other cheat sheets, this will focus on two components (radio buttons and checkboxes) side by…

VS2010 VC Project的default Include设置

http://blog.csdn.net/jeffchen/article/details/5491435 VS2010与以往的版本一个最大的不同是&#xff1a;VC Directory设置的位置和以前的版本不一样。VS2010之前&#xff0c;VC Directory的设置都是在IDE的Tools->Options中设置的&#xff1b;VS2010改为&#xff0c;分别…

初级中级高级_初级职位,(半)高级职位

初级中级高级As a recent hire at my new job, as expected, a lot of things seemed scary and overwhelming. The scariest part was not the unfamiliarity with certain tasks or certain tools, but in communicating with higher-level coworkers, managers and bosses. …

如何写好技术文章(看张鑫旭老师的直播总结

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列本文是…

iOS 流媒体 基本使用 和方法注意

项目里面需要添加视频方法 我自定义 选用的是 avplayer 没选择 MediaPlayer 原因很简单 , avplayer 会更容易扩展 有篇博客 也很好地说明了 使用avplayer的优越性 blog.csdn.net/think12/article/details/8549438在iOS開發上&#xff0c;如果遇到需要播放影片&#xff0c;…

figma下载_迁移至Figma

figma下载Being an intuitive and user-friendly tool and having the possibility of real-time collaboration are some of the main reasons people choose to use Figma. But the migration process to Figma may sometimes be painful or time-consuming. 人们选择使用Fig…

TypeScript 常用的新玩法

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列上周分…

面试官是怎样高效面试的(面试官的“套路”

大家好&#xff0c;我是若川。持续组织了6个月源码共读活动&#xff0c;感兴趣的可以点此加我微信 ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列最近正…