React必读:深入了解JSX的本质

JSX 示例代码 🧑‍💻

jsx 复制代码
import React from "react";
import ReactDOM from "react-dom";

class App extends React.Component {
  render() {
    return (
      <div className="App">
        <h1 className="title">I am the title</h1>
        <p className="content">I am the content</p>
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

这3个问题你有思考过🐴

  • JSX 的本质是什么,它和 JS 之间到底是什么关系?
  • 为什么要用 JSX?不用又怎么样?
  • JSX 的背后是什么,背后都做了哪些事情?

如果以上问题在你使用 React 期间,还没有思考过并产生自己的理解的话,就继续看下去吧~

让我们开始吧💁‍♂️

大多数人只是简单地将 JSX 理解为模板语法的一种。JSX 作为 React 框架的一大特色,它其实与 React 本身的运作机制之间存在着紧密的联系。当你了解了这层"联系",建立起强大的理论自信,在之后的面试过程中就可以和面试官侃侃而谈了。

JSX is a syntax extension for JavaScript that lets you write HTML-like markup inside a JavaScript file.

以上是 React 官方对于 JSX 的解释,翻译过来:

JSX 是 JavaScript 的一种语法扩展,可让您在 JavaScript 文件中编写类似 HTML 的标记。

官方给 JSX 的定位是 JavaScript 的"扩展",这直接决定了浏览器并不会像天然支持 JavaScript 一样地支持 JSX,那么 JSX 的语法是如何在 JavaScript 中生效的呢?

Babel 登场了👾

Babel is a toolchain that is mainly used to convert ECMAScript 2015+ code into a backwards compatible version of JavaScript in current and older browsers or environments.

以上是 Babel 官方的解释,翻译过来:

Babel 是一个工具链,主要用于在当前和旧版浏览器或环境中将 ECMAScript 2015+ 代码转换为向后兼容的 JavaScript 版本。

举例来说,ECMAScript 2015+ 版本推出了一种名为模板字符串的新语法,这种语法在一些低版本的浏览器中并不兼容。示例如下:

javascript 复制代码
var name = "cenyu";  
var place = "beijing";  
  
`Hello ${name}, ready for ${place}?`;

Babel 可以帮助我们将这段代码转换为大部分低版本浏览器也能够识别的代码

javascript 复制代码
var name = "cenyu";  
var place = "beijing";  
  
"Hello ".concat(name, ", ready for ").concat(place, "?");

同样的,Babel 也具有将 JSX 语法转换为 JavaScript 代码的能力。

那么 Babel 具体会将 JSX 处理成什么样子呢?如下图所示:

可以看到所有的 JSX 标签都被转换为了 React.createElement 的调用。这也就意味着,我们所写的 JSX,其实写的就是 React.createElement。

所以,虽然 JSX 看起来像 HTML,但也只是看起来像而已。

JSX 的本质是 React.createElement 这个 JavaScript 调用的"语法糖"。这也就解释了 JSX 语法为什么可以在 JavaScript 文件中生效的原因。✅

读到这里,你可能会想既然 JSX 等价于一次 React.createElement 的调用,那么 React 官方为什么不直接引导我们用 React.createElement 来创建元素呢?

我们来看一段 JSX 代码和 React.createElement 调用之间的对比,如下图所示:

显而易见的是,在实际功能效果一致的前提下,左侧的 JSX 代码层次分明,嵌套关系清晰,右侧的 React.createElement 代码则显得比较混乱,读写都相对困难。

因此,JSX "语法糖"允许咱们前端开发者,使用我们最为熟悉的类 HTML 标签语法来进行编码(创建虚拟 DOM,这一块儿我们之后再聊),在降低学习成本的同时,也提升了研发效率与体验。

最后

读到这里,相信我们对于在文章开始提出的3个问题,已经有了自己的理解。

觉得讲得还不错的话,求赞、求关注🥸。

我们之后来一起聊聊 React.createElement 到底做了什么,以及虚拟DOM的事情。

码码指南,在你我的前端路上一直互相陪伴~

相关推荐
记得开心一点嘛11 小时前
Trellora:基于 Electron、React 和本地知识库的 AI 知识工作台
人工智能·react.js·electron
5008412 小时前
React Native for OpenHarmony 实战:三方库 react-native-url-polyfill 的鸿蒙化适配指南
javascript·react native·react.js·性能优化·electron·harmonyos
5008416 小时前
React Native for OpenHarmony 实战:三方库 react-native-volume-control 的鸿蒙化适配指南
javascript·react native·react.js·electron·harmonyos
薛一半16 小时前
React-Redux三重优化实战揭秘
javascript·vue.js·react.js
薛一半3 天前
React-Redux核心原理与容器组件实战
前端·javascript·react.js
FungLeo3 天前
成为全栈·Next.js 网站前台篇·评论系统:叠楼、回复、删除与内容审核如何落到前台
react.js·内容审核·next.js·评论系统·树形数据·成为全栈
Alice-YUE3 天前
React 渲染机制速通:Render 树、Fiber 树与更新调度
前端·react.js·前端框架·react·fiber·前端性能·渲染机制
liangshanbo12154 天前
React Fiber:从“解决卡顿”到完整更新链路
前端·javascript·react.js
ss2735 天前
AI全栈实战 | 2.2-02 React 思维模型:数据不可变 vs Vue 数据可变,两种哲学把复杂度推给谁
前端·vue.js·react.js