React 架构是怎么设计的?

文章导读
Previous Quiz Next React 库建立在坚实的基础上。它简单、灵活且可扩展。正如我们之前所学,React 是一个用于在 Web 应用程序中创建用户界面的库。React 的主要目的是使开发者能够使用纯 JavaScript 创建用户界面。通常,每个用户界面库
📋 目录
  1. A React 应用程序的架构
  2. B React 应用程序的工作流程
A A

React - 架构



Previous
Quiz
Next

React 库建立在坚实的基础上。它简单、灵活且可扩展。正如我们之前所学,React 是一个用于在 Web 应用程序中创建用户界面的库。React 的主要目的是使开发者能够使用纯 JavaScript 创建用户界面。通常,每个用户界面库都会引入一种新的模板语言(我们需要学习它)来设计用户界面,并提供在模板内部或单独编写逻辑的选项。

React 没有引入新的模板语言,而是引入了以下三个简单概念:

React elements

HTML DOM 的 JavaScript 表示。React 提供了一个 API,React.createElement,用于 创建 React Element

JSX

一种用于设计用户界面的 JavaScript 扩展。JSX 是一种基于 XML 的可扩展语言,支持略作修改的 HTML 语法。JSX 可以被编译为 React Elements,并用于创建用户界面。

React component

React component 是 React 应用程序的主要构建块。它使用 React elements 和 JSX 来设计其用户界面。React component 基本上是一个 JavaScript class(扩展 React.component class)或纯 JavaScript function。React component 具有 properties、state management、life cycle 和 event handler。React component 能够处理简单以及高级逻辑。

让我们在 React Component 章节中了解更多关于 component 的内容。

React 应用程序的架构

React 库只是一个 UI 库,它并不强制要求使用任何特定的模式来编写复杂的应用程序。开发者可以自由选择自己喜欢的 design pattern。React 社区提倡某些 design pattern。其中一种是 Flux pattern。React 库还提供了许多概念,如 Higher Order component、Context、Render props、Refs 等,以编写更好的代码。React Hooks 是一个不断发展的概念,用于在大项目中进行 state management。让我们尝试理解 React 应用程序的高级架构。

React App
  • React app 以单个 root component 开始。

  • Root component 由一个或多个 component 构建。

  • 每个 component 可以嵌套其他 component 到任意级别。

  • Composition 是 React 库的核心概念之一。因此,每个 component 是通过组合更小的 component 构建的,而不是从另一个 component 继承。

  • 大多数 component 是用户界面 component。

  • React app 可以包含第三方 component,用于特定目的,如 routing、animation、state management 等。

React 应用程序的工作流程

在本章中,我们通过创建并分析一个简单的 React 应用程序来理解 React 应用程序的工作流程。

打开命令提示符并进入你的工作目录。

cd /go/to/your/workspace

接下来,创建一个文件夹 static_site,并切换到新建的文件夹。

mkdir static_site 
cd static_site

示例

接下来,创建一个文件 hello.html,并编写一个简单的 React 应用程序。

<!DOCTYPE html> 
<html> 
   <head> 
      <meta charset="UTF-8" /> 
      <title>React Application</title> 
   </head> 
   <body> 
  <div id="react-app"></div>  
  <script type="module">
     import React from 'https://esm.sh/react';
     import ReactDOM from 'https://esm.sh/react-dom/client';

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

     const root = ReactDOM.createRoot(document.getElementById('react-app'));
     root.render(React.createElement(App));
   </script> 
</body> 
</html>

接下来,使用 serve web server 启动应用程序。

serve ./hello.html

输出

接下来,打开你喜欢的浏览器。在地址栏输入 http://localhost:3000,然后按回车。

React Hello

让我们分析代码并进行少量修改,以更好地理解 React 应用程序。

在这里,我们使用了 React library 提供的三个 API。

React.createElement

用于创建 React element。它需要三个参数:

  • 元素标签
  • 元素属性(作为对象)
  • 元素内容 - 也可以包含嵌套的 React element

ReactDOM.createRoot

用于创建主容器元素。

root.render

用于将元素渲染到容器中。它需要一个参数:

  • React Element 或 JSX

嵌套 React element

由于 React.createElement 支持嵌套 React element,让我们添加嵌套元素,如下所示:

示例

<script type="module">
     const root = ReactDOM.createRoot(document.getElementById('react-app'));
     root.render(React.createElement(App)); 
</script>

输出

它将生成以下内容:

<div><h1> Hello React!</h1></div> 

使用 JSX

接下来,让我们完全移除 React element,并引入 JSX 语法,如下所示:

<!DOCTYPE html> 
<html> 
   <head> 
      <meta charset="UTF-8" /> 
      <title>React Application</title> 
   </head> 
   <body> 
      <div id="react-app"></div> 
      <script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script> 
      <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script> 
      <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script> 
      <script type="text/babel"> 
         ReactDOM.render(
            <div><h1>Hello JSX!</h1></div>, 
            document.getElementById('react-app') 
         ); 
     </script> 
   </body> 
</html>

在这里,我们引入了 Babel 来将 JSX 转换为 JavaScript,并在 script 标签中添加了 type="text/babel"

<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script> 
<script type="text/babel"> 
   ... 
   ... 
</script>

接下来,运行应用程序并打开浏览器。应用程序的输出如下所示:

Hello Jsx

接下来,让我们创建一个新的 React component,Greeting,然后尝试在网页中使用它。

<script type="text/babel"> 
   function Greeting() {
      return <div><h1>Hello JSX!</h1></div> 
   } 
   ReactDOM.render(<Greeting />, document.getElementById('react-app') ); 
</script>

结果相同,如下所示:

Hello Jsx

通过分析应用程序,我们可以可视化 React 应用程序的工作流程,如下图所示。

Workflow Jsx

React app 调用 ReactDOM.render 方法,传入使用 React component(以 JSX 或 React element 格式编码)创建的用户界面以及用于渲染用户界面的容器。

ReactDOM.render 处理 JSX 或 React element 并生成 Virtual DOM。

Virtual DOM 将被合并并渲染到容器中。