中文

了解如何实施 React 渐进式增强,创建即使在 JavaScript 禁用或初始加载期间也易于访问、性能卓越且稳健的网站。

React 渐进式增强:构建 JavaScript 可选组件

在当今的 Web 开发领域,像 React 这样的 JavaScript 框架无处不在。虽然它们为创建动态和交互式用户界面提供了强大的工具,但仅仅依赖 JavaScript 可能会导致可访问性、性能和 SEO 方面的问题。这就是渐进式增强(Progressive Enhancement, PE)发挥作用的地方。渐进式增强是一种 Web 开发策略,它优先确保核心网站功能和内容对所有用户都可用,无论他们的浏览器能力或 JavaScript 是否可用。React 渐进式增强专注于构建即使没有 JavaScript 也能运行的组件,提供一个基线体验,然后通过 JavaScript 对其进行增强,以实现更丰富的交互性。

什么是渐进式增强?

渐进式增强并非一个新概念。它是一种倡导分层构建网站的理念,从坚实的 HTML 和 CSS 基础开始。这个基础确保了内容对每个人都是可访问的,包括残障用户、使用低带宽连接的用户或禁用 JavaScript 的用户。然后,将 JavaScript 作为一种增强功能添加进来,以提供更丰富、更具交互性的体验。可以把它想象成建造一座房子:你从基本结构开始,然后再添加那些精美的功能。

渐进式增强的关键原则:

为什么渐进式增强在 React 中很重要

默认情况下,React 是一个重度依赖 JavaScript 的框架。当一个 React 应用在浏览器中渲染时,通常需要下载、解析和执行大量的 JavaScript。这可能导致几个问题:

在 React 中实施渐进式增强可以解决这些挑战,通过提供一个即使没有 JavaScript 也能正常工作的基线体验。这不仅改善了可访问性和性能,还通过确保搜索引擎可以轻松抓取和索引内容来增强 SEO。

React 渐进式增强的技术

有几种技术可用于在 React 中实现渐进式增强:

1. 服务器端渲染 (SSR)

服务器端渲染(SSR)是一种在服务器上渲染 React 组件并将生成的 HTML 发送到客户端的技术。这使得浏览器可以在 JavaScript 下载和执行之前立即显示内容。SSR 提供了几个好处:

像 Next.js 和 Remix 这样的框架使得在 React 中实现 SSR 相对简单。它们为服务器端渲染、路由和数据获取提供了内置支持。

使用 Next.js 的示例:

Next.js 自动为 `pages` 目录中的页面处理 SSR。这里有一个简单的例子:


// pages/index.js
function HomePage() {
  return 

欢迎来到我的网站!

; } export default HomePage;

当用户访问主页时,Next.js 将在服务器上渲染 `HomePage` 组件,并将生成的 HTML 发送到浏览器。

2. 静态站点生成 (SSG)

静态站点生成(SSG)是一种在构建时渲染 React 组件,并将生成的 HTML 文件直接提供给客户端的技术。这甚至比 SSR 更快,因为 HTML 是预先生成的,不需要在每个请求上进行任何服务器端处理。

像 Gatsby 和 Next.js 这样的框架也支持 SSG。它们允许您在构建时从 React 组件生成静态 HTML 文件。

使用 Next.js 的示例:

要在 Next.js 中使用 SSG,您可以使用 `getStaticProps` 函数来获取数据并将其作为 props 传递给您的组件。


// pages/blog/[id].js

export async function getStaticProps({ params }) {
  const postId = params.id;
  // 从 API 或数据库获取文章数据
  const post = { id: postId, title: `文章 ${postId}`, content: `文章 ${postId} 的内容` };

  return {
    props: {
      post,
    },
  };
}

export async function getStaticPaths() {
  // 定义 `id` 参数的可能值
  const paths = [
    { params: { id: '1' } },
    { params: { id: '2' } },
    { params: { id: '3' } },
  ];

  return {
    paths,
    fallback: false, // 如果您想按需生成页面,请设置为 true
  };
}

function BlogPost({ post }) {
  return (
    

{post.title}

{post.content}

); } export default BlogPost;

Next.js 将在构建时为每篇文章生成静态 HTML 文件。

3. 使用 `

`


如果启用 JavaScript,将显示此内容。

您可以使用 `

4. 条件渲染

条件渲染允许您根据 JavaScript 是否启用,来渲染不同的组件或内容。您可以使用它来逐步增强用户界面的 JavaScript 功能,同时仍然提供一个没有 JavaScript 的基本体验。


import { useState, useEffect } from 'react';

function MyComponent() {
  const [isJavaScriptEnabled, setIsJavaScriptEnabled] = useState(true);

  useEffect(() => {
    // 检查 JavaScript 是否启用。这是一个简化的例子。
    // 在实际场景中,您可能需要使用更可靠的方法。
    setIsJavaScriptEnabled(typeof window !== 'undefined');
  }, []);

  return (
    
{isJavaScriptEnabled ? (

此内容由 JavaScript 渲染。

) : (

此内容在没有 JavaScript 的情况下渲染。

)}
); } export default MyComponent;

这个例子使用 `useState` 和 `useEffect` 钩子来检查浏览器中是否启用了 JavaScript。基于此,它会渲染不同的内容。

5. 使用语义化 HTML

使用语义化 HTML 元素对于可访问性和渐进式增强都至关重要。语义化 HTML 元素为内容提供了意义和结构,使辅助技术和搜索引擎爬虫更容易理解。例如,使用 `

`、`