React 17.0.0-rc2 导入 React 变成了可选项

1,495 阅读2分钟

最近,开始在看 react 源码,也逐渐关注起来 react 新版本的更新。 访问 react 的 blog 时候,发现了一篇「Introducing the New JSX Transform」.

_Although React 17 doesn’t contain new features, it will provide support for a new version of the JSX transform. _

翻译过来就是 尽管 React 17 不包含新功能,但它将为新版本的JSX转换提供支持。

接下来,我就和大家一起来阅读一下这篇文章吧~

现状

写过 react 的大概都知道我们在代码中写的 react 语法:

import React from 'react';

function App() {
  return <h1>Hello World</h1>;
}

会被 babel 转为:

import React from 'react';

function App() {
  return React.createElement('h1', null, 'Hello world');
}

但是正如文中所述的,这并不完美:

  • _因为将 JSX 编译为 React.createElement,React 如果您使用 JSX,则必须在范围内。 _
  • 有一些性能改进和简化是 React.createElement 不允许。

新版本更新了什么

不需要写冗余的导入 React 了

为了解决这些问题,React 17 在 React 包中引入了两个新的入口点,仅供 Babel 和 TypeScript 等编译器使用。新的 JSX 转换没有将 JSX 转换为 React.createElement,而是自动从 React 包中的那些新入口点导入特殊功能并调用它们。

我们只需要编写如下:

function App() {
  return <h1>Hello World</h1>;
}

即可被转换为

// Inserted by a compiler (don't import it yourself!)
import {jsx as _jsx} from 'react/jsx-runtime';

function App() {
  return _jsx('h1', { children: 'Hello world' });
}

但是需要注意是的:虽然我们的原始代码不再需要导入React来使用JSX!(但是我们仍然需要导入 React 才能使用 Hooks 或 React 提供的其他导出。)

也为这块儿转换的性能优化留了些许伏笔

具体可参考如下链接,这儿就不详细描述啦github.com/reactjs/rfc…

升级到新的 JSX 转换

如何升级到新的JSX转换

_如果要升级,则需要两件事: _

  • _一个支持新转换的React版本(当前,只有React 17 RC支持它,但是在React 17.0发布之后,我们计划针对0.14.x,15.x和16.x发行其他兼容版本)。 _
  • 兼容的编译器(请参阅下面有关不同工具的说明)。

升级带来的问题

此更改与所有现有 JSX 代码完全兼容,即:

  • 原有的 api 不会被丢弃的,可以选择不迁移直接升级 react 版本。
  • 当然我们选择迁移,新旧写法也可以同时存在。
  • 同时,react 官方还提供了迁移的脚本,该脚本将从代码库中删除不必要的导入。