2月阅读周·React设计模式与最佳实践:服务端渲染的乐趣与益处篇

举报
叶一一 发表于 2025/02/23 15:21:59 2025/02/23
【摘要】 引言《React设计模式与最佳实践》本书将带你全面了解React中最有价值的设计模式,并展示如何在全新或已有的真实项目中应用设计模式与最佳实践。本书将帮助你让应用变得更加灵活、运行更流畅并且更容易维护——在不降低质量的情况下极大地提升工作流的速度。本书包括以下几部分内容:React的内部原理。编写整洁且可维护的代码,即保持代码整洁并遵循编程风格指南。开发能够在整个应用中复用的组件,构建应用的...

引言

《React设计模式与最佳实践》本书将带你全面了解React中最有价值的设计模式,并展示如何在全新或已有的真实项目中应用设计模式与最佳实践。本书将帮助你让应用变得更加灵活、运行更流畅并且更容易维护——在不降低质量的情况下极大地提升工作流的速度。

本书包括以下几部分内容:

  • React的内部原理。
  • 编写整洁且可维护的代码,即保持代码整洁并遵循编程风格指南。
  • 开发能够在整个应用中复用的组件,构建应用的一个关键因素在于使用组件,而要想保持代码库整洁且可维护,最重要的是开发真正可复用的组件。
  • 搭建应用架构,并创建真正可用的表单。
  • 服务端渲染是,虽然该特性开箱即用,但学习其正确用法很重要,因为这样才能充分加以利用。
  • 提升应用性能,性能是Web平台吸引用户的重要因素之一。React提供了一系列工具和技术来创建快如闪电的应用,这一章将全面介绍这些内容。
  • 测试与调试,编写全面的测试集对于创建稳定且可维护的代码至关重要。从另一方面来看,bug总会出现,而知道如何调试并尽早发现问题很关键。

服务端渲染的乐趣与益处

通用应用

服务端渲染(Server-Side Rendering, SSR)是指在服务器上执行React代码,生成HTML字符串,然后将其发送到客户端。这种方式有助于提高首屏加载速度和SEO优化。

为什么使用服务端渲染

  • 首屏加载速度:服务端渲染可以减少客户端的JavaScript执行时间,加快首屏内容的显示。
  • SEO:搜索引擎爬虫更容易抓取服务端渲染的内容。
  • 更好的用户体验:用户在网络状况不佳时也能更快地看到页面内容。

使用服务端渲染的原因

服务端渲染的主要优势在于改善应用性能和搜索引擎优化。

性能优化

服务端渲染可以显著提高应用的加载性能,尤其是对于移动用户和网络状况不佳的情况。

SEO优化

服务端渲染使得搜索引擎更容易抓取页面内容,从而提高网站在搜索结果中的排名。

基础示例

以下是一个简单的服务端渲染示例,使用Node.js和Express。

服务器端代码

Javascript
应用插入到 IDE复制新建文件保存到本地const express = require('express');
const React = require('react');
const ReactDOMServer = require('react-dom/server');
const App = require('./App').default;

const app = express();

app.get('*', (req, res) => {
  const appString = ReactDOMServer.renderToString(<App />);
  const html = `
    <html>
      <head>
        <title>My App</title>
      </head>
      <body>
        <div id="root">${appString}</div>
        <script src="/bundle.js"></script>
      </body>
    </html>
  `;
  res.send(html);
});

app.listen(3000, () => {
  console.log('Server is listening on port 3000');
});

客户端代码

Javascript
应用插入到 IDE复制新建文件保存到本地import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.hydrate(<App />, document.getElementById('root'));

数据获取示例

服务端渲染时,可以在服务器端预先获取数据,然后将数据传递给客户端。

服务器端数据获取

Javascript
应用插入到 IDE复制新建文件保存到本地app.get('*', async (req, res) => {
  const data = await fetchData(); // 假设fetchData是一个异步函数,用于获取数据
  const appString = ReactDOMServer.renderToString(<App data={data} />);
  // ...其余代码与上面相同
});

客户端数据获取

Javascript
应用插入到 IDE复制新建文件保存到本地import React from 'react';

function App({ data }) {
  return (
    <div>
      {data.map(item => <div key={item.id}>{item.name}</div>)}
    </div>
  );
}

export default App;

Next.js

Next.js是一个基于React的服务端渲染框架,它简化了服务端渲染和静态站点生成的流程。

创建Next.js应用

Bash
应用插入到 IDE复制新建文件保存到本地插入到终端npx create-next-app my-next-app
cd my-next-app
npm run dev

路由

Next.js提供了文件系统基础的路由机制。

应用插入到 IDE复制新建文件保存到本地pages/       # 在此文件夹中创建页面组件
├─ index.js  # 访问路径: /
├─ about.js  # 访问路径: /about
└─ users/   # 访问路径: /users
   ├─ index.js
   └─ [id].js

数据获取

Next.js提供了getServerSidePropsgetStaticPropsgetInitialProps等API来进行数据获取。

Javascript
应用插入到 IDE复制新建文件保存到本地// pages/posts/[id].js
import React from 'react';

function Post({ post }) {
  return <div>{post.title}</div>;
}

export async function getServerSideProps(context) {
  const res = await fetch(`https://.../posts/${context.params.id}`);
  const post = await res.json();

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

export default Post;

总结

在实际开发中,选择是否使用服务端渲染取决于项目的具体需求。对于需要快速首屏加载和良好SEO的项目,服务端渲染是一个很好的选择。Next.js等框架的出现,进一步简化了服务端渲染的实现,使得开发者可以更加专注于业务逻辑的开发。

服务端渲染不仅提高了用户体验,还有助于提升网站的安全性。由于部分渲染工作在服务器端完成,可以减少客户端JavaScript的体积,降低XSS攻击的风险。此外,服务端渲染还可以通过缓存策略进一步提高性能,例如使用Redis或Memcached等缓存服务器端渲染的结果。

然而,服务端渲染也有其缺点,比如增加了服务器的负担,特别是在高流量的情况下。因此,对于一些对性能要求极高的大型应用,可能需要考虑使用分布式服务器架构和负载均衡技术。

总之,《React设计模式与最佳实践》第8章为我们提供了一个全面的视角来审视服务端渲染的各种技术和最佳实践。通过学习和应用这些知识,我们可以更好地应对前端开发中的性能和SEO挑战,构建出更加高效和用户友好的Web应用。



作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏️ | 留言📝

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。