動態

詳情 返回 返回

Next.js 超實用進階技巧【持續更新】 - 動態 詳情

hello 大家好,我是 superZidan,這篇文章想跟大家聊聊 Next.js 進階技巧,如果大家遇到任何問題,歡迎 聯繫我 或者直接微信添加 superZidan41

🔥🔥🔥 前方高能,乾貨滿滿,建議點贊➕關注➕收藏;後續還會 持續更新更多技巧和案例

温馨提示:如果你還是個 Next.js 新手,建議先閲讀這篇 Next.js 最佳實踐,照着這篇文章先把代碼敲一遍

cover.png

Next.js 是一個強大的框架,用於構建服務端渲染的 React 應用程序。 它提供了許多開箱即用的功能,例如:自動代碼分割、靜態站點生成和服務端渲染。 但是,主流教程中並未提及一些高級 Next.js 技巧。 在本文中,我們將介紹其中一些技巧,這些技巧將使你的應用程序更上一層樓。

對第三方庫使用動態導入

Next.js 會自動對你的應用程序進行代碼分割,這意味着它僅加載當前頁面所需的代碼。 然而,這對於沒有考慮到代碼分割的第三方庫來説並不總是有效的

為了可以將第三方庫進行代碼分割,你可以使用動態導入。動態導入允許你按需加載模塊,這有助於減少應用程序的初始包大小。

例如,不要 像這樣導入第三方庫

import moment from 'moment';

你可以像這樣使用動態導入

const moment = dynamic(() => import('moment'));

這將按需加載 moment 庫,這有助於減少應用程序的初始包大小

把靜態資源發佈到 CDN

Next.js 會自動優化圖片和其他靜態資源,但把這些靜態資源發佈到快速可靠的內容分發網絡 (CDN) 仍然很重要。

你可以使用阿里雲,騰訊雲,Amazon,Cloudflare 等廠商提供的 CDN 服務。這有助於提高性能並減少服務器的負載。

要為靜態資源配置 CDN,可以在 next.config.js 文件中使用 assetPrefix 選項:

module.exports = { 
    ... 
    assetPrefix: 'https://yourcdn.com/',
    ... 
 };

這樣配置之後,會在你的靜態資源 URL 前面加上 CDN 的 URL

使用服務端緩存處理耗性能的數據操作

如果你的應用程序有十分損耗性能的數據操作,例如複雜的數據庫查詢或 API 請求,那麼在服務器端緩存結果來提高性能就非常重要。

Next.js 提供了內置的緩存 API,可用於在服務器端緩存數據。 緩存 API 是一個簡單的鍵值存儲,可用於存儲和檢索數據。

例如,你可以像這樣緩存數據庫查詢的結果:



import { cache } from 'next/cache'; 
async function getPosts() { 
    const cachedPosts = await cache.get('posts'); 
    if (cachedPosts) { return cachedPosts; } 
    const posts = await fetch('/api/posts'); 
    await cache.set('posts', posts); 
    return posts; 
 }

以上檢查數據庫查詢的結果是否已緩存,如果已經緩存了,則從緩存中返回數據。 否則,它從數據庫中獲取結果,然後緩存它們,最後返回它們。

通過在服務器端緩存耗性能的數據操作,你可以減少數據庫和 API 服務器的負載,並提高應用程序的性能。

注意:緩存敏感數據時要小心。 一個好的經驗法則是僅緩存公共數據(不要緩存需要身份鑑權的數據)

對動態網頁使用 ISR(增量靜態再生成)

Next.js 提供了一項名為增量靜態再生成 (ISR) 的強大功能,允許生成具有動態內容的靜態頁面。 這意味着可以創建快速且動態的頁面,而無需犧牲性能。

使用 ISR,你可以生成頁面的靜態版本,稍後使用新的數據更新該頁面。 舉個例子,你可以使用 ISR 生成包含初始內容的靜態博客文章頁面,後續如果有新的新評論或其他動態內容進入時動態更新該頁面。

要使用 ISR,需要在 getStaticProps 函數中定義 revalidate 選項。 此選項指定 Next.js 使用新數據重新生成頁面的頻率。

export async function getStaticProps() {
    const data = await fetch('https://example.com/api/data'); 
    const posts = await data.json(); 
    return { 
        props: { posts }, 
        revalidate: 60 // 每 60 秒重新生成頁面 
     } 
 }

在此示例中,頁面將每 60 秒使用來自 API 的新數據重新生成一次。 這意味着即使頁面是靜態的,你的用户也將始終看到最新的內容。

通過使用 ISR,可以創建性能絕佳的快速動態頁面。 此功能對於經常添加新內容的「內容密集型」網站(例如博客或新聞網站)特別有用。

使用自定義服務來支持 WebSockets

Next.js 提供了適合大多數需求場景的內置服務器。 但是,如果有 WebSocket 或自定義身份驗證等更加高階的需求,則可能需要使用自定義服務。

可以通過在項目根目錄創建 server.js 文件來將自定義服務與 Next.js 結合使用。 該文件導出一個創建 HTTP 服務並處理請求的函數。

例如,以下是創建處理 WebSocket 的自定義服務的方法:

const http = require('http'); 
const WebSocket = require('ws'); 
const next = require('next'); 
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev }); 
const handle = app.getRequestHandler(); 
const server = http.createServer((req, res) => { 
        // // 處理 HTTP 請求
        handle(req, res); 
}); 
 const wss = new WebSocket.Server({ server }); 
 wss.on('connection', (ws) => { 
        // 處理 websocket 建連 
 }); 
 server.listen(3000, () => { console.log('Ready on http://localhost:3000'); 
 });

這將創建一個 HTTP 服務器和一個監聽端口 3000 的 WebSocket 服務器

注意:使用自定義服務器會使站點放棄自動靜態優化,並從阻止你部署到 Vercel

總結

通過使用 ISR 等高級 Next.js 功能,可以創建快速、可擴展且針對性能進行優化的 Web 應用程序。 這些技巧可以幫助你將 Next.js 應用程序提升到一個新的水平,併為你的站點用户提供最佳用户體驗。

以上就是目前的全部內容,後續還會 持續更新更多技巧和案例 。 與往常一樣,如果你有任何疑問,請隨時與我聯繫或發表評論。 祝你愉快!

user avatar hard_heart_603dd717240e2 頭像 evenboy 頭像 huanjinliu 頭像 hu_qi 頭像 asmallwhitecat 頭像 tinygeeker 頭像 79px 頭像 zhuyunbo 頭像 huyouxueboshi 頭像 wqjiao 頭像 ddup365 頭像 laomao_5902e12974409 頭像
點贊 36 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.