最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React項(xiàng)目中服務(wù)器端渲染SSR的實(shí)現(xiàn)與優(yōu)化詳解

 更新時(shí)間:2025年03月25日 09:39:23   作者:前端大白話  
在傳統(tǒng)的 React 項(xiàng)目里,頁面的渲染工作是在瀏覽器里完成的,而服務(wù)器端渲染(SSR)則是讓服務(wù)器先把 React 組件渲染成 HTML 字符串,再把這個(gè) HTML 字符串發(fā)送給瀏覽器,下面我們就來看看具體實(shí)現(xiàn)方法吧

什么是服務(wù)器端渲染(SSR)

在傳統(tǒng)的 React 項(xiàng)目里,頁面的渲染工作是在瀏覽器里完成的。也就是當(dāng)你訪問一個(gè)網(wǎng)頁時(shí),瀏覽器會(huì)先下載 HTML、CSS 和 JavaScript 文件,接著運(yùn)行 JavaScript 代碼來生成頁面內(nèi)容。而服務(wù)器端渲染(SSR)則是讓服務(wù)器先把 React 組件渲染成 HTML 字符串,再把這個(gè) HTML 字符串發(fā)送給瀏覽器。這樣一來,瀏覽器就能直接顯示已經(jīng)渲染好的頁面,不用再等待 JavaScript 代碼運(yùn)行了。

SSR 的優(yōu)勢(shì)

更快的初始加載速度:因?yàn)闉g覽器拿到的是已經(jīng)渲染好的 HTML,所以能更快地顯示頁面內(nèi)容,減少用戶等待時(shí)間。

更好的 SEO:搜索引擎爬蟲可以直接讀取服務(wù)器返回的 HTML 內(nèi)容,有利于網(wǎng)站在搜索引擎中的排名。

更好的用戶體驗(yàn):特別是在網(wǎng)絡(luò)較慢的情況下,用戶能更快地看到頁面內(nèi)容,提升體驗(yàn)。

如何在 React 項(xiàng)目中進(jìn)行 SSR

下面我會(huì)一步步教你如何在 React 項(xiàng)目中實(shí)現(xiàn) SSR。

1. 創(chuàng)建 React 項(xiàng)目

首先,你得創(chuàng)建一個(gè)新的 React 項(xiàng)目??梢允褂?create-react-app 來創(chuàng)建:

npx create-react-app my-ssr-app
cd my-ssr-app

2. 安裝必要的依賴

我們需要安裝一些額外的依賴,像 express 用于創(chuàng)建服務(wù)器,react-dom/server 用于在服務(wù)器端渲染 React 組件。

npm install express react-dom

3. 修改項(xiàng)目結(jié)構(gòu)

在項(xiàng)目根目錄下創(chuàng)建一個(gè) server.js 文件,這個(gè)文件將用于創(chuàng)建服務(wù)器和處理 SSR。

4. 編寫 server.js 文件

下面是 server.js 文件的詳細(xì)代碼,每一行都有注釋:

// 引入 express 模塊,用于創(chuàng)建服務(wù)器
const express = require('express');
// 創(chuàng)建一個(gè) express 應(yīng)用實(shí)例
const app = express();
// 引入 React 庫
const React = require('react');
// 引入 ReactDOMServer 用于在服務(wù)器端渲染 React 組件
const ReactDOMServer = require('react-dom/server');
// 引入 App 組件,這里假設(shè)你的主組件是 App
const App = require('./src/App').default;

// 處理根路徑的請(qǐng)求
app.get('/', (req, res) => {
    // 使用 ReactDOMServer.renderToString 方法將 App 組件渲染成 HTML 字符串
    const html = ReactDOMServer.renderToString(<App />);
    // 定義一個(gè)完整的 HTML 頁面模板,將渲染好的 HTML 字符串插入到模板中
    const page = `
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>My SSR App</title>
        </head>
        <body>
            <!-- 插入渲染好的 HTML 字符串 -->
            <div id="root">${html}</div>
            <!-- 引入客戶端的 JavaScript 文件 -->
            <script src="/static/js/bundle.js"></script>
        </body>
        </html>
    `;
    // 將完整的 HTML 頁面發(fā)送給客戶端
    res.send(page);
});

// 監(jiān)聽 3001 端口,啟動(dòng)服務(wù)器
const port = 3001;
app.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});

5. 修改 src/index.js 文件

在 src/index.js 文件中,我們需要使用 hydrateRoot 方法來將服務(wù)器端渲染的 HTML 與客戶端的 React 代碼進(jìn)行關(guān)聯(lián)。

// 引入 React 庫
import React from 'react';
// 引入 ReactDOM 用于在客戶端渲染 React 組件
import ReactDOM from 'react-dom/client';
// 引入 App 組件
import App from './App';

// 獲取 id 為 root 的 DOM 元素
const rootElement = document.getElementById('root');
// 使用 hydrateRoot 方法將服務(wù)器端渲染的 HTML 與客戶端的 React 代碼進(jìn)行關(guān)聯(lián)
const root = ReactDOM.hydrateRoot(rootElement, <App />);

6. 運(yùn)行項(xiàng)目

首先,啟動(dòng)服務(wù)器:

node server.js

然后,在瀏覽器中訪問 http://localhost:3001,你就可以看到已經(jīng)使用 SSR 渲染的頁面了。

總結(jié)

通過以上步驟,你就可以在 React 項(xiàng)目中實(shí)現(xiàn)服務(wù)器端渲染(SSR)了。SSR 能帶來更快的初始加載速度、更好的 SEO 和用戶體驗(yàn)。希望這個(gè)教程能幫助你理解和實(shí)現(xiàn) SSR。

如何優(yōu)化React項(xiàng)目的服務(wù)器端渲染性能

在 React 項(xiàng)目里,優(yōu)化服務(wù)器端渲染(SSR)性能可從多方面著手,下面是一些實(shí)用的優(yōu)化方法和對(duì)應(yīng)的代碼示例。

1. 代碼分割

代碼分割能減少初始加載的 JavaScript 代碼量,讓頁面更快加載。在 React 中,可使用 React.lazy 和 Suspense 來實(shí)現(xiàn)。

// 假設(shè)這是你的路由配置文件
import React, { lazy, Suspense } from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';

// 懶加載組件
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));

const App = () => {
    return (
        <Router>
            <Suspense fallback={<div>Loading...</div>}>
                <Routes>
                    <Route path="/" element={<Home />} />
                    <Route path="/about" element={<About />} />
                </Routes>
            </Suspense>
        </Router>
    );
};

???????export default App;

上述代碼借助 React.lazy 來懶加載組件,Suspense 則在組件加載期間顯示加載提示。

2. 緩存機(jī)制

使用緩存可避免對(duì)相同內(nèi)容的重復(fù)渲染,提升服務(wù)器性能。在 Node.js 服務(wù)器中,可使用 lru-cache 來實(shí)現(xiàn)簡單的緩存。

const express = require('express');
const React = require('react');
const ReactDOMServer = require('react-dom/server');
const LRU = require('lru-cache');
const App = require('./src/App').default;

const app = express();
// 創(chuàng)建一個(gè) LRU 緩存實(shí)例,最大緩存項(xiàng)數(shù)為 100
const cache = new LRU({ max: 100 });

app.get('/', (req, res) => {
    const cacheKey = req.url;
    // 檢查緩存中是否存在該 URL 的渲染結(jié)果
    if (cache.has(cacheKey)) {
        const cachedHtml = cache.get(cacheKey);
        return res.send(cachedHtml);
    }

    const html = ReactDOMServer.renderToString(<App />);
    // 將渲染結(jié)果存入緩存
    cache.set(cacheKey, html);
    res.send(`
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>My SSR App</title>
        </head>
        <body>
            <div id="root">${html}</div>
            <script src="/static/js/bundle.js"></script>
        </body>
        </html>
    `);
});

const port = 3001;
app.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});

此代碼利用 lru-cache 來緩存渲染結(jié)果,若緩存中存在請(qǐng)求的 URL 對(duì)應(yīng)的渲染結(jié)果,就直接返回緩存內(nèi)容。

3. 異步數(shù)據(jù)獲取優(yōu)化

在 SSR 中,異步數(shù)據(jù)獲取是性能瓶頸之一。可使用 React Query 或 SWR 等庫來優(yōu)化數(shù)據(jù)獲取。

import React from 'react';
import { useQuery } from 'react-query';

// 模擬異步數(shù)據(jù)獲取函數(shù)
const fetchData = async () => {
    const response = await fetch('https://api.example.com/data');
    return response.json();
};

const MyComponent = () => {
    // 使用 useQuery 進(jìn)行數(shù)據(jù)獲取
    const { data, isLoading, error } = useQuery('myData', fetchData);

    if (isLoading) return <div>Loading...</div>;
    if (error) return <div>Error: {error.message}</div>;

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

export default MyComponent;

上述代碼使用 React Query 的 useQuery 鉤子來進(jìn)行數(shù)據(jù)獲取,它會(huì)自動(dòng)處理緩存、重試等操作。

4. 服務(wù)器優(yōu)化

合理配置服務(wù)器資源也很關(guān)鍵,可使用 pm2 來管理 Node.js 進(jìn)程,保證服務(wù)器的高可用性和性能。

# 全局安裝 pm2
npm install -g pm2
# 使用 pm2 啟動(dòng)服務(wù)器
pm2 start server.js

5. 優(yōu)化 CSS 加載

采用 CSS-in-JS 或 extract-text-webpack-plugin 等工具,將 CSS 提取到單獨(dú)的文件中,避免內(nèi)聯(lián) CSS 帶來的性能問題。

// 在 webpack 配置中使用 MiniCssExtractPlugin 提取 CSS
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

???????module.exports = {
    // 其他配置...
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader'
                ]
            }
        ]
    },
    plugins: [
        new MiniCssExtractPlugin({
            filename: '[name].[contenthash].css'
        })
    ]
};

上述代碼借助 MiniCssExtractPlugin 把 CSS 提取到單獨(dú)的文件中。

通過以上這些方法,能顯著優(yōu)化 React 項(xiàng)目的服務(wù)器端渲染性能。

以上就是React項(xiàng)目中服務(wù)器端渲染SSR的實(shí)現(xiàn)與優(yōu)化詳解的詳細(xì)內(nèi)容,更多關(guān)于React服務(wù)器渲染SSR的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React中的頁面跳轉(zhuǎn)方式示例詳解

    React中的頁面跳轉(zhuǎn)方式示例詳解

    React Router提供了幾種不同的跳轉(zhuǎn)方式,包括使用組件進(jìn)行頁面跳轉(zhuǎn)、使用組件進(jìn)行重定向,以及使用編程式導(dǎo)航進(jìn)行跳轉(zhuǎn),這篇文章主要介紹了React中的頁面跳轉(zhuǎn)方式詳解,需要的朋友可以參考下
    2023-09-09
  • React配置代理方式(proxy)

    React配置代理方式(proxy)

    這篇文章主要介紹了React配置代理方式(proxy),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • React框架核心原理全面深入解析

    React框架核心原理全面深入解析

    React是前端開發(fā)每天都用的前端框架,自然要深入掌握它的原理。我用 React 也挺久了,這篇文章就來總結(jié)一下我對(duì) react 原理的理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-11-11
  • React18新特性startTransition詳解

    React18新特性startTransition詳解

    React18的新特性startTransition主要是為了優(yōu)化用戶體驗(yàn),通過標(biāo)記低優(yōu)先級(jí)的更新任務(wù),如頁面重渲染,使它們不會(huì)阻塞高優(yōu)先級(jí)的緊急任務(wù)如用戶輸入響應(yīng),本文介紹React18新特性startTransition,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • React父傳子的單項(xiàng)數(shù)據(jù)流props的使用

    React父傳子的單項(xiàng)數(shù)據(jù)流props的使用

    props是React組件通信的核心,本文就來詳細(xì)的介紹一下React父傳子的單項(xiàng)數(shù)據(jù)流props的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12
  • React使用useSearchParams同步URL和查詢參數(shù)的方法

    React使用useSearchParams同步URL和查詢參數(shù)的方法

    在開發(fā)React應(yīng)用時(shí),我們經(jīng)常遇到一種場(chǎng)景:用戶在搜索框輸入關(guān)鍵詞,篩選出一個(gè)列表,然后希望把這個(gè)結(jié)果分享給同事,在React Router v6中,useSearchParams這個(gè)Hook就是專門用來處理這個(gè)問題的,本文將介紹如何使用它來實(shí)現(xiàn) URL 與應(yīng)用狀態(tài)的同步,需要的朋友可以參考下
    2025-12-12
  • Can't?perform?a?React?state?update?on?an?unmounted?component報(bào)錯(cuò)解決

    Can't?perform?a?React?state?update?on?an?unmoun

    這篇文章主要為大家介紹了Can't?perform?a?React?state?update?on?an?unmounted?component報(bào)錯(cuò)解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 詳解React組件卸載怎么中止遞歸方法

    詳解React組件卸載怎么中止遞歸方法

    最近在處理項(xiàng)目代碼的時(shí)候,出現(xiàn)了一個(gè)bug,組件中的方法在組件卸載后仍然在執(zhí)行,代碼片段發(fā)給我看,但是變量的用意我也不懂,只看到有方法調(diào)用自身方法,這不就是遞歸嘛,所以本文詳細(xì)給大家介紹了React組件卸載怎么中止遞歸方法,需要的朋友可以參考下
    2024-01-01
  • React中styled-components的使用

    React中styled-components的使用

    styled-components 樣式化組件,主要作用是它可以編寫實(shí)際的CSS代碼來設(shè)計(jì)組件樣式,本文主要介紹了React中styled-components的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-04-04
  • DOM 注入實(shí)踐之如何在 React 中優(yōu)雅地?cái)U(kuò)展第三方組件

    DOM 注入實(shí)踐之如何在 React 中優(yōu)雅地?cái)U(kuò)展第三方組件

    本文將介紹一種更優(yōu)雅的解決方案——DOM 注入 + React Portal,通過抽象的示例展示這種技術(shù)方案的應(yīng)用場(chǎng)景和實(shí)現(xiàn)方法,感興趣的朋友跟隨小編一起看看吧
    2026-03-03

最新評(píng)論

嘉义市| 青阳县| 牙克石市| 太康县| 鹰潭市| 军事| 镇远县| 丘北县| 谢通门县| 中卫市| 楚雄市| 西华县| 咸宁市| 眉山市| 石柱| 大宁县| 天全县| 新巴尔虎左旗| 蓝田县| 黄平县| 福州市| 老河口市| 民县| 鄄城县| 保康县| 沅陵县| 万载县| 龙岩市| 彭泽县| 东光县| 大竹县| 绍兴县| 合肥市| 高碑店市| 都安| 临沂市| 徐州市| 鞍山市| 榆社县| 西乌| 潢川县|