O que é transformação JSX
Uma vez que os navegadores não entendem JSX fora da caixa, os desenvolvedores contam com compiladores como Babel ou Typescript para transformar JSX em JS simples. O React 17 Release Candidate apresenta um novo mecanismo opcional de transformação JSX em JS.
Aqui estão os benefícios:
- Usando JSX sem React Import
- Dependendo das configurações, o pacote pode diminuir ligeiramente
- No futuro, recursos estarão disponíveis para simplificar o trabalho com o react
(Talvez eu não tenha traduzido com precisão - aqui está o original: ele permitirá melhorias futuras que reduzem o número de conceitos que você precisa para aprender React ) A
atualização não altera o JSX em si de forma alguma e todos os compiladores funcionaram e funcionarão. Não há planos de abandoná-los. Está planejado para oferecer suporte ao novo mecanismo JSX Transform para versões anteriores do React: 16.x, 15.x, 14.x, aqui estão as instruções para a atualização.
O que mudou
A antiga transformação JSX funcionava assim:
Código
import React from 'react';
function App() {
return <h1>Hello World</h1>;
}
Transformado em
import React from 'react';
function App() {
return React.createElement('h1', null, 'Hello world');
}
Mas não é ótimo, e este é o motivo:
- Uma vez que JSX compila para React.createElement, React deve estar no escopo
- Existem várias opções para melhorar a velocidade e simplificar que React.createElement bloqueia
Para resolver isso, o React 17 apresenta dois novos pontos de entrada destinados ao uso por outras ferramentas, como Babel e Typescript, e agora, em vez de se transformar em React.createElement, novas funções do pacote React são importadas e chamadas.
Digamos que seu código seja assim:
function App() {
return <h1>Hello World</h1>;
}
Após uma nova transformação, ficará assim:
// 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' });
}
O novo mecanismo não importa o React, embora ainda seja necessário para que os ganchos funcionem.
A nova transformação é totalmente compatível com todo o código JSX existente, você não precisa mudar nada. Aqui estão os detalhes técnicos de como a nova transformação JSX funciona.
Como fazer o upgrade
Se você não está pronto para atualizar ou está usando JSX para outras bibliotecas, não se preocupe, a transformação antiga não será removida e terá suporte.
Para fazer upgrade, você precisa de duas coisas:
- Versão React com novo suporte de transformação. Até agora são apenas 17, mas no futuro 16.x, 15.xe 14.x
- Compilador compatível (veja abaixo)
Criar aplicativo
React O suporte para criar aplicativo React estará na versão v4.0, agora em teste beta (a partir de
22.09.20 ). Next.js
Next.js v9.5.3 + já usa a nova transformação React para versões compatíveis.
Gatsby
Gatsby v2.24.5 + já usa a nova transformação React para versões compatíveis.
Suporte para configuração manual do Babel de v7.9.0 e superior.
Se você estiver usandobabel/ plugin-transform-react-jsx:
# npm
npm update @babel/core @babel/plugin-transform-react-jsx
# yarn
yarn upgrade @babel/core @babel/plugin-transform-react-jsx
Se você usarbabel/ preset-
react : # npm
npm update @babel/core @babel/preset-react
# yarn
yarn upgrade @babel/core @babel/preset-react
Agora para transformar JSX, embabel/ plugin-transform-react-jsx e em babel/ preset-react, o padrão é {"runtime": "classic"} esta é a versão antiga da transformação. Para habilitar uma nova transformação, você precisa da opção {"runtime": "automatic"}
Se você usarbabel/ preset-react:
{
"presets": [
["@babel/preset-react", {
"runtime": "automatic"
}]
]
}
Se você estiver usando babel/ plugin-transform-react-jsx:
{
"plugins": [
["@babel/plugin-transform-react-jsx", {
"runtime": "automatic"
}]
]
}
A partir do Babel 8, "automático" será o padrão para ambos os plug-ins. Há uma documentação mais detalhada aqui @ babel / plugin-transform-react-jsx e @ babel / preset- react .
Nota
, importSource , . , .
ESLint
Se você tiver o plugin eslint-plugin-react , então as regras react / jsx-uses-react e react / react-in-jsx-scope não são mais necessárias e podem ser removidas.
{
// ...
"rules": {
// ...
"react/jsx-uses-react": "off",
"react/react-in-jsx-scope": "off"
}
}
Suporte TypeScript para transformações JSX desde a versão 4.1 beta . Suporte de
fluxo
para transformações JSX da versão 0.126.0 e superior.
Como retirar as importações React não utilizadas
Como a nova transformação JSX importará automaticamente react / jsx-runtime, o React não é mais necessário no escopo para usar JSX. As importações não utilizadas não são críticas, mas se você quiser removê-las, é recomendável usar o script do codemod.
cd your_project
npx react-codemod update-react-imports
Como um resultado:
- Remova todas as importações React não utilizadas
- Todas as importações, como import React from "react", serão alteradas para o nome import {useState} de "react". Este é o método de importação preferido. Codemod não afetará importações como import * como React from "react", esta também é uma importação válida e na versão 17 funcionará, mas no futuro pediremos que você se livre dela
O código:
import React from 'react';
function App() {
return <h1>Hello World</h1>;
}
Será substituído por:
function App() {
return <h1>Hello World</h1>;
}
Se você usar outra coisa na reação (por exemplo, um gancho), a importação nomeada aparecerá no código:
Código
import React from 'react';
function App() {
const [text, setText] = React.useState('Hello World');
return <h1>{text}</h1>;
}
Substituído pelo código:
import { useState } from 'react';
function App() {
const [text, setText] = useState('Hello World');
return <h1>{text}</h1>;
}
A remoção de importações não utilizadas ajudará na preparação para as próximas versões do React (não 17) nas quais haverá suporte para módulos ES e não haverá exportação padrão.
Agradecimentos
Gostaríamos de agradecer às equipes de Babel, TypeScript, Create React App, Next.js, Gatsby, ESLint e Flow por sua ajuda na integração do novo mecanismo de transformação JSX. Agradecemos também à comunidade React por seus comentários e discussões sobre o RFC .