React服務端渲染 Next 使用詳解

1.?Next.js 概述

Next.js 是一個基于 React 的開源框架,專注于服務器端渲染(SSR)和靜態站點生成(SSG),提供開箱即用的 SSR 功能,簡化 React 應用的開發與部署。

2.?Next.js 的核心特性

  • SSR 支持:默認支持服務端渲染,提高應用性能和 SEO。

  • 靜態站點生成(SSG):預渲染頁面,提高加載速度。

  • 路由自動生成:基于文件系統的路由生成,無需手動配置。【約定式路由 vs 配置式路由】

  • API 路由:內置 API 路由功能,支持構建后端服務。

  • 代碼拆分:自動進行代碼分割,優化加載性能。

  • 開發體驗:內置熱重載(HMR)、錯誤處理等,提升開發效率。

3.?安裝與創建 Next.js 項目

使用命令行工具快速創建 Next.js 項目:

npx create-next-app my-next-app

按照提示選擇項目配置,如 TypeScript 支持、ESLint 等。

4. 項目結構解析

  my-next-app/├── pages/          // 頁面組件,Next.js 根據此目錄生成路由│   ├── index.js    // 對應 / 路徑│   ├── about.js    // 對應 /about│   └── ...├── public/         // 靜態文件,直接映射到應用的根路徑├── styles/         // 樣式文件├── components/     // 可復用的 React 組件├── api/            // API 路由├── next.config.js  // Next.js 配置文件├── package.json└── ...

5.?路由與頁面

基于文件系統的路由:

  • pages/index.js 對應 /

  • pages/about.js 對應 /about

  • pages/blog/[id].js 對應動態路由 /blog/:id

// pages/index.js
import React from 'react';const Home = () => (<div><h1>首頁</h1></div>
);export default Home;

6.?組件與布局

  • 組件(Components):可復用的 React 組件,放在 components/ 目錄。

  • 布局(Layouts):定義頁面的整體結構,如導航欄、頁腳等。

// components/Layout.js
import React from 'react';
import Link from 'next/link';const Layout = ({ children }) => (<div><nav><Link href="/">首頁</Link><Link href="/about">關于</Link></nav><main>{children}</main><footer>? 2024 My Website</footer></div>
);export default Layout;

在頁面中使用布局:

// pages/index.js
import React from 'react';
import Layout from '../components/Layout';const Home = () => (<Layout><h1>首頁</h1><p>歡迎來到我的網站!</p></Layout>
);export default

7.?數據獲取

7.1.?getStaticProps(靜態生成)

在構建時獲取數據,生成靜態頁面,適用于數據不經常變化的頁面。

// pages/posts.js
import React from 'react';export async function getStaticProps() {const res = await fetch('https://api.example.com/posts');const posts = await res.json();return {props: {posts,},};
}const Posts = ({ posts }) => (<div><h1>博客文章</h1><ul>{posts.map(post => (<li key={post.id}>{post.title}</li>))}</ul></div>
);export default Posts;

7.2.?getServerSideProps(服務器端渲染)

每次請求時獲取數據,生成頁面,適用于需要實時數據的頁面。

// pages/profile.js
import React from 'react';export async function getServerSideProps(context) {const res = await fetch(`https://api.example.com/user/${context.params.id}`);const user = await res.json();return {props: {user,},};
}const Profile = ({ user }) => (<div><h1>{user.name} 的個人資料</h1><p>郵箱: {user.email}</p></div>
);export default Profile;

8.?中間件與插件

8.1.?中間件

在請求處理鏈中執行的函數,用于權限校驗、日志記錄等。

// middleware/auth.js
export function authMiddleware(req, res, next) {if (!req.user) {res.redirect('/login');} else {next();}
}

8.2.?插件

擴展 Next.js 或 React 的功能,如集成第三方庫,通常通過 npm 包或自定義代碼實現。

示例:集成 Axios

1. 安裝Axios

npm install axios

2. 封裝成插件

// lib/axios.js
import axios from 'axios';const instance = axios.create({baseURL: 'https://api.example.com',
});export default instance;

3.?在頁面中使用

// pages/posts.js
import React from 'react';
import axios from '../lib/axios';export async function getServerSideProps() {const res = await axios.get('/posts');const posts = res.data;return {props: {posts,},};
}const Posts = ({ posts }) => (<div><h1>博客文章</h1><ul>{posts.map(post => (<li key={post.id}>{post.title}</li>))}</ul></div>
);export default Posts;

9.?動態路由與嵌套路由

9.1.?動態路由參數

使用方括號定義動態參數,可通過 context.params 獲取參數值。

// pages/blog/[id].js
import React from 'react';export async function getServerSideProps(context) {const { id } = context.params;const res = await fetch(`https://api.example.com/posts/${id}`);const post = await res.json();return {props: {post,},};
}const Post = ({ post }) => (<div><h1>{post.title}</h1><p>{post.content}</p></div>
);export default Post;

9.2.?嵌套路由

使用目錄結構定義嵌套路由,在父組件中使用 <Outlet />(React Router)或嵌套頁面結構。

// pages/dashboard/index.js
import React from 'react';
import Link from 'next/link';
import { Outlet } from 'react-router-dom';const Dashboard = () => (<div><h1>儀表盤</h1><ul><li><Link href="/dashboard/settings">設置</Link></li><li><Link href="/dashboard/profile">個人資料</Link></li></ul><Outlet /> {/* 這里使用 Outlet 來渲染子頁面 */}</div>
);export default Dashboard;

pages/dashboard/settings.js:

// pages/dashboard/settings.js
import React from 'react';const Settings = () => (<div><h1>設置</h1><p>這里是設置頁面。</p></div>
);export default Settings;

pages/dashboard/profile.js:

// pages/dashboard/profile.js
import React from 'react';const Profile = () => (<div><h1>個人資料</h1><p>這里是個人資料頁面。</p></div>
);export default Profile;

10.?SEO 優化

10.1.?Meta 標簽管理

使用 next/head 組件定義頁面的標題和 meta 信息。

// pages/about.js
import React from 'react';
import Head from 'next/head';const About = () => (<div><Head><title>關于我們 - My Website</title><meta name="description" content="這是關于我們的頁面。" /></Head><h1>關于我們</h1><p>這里是關于我們的內容。</p></div>
);export default About;

10.2.?站點地圖

使用 next-sitemap 等插件自動生成站點地圖。

安裝:

npm install next-sitemap

配置:

// next-sitemap.js
module.exports = {siteUrl: 'https://www.example.com',generateRobotsTxt: true,
};

生成:

npx next-sitemap

11.?部署 Next.js 應用

11.1.?服務器渲染模式部署

需要一個 Node.js 服務器運行 Next.js 應用。

1.?構建應用

npm run build

2.?啟動應用

npm start

11.2.??靜態站點生成

生成靜態的 HTML 文件,部署到靜態服務器,適用于內容不經常變化的站點。

1.?生成靜態文件

npm run export

2.?部署 out/ 目錄內容到靜態服務器

11.3.?云平臺部署

  • Vercel: Next.js 官方推薦平臺,支持無縫部署。

  • Netlify、AWS、Heroku 等也支持部署 Next.js 應用。

12.?性能優化

  • 代碼拆分:利用 Next.js 的自動代碼拆分,按需加載組件。

  • 緩存:使用 CDN 緩存靜態資源,優化 API 請求。

  • 圖片優化:使用 Next.js 內置的 next/image 組件,自動優化圖片。

  • 懶加載:延遲加載非關鍵資源,提升首屏加載速度。

示例:使用 next/image

import Image from 'next/image';const Home = () => (<div><h1>首頁</h1><Image src="/logo.png" alt="Logo" width={200} height={200} /></div>
);export default Home;

13.?Next 原理淺析

13.1.?Next 工作流程

13.1.1.?編譯階段

1. 路由生成:掃描 pages/ 目錄,生成路由配置。

2. 模板編譯:將 React 組件模板編譯為渲染函數。

3. 打包:使用 webpack 打包生成服務器端和客戶端的代碼。

13.1.2.?運行階段

1. 服務器渲染:接收請求,執行對應的頁面組件,生成 HTML。

2. 客戶端激活:在瀏覽器端,React 接管頁面,激活組件的交互功能。

13.2.?服務端渲染流程詳解

1. 請求接收:服務器接收到客戶端請求。

2. 路由匹配:根據請求的 URL,匹配對應的頁面組件。

3. 數據預取:

  • 執行頁面組件的 getServerSideProps 或 getStaticProps 方法,獲取數據。

  • 數據獲取可以是異步的,如調用 API 接口。

4. 渲染頁面:

  • 將組件渲染為 HTML 字符串。

  • 包含初始的狀態數據。

5. 響應返回:將生成的 HTML 返回給客戶端。

13.3.?客戶端激活過程(Hydration)

1. 客戶端接收到 HTML 后,加載 JavaScript 文件。

2. React 接管頁面,將靜態的 HTML 轉換為可交互的 DOM。

3. 對比服務器端和客戶端的虛擬 DOM,確保一致性。

13.4.?熱重載與開發體驗

1. 熱重載(HMR):

  • 在開發環境中,修改代碼后,頁面自動更新,無需手動刷新。

  • 提高開發效率。

2. 錯誤處理:

  • 友好的錯誤提示,便于調試和定位問題。

  • 顯示詳細的錯誤堆棧信息。

14.?參考資料

  • nextjs: Next.js by Vercel - The React Framework

  • waku, 輕量級 react ssr: Waku, the minimal React framework

  • rsc: Server Components – React

  • renderToString: renderToString – React

  • next compiler: Architecture: Next.js Compiler | Next.js

  • prerender: https://github.com/prerender/prerender

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91203.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91203.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91203.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Deforum Stable Diffusion,輕松實現AI視頻生成自由!

摘要&#xff1a; 你是否曾被那些充滿想象力、畫面流暢的AI視頻所震撼&#xff1f;你是否也想親手創造出屬于自己的AI動畫&#xff1f;本文將為你提供一份“保姆級”的詳盡教程&#xff0c;從環境配置到參數調整&#xff0c;一步步帶你復現強大的Deforum Stable Diffusion模型&…

不同環境安裝配置redis

不同環境安裝配置redis windows 環境安裝redis redis所有下載地址 windows版本redis下載&#xff08;GitHub&#xff09;&#xff1a; https://github.com/tporadowski/redis/releases &#xff08;推薦使用&#xff09;https://github.com/MicrosoftArchive/redis/releases]官…

匯川Easy系列PLC算法系列(回溯法ST語言實現)

Easy系列PLC 3次多項式軌跡插補算法 Easy系列PLC 3次多項式軌跡插補算法(完整ST代碼)_plc連續插補算法-CSDN博客文章瀏覽閱讀122次。INbExecuteBOOLOFFOFF不保持1INrStartPosREAL0.0000000.000000不保持起始位置unit2INrEndPosREAL0.0000000.000000不保持結束位置unit3INrStar…

Linux C:構造數據類型

目錄 一、結構體&#xff08;struct&#xff09; 1.1類型定義 1.2 結構體變量定義 1.3 結構體元素初始化 1.4 結構體成員訪問 1.5 結構體的存儲&#xff08;內存對齊&#xff09; 1.6 結構體傳參 本文主要記錄了C語言中構造數據類型部分的內容&#xff0c;今天暫時只寫了…

Python:self

在Python面向對象編程中&#xff0c;self是一個指向類實例自身的引用參數&#xff1a;?1. 本質與作用??身份標識?&#xff1a;self是類實例化后對象的"身份證"&#xff0c;代表當前實例本身&#xff0c;用于區分不同實例的屬性和方法??自動傳遞?&#xff1a;調…

【SpringMVC】SpringMVC的概念、創建及相關配置

什么是SpringMVC 概述 中文翻譯版&#xff1a;Servlet 棧的 Web 應用 Spring MVC是Spring Framework的一部分&#xff0c;是基于Java實現MVC的輕量級Web框架。 查看官方文檔&#xff1a;https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/web.h…

淺談存儲過程

問題引入 面試的時候有時候會問到知不知道存儲過程&#xff0c;用沒用過&#xff1f; 是什么 存儲過程&#xff08;Stored Procedure&#xff09;是在大型數據庫系統中&#xff0c;一組為了完成特定功能的SQL 語句集&#xff0c;它存儲在數據庫中&#xff0c;一次編譯后永久…

maven optional 功能詳解

前言 最近參與了一個項目,使用maven管理依賴.項目拆分了很多模塊.然后交個多個團隊各自開發.最后在一個項目骨架中,把各自的模塊引入進來,一起啟動. 后來隨著項目的深入.引入的jar包變多.發現 jar包太多,編譯太慢, 打包之后的war包非常大.這種情況就可以使用optional來優化什么…

Python基礎--Day04--流程控制語句

流程控制語句是計算機編程中用于控制程序執行流程的語句。它們允許根據條件來控制代碼的執行順序和邏輯&#xff0c;從而使程序能夠根據不同的情況做出不同的決策。流程控制實現了更復雜和靈活的編程邏輯。 順序語句 順序語句是按照編寫的順序依次執行程序中的代碼。代碼會按照…

【同濟大學】雙速率自動駕駛架構LeAD:端到端+LLM,CARLA實測93%路線完成率,性能SOTA!

近年來&#xff0c;隨著端到端的技術快速發展將自動駕駛帶到了一個新高度&#xff0c;并且取得了非常亮眼的成績。由于感知限制和極端長尾場景下訓練數據覆蓋不足&#xff0c;模型在高密度復雜交通場景下和不規則交通情況下的處理能力不足&#xff0c;導致在開放道路上大規模部…

github與git新手教程(快速訪問github)

0 序言 作為一個開發者&#xff0c;你必須知道github和git是什么&#xff0c;怎么使用。 github是一個存儲代碼等資源的遠程倉庫&#xff0c;一個大型項目往往需要很多人共同協作開發&#xff0c;而大家如何協同開發的進度與分工等要求需要有一個統一開放保存代碼的平臺。git…

Windows環境下安裝Python和PyCharm

可以只安裝PyCharm嗎&#xff1f;不可以&#xff01;&#xff01;&#xff01; 開發Python應用程序需要同時安裝Python和PyCharm。Python是一種編程語言&#xff0c;PyCharm是一個專門為Python開發設計的集成開發環境&#xff0c;提供豐富的功能以簡化編碼過程。 一、前期準備…

Qt 嵌入式系統資源管理

在嵌入式系統中&#xff0c;資源&#xff08;CPU、內存、存儲、網絡等&#xff09;通常非常有限&#xff0c;因此高效的資源管理對 Qt 應用的穩定性和性能至關重要。本文從內存優化、CPU 調度、存儲管理到電源控制&#xff0c;全面解析 Qt 嵌入式系統資源管理的關鍵技術。 一、…

小杰數據結構(one day)——心若安,便是晴天;心若亂,便是陰天。

1.數據結構計算機存儲、組織數據的方式&#xff1b;有特定關系的數據元素集合&#xff1b;研究數據的邏輯結構、物理結構&#xff08;真實存在&#xff09;和對應的算法&#xff1b;新結構仍保持原結構類型&#xff1b;選擇更高的運行或存儲效率的數據結構。邏輯結構——面向問…

力扣面試150(44/150)

7.30 155. 最小棧 設計一個支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常數時間內檢索到最小元素的棧。 實現 MinStack 類: MinStack() 初始化堆棧對象。void push(int val) 將元素val推入堆棧。void pop() 刪除堆棧頂部的元素。int top() 獲取堆棧頂…

Linux實戰:從零搭建基于LNMP+NFS+DNS的WordPress博客系統

前言 在數字化時代&#xff0c;擁有一個個人博客是技術愛好者展示成果、分享經驗的重要方式。本文將帶您從零開始&#xff0c;在Linux環境下通過兩臺服務器協作&#xff0c;搭建一個功能完整的WordPress博客系統。我們將整合LNMP架構、NFS文件共享和DNS域名解析服務&#xff0c…

Apache Ignite 的對等類加載(Peer Class Loading, P2P Class Loading)機制

這段內容是關于 Apache Ignite 的“對等類加載”&#xff08;Peer Class Loading, P2P Class Loading&#xff09;機制的詳細說明。這是 Ignite 為了簡化開發而設計的一個非常強大的功能&#xff0c;但同時也存在一些安全和性能上的考量。 下面我將用通俗易懂的語言 結構化解…

預過濾環境光貼圖制作教程:第四階段 - Lambert 無權重預過濾(Stage 3)

在完成高光反射的 GGX 預過濾后,我們還需要處理環境光的漫反射部分。本階段(Stage 3)將基于 Lambert 分布對環境貼圖進行無權重預過濾,生成用于漫反射計算的環境數據。與高光反射的方向性不同,漫反射是光線在粗糙表面的均勻散射,因此需要用更適合均勻分布的 Lambert 模型…

Spring與SpringBoot:從手動擋到自動擋的Java開發進化論

大家好&#xff01;我是程序員良辰&#xff0c;今天我們來聊聊Java開發界的兩位"重量級選手"&#xff1a;Spring 和 SpringBoot。它們之間的關系就像手動擋汽車和自動擋汽車——一個給你完全的控制權但操作復雜&#xff0c;一個讓你輕松上路但保留了切換手動模式的能…

1.4.Vue 的模板事件

Vue 的模板事件1. 最常見和推薦的做法。將復雜的邏輯封裝在 methods 中。<!-- ? 正確&#xff1a;調用 methods 中的方法 --> <button click"handleClick">點擊我</button>new Vue({methods: {handleClick(event) {// 這里可以寫任意語句if (this…