当前位置: 首页 > news >正文

WHAT - React 学习系列(二)

目录

  • 一、官方介绍
  • 二、框架具体对比
    • 1. Next.js(Pages Router)
    • 2. Remix
    • 3. Gatsby
    • 4. Expo(用于原生应用)
    • 5. Next.js(App Router)
      • Next.js App Router
        • 主要特性
        • 与 Pages Router 的对比
      • 具体使用示例
        • 创建 App Router 项目
        • 目录结构示例
        • 示例代码
      • 总结

这一篇主要介绍React在线编码和框架。

一、官方介绍

Outside of the React documentation, there are many online sandboxes that support React: for example, CodeSandbox, StackBlitz, or CodePen.

If you want to build a new app or a new website fully with React, we recommend picking one of the React-powered frameworks popular in the community. By starting with a framework, you can get started with React quickly, and avoid essentially building your own framework later.

These frameworks support all the features(such as code-splitting, routing, data fetching, and generating HTML) you need to deploy, and scale your app in production, and are working towards supporting our full-stack architecture vision.

Production-grade React frameworks:

  1. Next.js (Pages Router): npx create-next-app@latest
  2. Remix: npx create-remix
  3. Gatsby: npx create-gatsby
  4. Expo(for native apps): npx create-expo-app
  5. Bleeding-edge React frameworks
  6. Next.js (App Router): npx create-next-app@latest my-app --experimental-app

Next.js’ Pages Router is a full-stack React framework. If you’re new to Next.js, check out the learn Next.js course. Next.js is maintained by Vercel. You can deploy a Next.js app to any Node.js or serverless hosting, or to your own server. Next.js also supports a static export which doesn’t require a server.

Remix is a full-stack React framework with nested routing. It lets you break your app into nested parts that can load data in parallel and refresh in response to the user actions. If you’re new to Remix, check out the Remix blog tutorial (short) and app tutorial (long). Remix is maintained by Shopify. When you create a Remix project, you need to pick your deployment target. You can deploy a Remix app to any Node.js or serverless hosting by using or writing an adapter.

Gatsby is a React framework for fast CMS-backed websites. Its rich plugin ecosystem and its GraphQL data layer simplify integrating content, APIs, and services into one website. If you’re new to Gatsby, check out the Gatsby tutorial. Gatsby is maintained by Netlify. You can deploy a fully static Gatsby site to any static hosting. If you opt into using server-only features, make sure your hosting provider supports them for Gatsby.

Expo is a React framework that lets you create universal Android, iOS, and web apps with truly native UIs. It provides an SDK for React Native that makes the native parts easier to use. If you’re new to Expo, check out the Expo tutorial. Expo is maintained by Expo (the company). Building apps with Expo is free, and you can submit them to the Google and Apple app stores without restrictions. Expo additionally provides opt-in paid cloud services.

Next.js’s App Router is a redesign of the Next.js APIs aiming to fulfill the React team’s full-stack architecture vision. It lets you fetch data in asynchronous components that run on the server or even during the build.
Next.js is maintained by Vercel. You can deploy a Next.js app to any Node.js or serverless hosting, or to your own server. Next.js also supports static export which doesn’t require a server.

二、框架具体对比

每个生产级React框架都有不同的用途和独特的功能。以下是详细的比较:

1. Next.js(Pages Router)

适用于SSR、SSG和混合应用。

  • 命令: npx create-next-app@latest
  • 用途: 服务端渲染(SSR)、静态站点生成(SSG)和客户端渲染(CSR)。
  • 主要特性:
    • 基于文件的路由。
    • 自动代码分割。
    • 内置API路由。
    • 静态和动态渲染。
    • 增量静态再生。
    • 支持全栈开发。
    • 快速刷新(Fast Refresh)用于快速开发。
  • 使用场景: 适用于各种Web应用、博客、电商和需要SSR的复杂Web应用。

2. Remix

注重快速用户体验和流畅导航。

  • 命令: npx create-remix
  • 用途: 通过优化页面加载速度和流畅过渡来提升用户体验。
  • 主要特性:
    • 以速度为重点的服务端渲染。
    • 嵌套路由和布局。
    • 内置数据加载和动作处理。
    • 渐进增强。
    • 支持静态和动态渲染。
    • 细粒度缓存控制。
  • 使用场景: 需要快速加载和流畅导航的应用、内容丰富的网站、具有复杂路由的动态应用。

3. Gatsby

适合性能和SEO要求高的静态站点。

  • 命令: npx create-gatsby
  • 用途: 以性能和SEO为重点的静态站点生成。
  • 主要特性:
    • 从任何来源获取数据(GraphQL)。
    • 图片优化。
    • 插件生态系统。
    • 丰富的插件和主题支持。
    • 预渲染HTML以实现快速初始加载。
    • 渐进式Web应用(PWA)功能。
  • 使用场景: 博客、营销网站、文档站点,以及任何需要SEO和高性能的网站。

4. Expo(用于原生应用)

最适合快速构建跨平台移动应用。

  • 命令: npx create-expo-app
  • 用途: 构建适用于iOS和Android的React Native应用。
  • 主要特性:
    • 管理和裸工作流选项。
    • 无线更新(Over-the-air updates)。
    • 通过Expo SDK访问原生API。
    • 简单易用,快速上手。
    • 测试和调试工具。
  • 使用场景: 需要快速在iOS和Android上部署,并访问设备原生功能的移动应用。

5. Next.js(App Router)

Next.js 的 App Router 是在 Next.js 13 中引入的新特性,它提供了一种更灵活、更强大的路由方式,旨在改进和替代传统的 Pages Router。以下是对 Next.js App Router 的详细说明和与传统 Pages Router 的比较:

Next.js App Router

主要特性
  1. 文件夹级别路由(Folder-based Routing):
    • 使用文件夹结构来定义应用程序的路由,而不是单纯的文件。
    • 支持嵌套路由和布局。

目录结构:

/app/dashboard/settingspage.tsxlayout.tsx/aboutpage.tsxlayout.tsxpage.tsx

app/page.tsx:

export default function HomePage() {return <h1>Home Page</h1>;
}

app/about/page.tsx:

export default function AboutPage() {return <h1>About Page</h1>;
}
  1. 布局(Layouts)和嵌套布局(Nested Layouts):
    • 允许在不同层级定义布局文件,实现复杂页面结构。
    • 布局文件可以共享状态和 UI 组件,简化应用结构。

app/layout.tsx:

export default function RootLayout({ children }) {return (<html><head /><body><header>Global Header</header>{children}</body></html>);
}

app/dashboard/layout.tsx:

export default function DashboardLayout({ children }) {return (<div><nav>Dashboard Navigation</nav><div>{children}</div></div>);
}
  1. 服务器组件(Server Components):
    • 提供了一种新的组件类型,仅在服务器端渲染,提高性能和安全性。
    • 可以直接在组件中获取数据,而无需在客户端进行额外的数据获取。

app/dashboard/settings/page.tsx:

export const revalidate = 60; // Revalidate data every 60 secondsexport default async function SettingsPage() {const data = await fetchData();return <div>{data}</div>;
}async function fetchData() {const res = await fetch('https://api.example.com/data');const json = await res.json();return JSON.stringify(json);
}
  1. 并行路由(Parallel Routing):
    • 允许在同一页面内定义多个并行路由,增强用户体验。
    • 适用于需要同时加载多个部分的复杂页面。

并行路由(Parallel Routing)是 Next.js App Router 的一个强大特性,它允许在同一个页面中同时显示多个独立的内容区域,这些区域可以通过不同的路径进行渲染。通过并行路由,你可以更灵活地管理复杂的页面布局,提升用户体验。

假设我们有一个页面,它需要同时显示两个独立的内容区域:一个用于显示用户信息,另一个用于显示通知。这两个区域可以独立加载和渲染。

目录结构

/app/parallel@userpage.tsx@notificationspage.tsxlayout.tsxpage.tsx

并行路由布局文件

app/layout.tsx:

export default function RootLayout({ children }) {return (<html><head /><body>{children}</body></html>);
}

app/parallel/layout.tsx:

export default function ParallelLayout({ user, notifications }) {return (<div><div>{user}</div><div>{notifications}</div></div>);
}

并行路由内容页面

app/parallel/@user/page.tsx:

export default function UserPage() {return <div>User Information</div>;
}

app/parallel/@notifications/page.tsx:

export default function NotificationsPage() {return <div>Notifications</div>;
}

主页面文件

app/page.tsx:

import Link from 'next/link';export default function HomePage() {return (<div><h1>Home Page</h1><Link href="/parallel">Go to Parallel Page</Link></div>);
}

工作原理

  • app/parallel/@user/page.tsxapp/parallel/@notifications/page.tsx 定义了两个独立的内容区域。
  • app/parallel/layout.tsx 用于渲染这两个区域。
  • app/parallel/layout.tsx 文件中,usernotifications 是并行路由插槽。
  • 这些插槽分别渲染 app/parallel/@user/page.tsxapp/parallel/@notifications/page.tsx 文件的内容。
  • 当用户访问 /parallel 路由时,ParallelLayout 会同时渲染 UserPageNotificationsPage,并在页面中显示它们的内容。

并行路由允许在同一页面中并行渲染多个独立的内容区域,这在构建复杂的用户界面时非常有用。通过这种方式,你可以更高效地管理页面布局,提高应用的可维护性和用户体验。

  1. 界面隔离(Isolated Interfaces):
    • 使用新的界面隔离机制,防止组件之间的意外依赖和副作用。
    • 提高组件的可维护性和可测试性。

app/dashboard/settings/page.tsx:

'use client';import { useState } from 'react';export default function SettingsPage() {const [setting, setSetting] = useState('');const handleChange = (e) => {setSetting(e.target.value);};return (<div><input value={setting} onChange={handleChange} /><p>Current setting: {setting}</p></div>);
}

示例代码通过定义单独的文件并使用严格的组件分离。

  1. 全新的数据获取机制:
    • 支持 fetch 和其他数据获取方法直接在服务器组件中使用。
    • 提供了更灵活的数据获取方式。

app/dashboard/settings/page.tsx:

export default async function SettingsPage() {const data = await fetchData();return <div>{data}</div>;
}async function fetchData() {const res = await fetch('https://api.example.com/data', {next: { revalidate: 60 }});const json = await res.json();return JSON.stringify(json);
}
与 Pages Router 的对比
  • 文件结构:

    • Pages Router: 基于文件的路由,页面文件直接放置在 pages 目录中。
    • App Router: 基于文件夹的路由,使用 app 目录,路由通过文件夹结构定义,支持更复杂的布局和路由结构。
  • 布局管理:

    • Pages Router: 需要在每个页面中手动引入布局组件。
    • App Router: 使用布局文件夹,自动应用布局,支持嵌套布局。
  • 服务器组件:

    • Pages Router: 主要使用客户端组件,数据获取通常在 getServerSidePropsgetStaticProps 中完成。
    • App Router: 引入服务器组件,允许在服务器端直接进行数据获取,提高性能和安全性。
  • 并行路由:

    • Pages Router: 需要手动管理并行路由和状态。
    • App Router: 提供内置支持,更容易实现复杂的页面结构。

具体使用示例

创建 App Router 项目
npx create-next-app@latest my-app --experimental-app
cd my-app
目录结构示例
/app/dashboard/settingspage.tsxlayout.tsx/aboutpage.tsxlayout.tsxpage.tsx
  • app/layout.tsx: 顶级布局文件,应用于所有页面。
  • app/page.tsx: 应用的主页。
  • app/dashboard/layout.tsx: 仪表板的布局,应用于仪表板下的所有页面。
  • app/dashboard/settings/page.tsx: 仪表板设置页面。
示例代码

app/layout.tsx:

export default function RootLayout({ children }) {return (<html><head /><body>{children}</body></html>);
}

app/dashboard/layout.tsx:

export default function DashboardLayout({ children }) {return (<div><nav>/* Dashboard navigation */</nav><main>{children}</main></div>);
}

app/dashboard/settings/page.tsx:

export default function SettingsPage() {return <h1>Dashboard Settings</h1>;
}

总结

Next.js 的 App Router 提供了更强大的路由和布局管理功能,通过引入服务器组件、并行路由和新的数据获取机制,使得开发复杂的 React 应用更加高效和灵活。对于希望利用这些新特性构建现代化 Web 应用的开发者来说,App Router 是一个值得探索和使用的工具。

相关文章:

WHAT - React 学习系列(二)

目录 一、官方介绍二、框架具体对比1. Next.js(Pages Router)2. Remix3. Gatsby4. Expo&#xff08;用于原生应用&#xff09;5. Next.js(App Router)Next.js App Router主要特性与 Pages Router 的对比 具体使用示例创建 App Router 项目目录结构示例示例代码 总结 这一篇主要…...

Java 反射机制 -- Java 语言反射的概述、核心类与高级应用

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 010 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自…...

【Python入门与进阶】Jupyter Notebook配置与优化

目录 1.Jupyter Notebook简介 2.Jupyter Notebook的安装 2.1 命令行安装 2.2 可视化界面安装 3.Jupyter Notebook的使用 3.1 启动 Jupyter Notebook 3.2 Jupyter Notebook 界面介绍 3.3 创建新的 Notebook 3.4 编写和运行代码单元 3.5 使用 Markdown 编写文档 3.6 保…...

DataCap 自定义 File 转换器

DataCap 支持自定义 File 转换器&#xff0c;使用者可以编写自己的文件转换器集成到 DataCap 中。该文档主要讲解如何快速集成一个文件转换器到 DataCap 系统中。 该模块我们主要使用到的是 file 模块内的代码&#xff0c;我们本文使用 json 来做示例。 模块基本配置 新建项目…...

ARM32开发--IIC原理

知不足而奋进 望远山而前行 目录 文章目录 前言 目标 内容 I2C通讯规则 I2C写操作 I2C读流程 通讯信号 开始 结束 发送数据 bit发送 Byte发送 等待响应 接收数据 bit接收 Byte接收 发送响应 总结 前言 在现代消费电子和工业电子领域&#xff0c;各种类型的…...

列表、集合、字典的相关练习

1、使用列表推导式&#xff0c;输出1~100的所有素数 输入下面代码 # 定义一个辅助函数用来判断是否是素数 def is_prime(num):if num < 1:return Falsefor i in range(2, int(num**0.5) 1): #int函数将结果转换为整数&#xff0c;向下取整if num % i 0:return Falsere…...

填报志愿选大学专业,文科生如何选专业?

读文科的同学接触的专业知识相对广泛&#xff0c;往往被认为是“万金油”&#xff0c;他们仿佛什么都能做&#xff0c;但是和专业技能类知识不同&#xff0c;缺乏技术支持&#xff0c;从而使得文科专业的就业方向和前景远远比不上理科专业那么明朗&#xff0c;对于众多文科生而…...

如何实现跨域

如何实现跨域 当浏览器执行JS脚本时&#xff0c;会检测脚本要访问的协议&#xff0c;域名&#xff0c;端口号是不是和当前网址一致&#xff0c;不一致就是跨域。 跨域是不允许的&#xff0c;这种限制叫做浏览器的同源策略&#xff0c;简单就是浏览器不允许一个源加载脚本与其…...

从零开始利用树莓派+扬声器,实现简单的蓝牙音箱,手机连接放歌

背景 树莓派4B自带蓝牙和Wifi, 无需外接 USB dongle; 蓝牙最常见的应用是近距离传输数据,比如蓝牙传文件,蓝牙音箱等。正好家里有个普通的usb供电的便携音箱; 本文用树莓派蓝牙+普通音箱,实现简单的蓝牙音箱。 大致分为三个部分: kernel/driver层的ALSA驱动框架蓝牙音…...

今年的就业环境不容乐观,你想好怎么应对了吗

今年的就业环境不容乐观&#xff0c;你想好怎么应对了吗 毕业生进入职场的历程往往充满挑战和未知&#xff0c;尤其是在当前经济环境下&#xff0c;失业问题愈发凸显。本文通过分享几位年轻人的真实经历&#xff0c;剖析大学生及职场人士面临的困境&#xff0c;并提供应对策略…...

测试 halcon measure_projection 算子

期望结果完全相同&#xff0c;但是下面的测试结果和halcon的差值如下: [0.132838, 0.231991, 0.265157, 0.296903, 0.0998573, 0.165907, 0.230686, 0.130266, 0.0977104, 0.197109, 0.198173, 0.197086, 0.190943, 0.177665, 0.163521, 0.146541, 0.161362, 0.166666, 0.2281…...

网络安全岗位必须知道到:高性能抓取,多线程,异步逆向分析(Js逆向破解/APP逆向破解)反爬原理和解决方法,不然你的Python会有Bug

JS逆向破解和APP逆向破解以及反爬技术是网络安全和数据保护领域的重要话题。 遵循安全开发的最佳实践&#xff0c;包括输入验证、数据加密、权限管理等&#xff0c;以减少安全漏洞的出现。 坚决维护网络安全及开发安全&#xff0c;杜绝一切被爬&#xff0c;非法爬取数据的行为…...

lua网站开发中如何制作自定义模块

自定义模块是FastWeb框架的重要拓展功能&#xff0c;用来扩展和增强服务的能力。通过自定义模块&#xff0c;开发者可以轻松添加特定的功能和特性&#xff0c;使得网站开发更加灵活和高效。本文将演示如何添加自己的模块作为FastWeb的拓展&#xff0c;为框架的壮大与支持提供重…...

线性规划问题——单纯形算法

第一步&#xff1a;化“约束标准型” 在每个等式约束中至少有一个变量的系数为正&#xff0c;且这个变量只在该约束中出现。在每个约束方程中选择一个这样的变量称为基本变量。 剩下变量称为非基本变量。 一个简单的栗子 上图是一个约束标准型线性规划的例子。 等式1&#x…...

ADS基础教程20 - 电磁仿真(EM)参数化

EM介绍 一、引言二、参数化设置1.参数定义2.参数赋值3.创建EM模型和符号 四、总结 一、引言 参数化EM仿真&#xff0c;是在Layout环境下创建参数&#xff0c;相当于在原理图中声明变量。 二、参数化设置 1.参数定义 1&#xff09;在Layout视图&#xff0c;菜单栏中选中EM&g…...

NAND flash测试-雷龙发展

文章目录 一、简介 二、速度测试 最近比较忙&#xff0c;也一直没空发什么文章&#xff0c;这算是新年第一篇吧&#xff0c;正好最近收到了一个雷龙的flash芯片&#xff0c;先拿来玩一下吧。 有兴趣的小伙伴可以去雷龙官网找小姐姐领取一个免费试用。 一、简介 大概样子就是上面…...

CMake的学习之路

目录 一、基础命令 二、编译选项和设置 三、文件和目录操作 四、控制流命令 五、其他命令 六、CMake构建级别 CMake是一个跨平台的自动化建构系统&#xff0c;它使用一种人类可读的配置文件&#xff08;CMakeLists.txt&#xff09;来控制软件编译过程。以下是CMake中的一些…...

算法体系-22 第二十二节:暴力递归到动态规划(四)

一 最小距离累加和 1.1 描述 给定一个二维数组matrix&#xff0c;一个人必须从左上角出发&#xff0c;最后到达右下角 沿途只可以向下或者向右走&#xff0c;沿途的数字都累加就是距离累加和 返回最小距离累加和 1.2 分析...

Docker:利用Docker搭建一个nginx服务

文章目录 搭建一个nginx服务认识nginx服务Web服务器反向代理服务器高性能特点 安装nginx启动nginx停止nginx查找nginx镜像拉取nginx镜像&#xff0c;启动nginx站点其他方式拉取nginx镜像信息通过 DIGEST 拉取镜像 搭建一个nginx服务 首先先认识一下nginx服务&#xff1a; NGI…...

docker Pulling fs layer 含义

在使用Docker时&#xff0c;当你执行 docker pull 命令来获取一个新的镜像&#xff0c;控制台输出中可能会出现 "Pulling fs layer" 的信息。这是Docker拉取镜像过程中的一个步骤&#xff0c;下面是对这一过程的解释&#xff1a; Docker 镜像是由一系列的层&#xf…...

3个高效功能让视频创作者轻松生成专业字幕

3个高效功能让视频创作者轻松生成专业字幕 【免费下载链接】video-srt-windows 这是一个可以识别视频语音自动生成字幕SRT文件的开源 Windows-GUI 软件工具。 项目地址: https://gitcode.com/gh_mirrors/vi/video-srt-windows 工具概述 VideoSrt是一款基于Golang开发的…...

用51单片机定时器做一个多功能秒表:代码详解如何整合数码管、按键与中断

51单片机多功能秒表开发实战&#xff1a;从模块整合到系统思维进阶 在嵌入式开发领域&#xff0c;能够独立完成一个功能完整的综合项目&#xff0c;往往是区分初学者与进阶开发者的关键分水岭。今天&#xff0c;我们将以51单片机为核心&#xff0c;打造一个具有启动/暂停、清零…...

从CVE-2025-65112到NPM投毒:手把手教你搭建安全的私有包仓库(以PubNet为例)

从CVE-2025-65112到NPM投毒&#xff1a;手把手教你搭建安全的私有包仓库&#xff08;以PubNet为例&#xff09; 最近几年&#xff0c;软件供应链攻击事件频发&#xff0c;从SolarWinds事件到Log4j漏洞&#xff0c;再到最近的NPM投毒事件&#xff0c;每一次都让开发者们心惊胆战…...

告别重复造轮子:用快马平台高效生成ibbot开发脚手架与核心模块

今天想和大家分享一个提升ibbot开发效率的实用技巧。作为一个经常需要开发对话机器人的程序员&#xff0c;我发现每次从零开始搭建项目结构、编写基础模块特别耗时。最近尝试用InsCode(快马)平台生成项目脚手架&#xff0c;效果出乎意料的好。 项目结构自动生成 平台能根据自然…...

STM32CubeMX实战指南:DMA驱动USART高效数据传输

1. DMA与USART协作的核心价值 第一次接触STM32的DMA功能时&#xff0c;我正被一个传感器数据采集项目折磨得焦头烂额。当时用传统的中断方式处理串口数据&#xff0c;CPU占用率直接飙到70%&#xff0c;整个系统卡得像老式拨号上网。直到尝试了DMAUSART组合&#xff0c;才真正体…...

实战分享:如何用本地替换和插桩调试搞定Kasada最新版x-kpsdk-cd环境检测

逆向工程实战&#xff1a;Kasada最新版x-kpsdk-cd环境检测的深度调试策略 在当今Web安全防护体系中&#xff0c;Kasada作为新一代反自动化攻击解决方案&#xff0c;其x-kpsdk-cd机制通过动态加密和运行时环境检测构建了强大的防御层。面对从280位扩展到294位的加密数组和Proxy保…...

效果实测:Image-to-Video如何将风景照变成动态视频?

效果实测&#xff1a;Image-to-Video如何将风景照变成动态视频&#xff1f; 1. 惊艳的开场&#xff1a;静态照片"活"起来了 想象一下&#xff0c;你手机里那些美丽的风景照片突然"活"了过来——海浪开始翻滚&#xff0c;云朵缓缓飘动&#xff0c;树叶在微…...

表贴式PMSM超前角弱磁控制策略:弱磁id=0控制速度提升研究,从2000rpm到4000rp...

该模型实现表贴式PMSM的超前角弱磁控制策略 不打开弱磁id0控制速度只能达到2000rpm&#xff0c;打开能够弱磁到4000rpm在调试表贴式永磁同步电机&#xff08;PMSM&#xff09;时&#xff0c;发现一个有趣的现象&#xff1a;当保持id0的传统控制策略时&#xff0c;电机转速死活卡…...

[拆解LangChain执行引擎-07] 静态上下文在Pregel中的应用

在 Pregel 模型中&#xff0c;静态上下文是一个专门设计的依赖注入容器。它的出现是为了解决在复杂的图计算中&#xff0c;如何优雅地处理“不属于图状态&#xff0c;但Node运行又必须依赖的外部环境信息”这一痛点。这些数据具有一个共同的性质&#xff0c;那就是在整个运行生…...

3.多表关联在电商数据分析中的核心价值

多表关联在电商数据分析中的核心价值 第1章 多表关联、子查询与行列转换在电商数据分析中的核心价值 1.1 为什么单表查询不够用 我刚开始做数据分析的时候&#xff0c;以为SQL就是在一张表上做筛选和汇总。直到有一天&#xff0c;运营问我&#xff1a;“这批高价值用户&#xf…...