大家好,我是若川。持续组织了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 的支持

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

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

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

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

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

今日话题

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

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

  1. React多页面应用5(webpack生产环境配置,包括压缩js代码,图片转码等)

    本教程总共7篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1.React多页面应用1(webpack开发环境搭建,包括Babel.热更新等) ----2017 ...

  2. MyHeritage是如何实现发布到生产环境的

    \ 本文要点 \\ 持续部署对业务.质量.速度和满意度有着重要的影响.\\t 任何巨大的更改都开始于增量小步骤.\\t 任何完全持续部署得以应用之前,都需要一些测量到位,其中最重要的就是测试.\\t ...

  3. ABP Framework 5.2 RC 版本发布及新增功能介绍

    本文将介绍 ABP Framework 5.2 RC 版新增的主要功能: •单层解决方案模板•API 版本控制•源代码控制移除libs文件夹•对 Swagger UI 隐藏 ABP 默认端点•CMS ...

  4. [翻译]Silverlight2 RC版本发布

    Silverlight2 RC 发布 从 ScottGu's Blog翻译 原作者:ScottGu 今天晚上我们推出了Silverlight2 RC. 在最终发布之前仍然有一些bug需要修复.尽管如此 ...

  5. OpenCV 4.0 rc版本发布,扩展计算图Graph API

    点击我爱计算机视觉标星,更快获取CVML新技术 rc版本即正式发布前的候选版(release candidate),指在重大版本号升级前,几乎已经完工了,但为避免可能的百密一疏,先让大家"测 ...

  6. Vue 3 首个 RC 版本发布

    Vue.js 作者尤雨溪昨日宣布 Vue 3 已进入 RC 阶段,这意味着 Vue 3 内核的 API 和实现已到达稳定状态. 原则上,进入 RC 阶段后不会在最终版本发布之前引入新的主要功能或做出重 ...

  7. 查看webpack版本_webpack小结-生产环境构建优化

    刚刚对我们前端项目做了一顿分析优化操作,因为接手时每次构建要花两分钟左右的时间,实在忍受不了,只能动手了.通过这次优化,重新温习了下 webpack 的一些知识.接下来会关于 webpack 展开写几 ...

  8. 前端H5项目部署到OSS-利用jenkins实现自动发布【生产环境实战】

    前端H5项目发布到OSS 文章目录 前端H5项目发布到OSS 背景 一.创建Bucket 二.为Bucket绑定自定义域名 1.购买的域名和oss在同一个阿里云账号下(大多数) 2.购买的域名和oss ...

  9. 【做第一批吃螃蟹的人】试用 React 18 !

    React 团队最近发布了 React 18 的 alpha 版本.这个版本主要是增强 React 应用程序的 并发渲染 能力,你可以在 React 18 中尝试体验以下几个新特性: 新的 React ...

最新文章

  1. 一上来,就问原理,问上亿(MySQL)大表的索引优化...
  2. oracle sqlplus conn 远程连接
  3. 揭秘-选择迅捷PDF转Word转换器的原因
  4. pip 安装 rdkit
  5. 网路游侠:某硬件WEB应用防火墙配置图示
  6. Mybatis中的resultType和resultMap
  7. pycharm 修改darcual(暗黑)主题滚动条颜色
  8. 对Java回调函数的理解
  9. 把数组排成最小的数(剑指offer第33题)
  10. ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.9/main: DNS lookup error
  11. EmguCV方形答题卡识别
  12. hadoop cascading demo
  13. 电脑下载软件用什么软件好?安卓手机下载软件用哪个软件好?IDM下载器说:在做的都是弟弟
  14. birthday中文是什么_birthday是什么意思_birthday在线翻译_英语_读音_用法_例句_海词词典...
  15. Python进阶学习之超市结账时间计算
  16. BZOJ 2081 Beads Hash
  17. 神舟炫龙银魂t1是哪年的_我的天呐 对比发现炫龙银魂T1竟然这么强
  18. linux中find命令详解,Linux下的find指令详解
  19. 难忘的聚会,美好的时光(1957--1962)
  20. 一元多项式的表示和相加

热门文章

  1. 智能手机计步算法c语言实现,【转载】智能手机计步器算法的实现
  2. java循环单链表比较相等_java的循环单链表
  3. python 流程控制if判断
  4. codeforce 768B Code For 1
  5. BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)
  6. 使用JAXP对XML文档进行DOM解析
  7. Magento--判断checkout中是否使用了coupon code
  8. HC-05蓝牙模块基本使用
  9. oracle中 rownum与rowid的理
  10. memcached应用策略(转)