Next.js 實戰筆記 1.0:架構重構與 App Router 核心機制詳解

Next.js 實戰筆記 1.0:架構重構與 App Router 核心機制詳解

上一次寫 Next 相關的東西都是 3 年前的事情了,這 3 年里 Next 也經歷了 2-3 次的大版本變化。當時寫的時候 Next 是 12 還是 13 的,現在已經是 15 了,從 build 到實現都有一些重大變化,所以就想著重新過一下關鍵點

這部分內容沒啥特別好的歸納,基本上學/寫到哪里記到哪里

更多內容可以在官方文檔里面看到,我覺得一個比較有用的部分是這個:**Project structure and organization,**里面講了 Next 推薦的文件夾管理方式,以及路由、metadata、SEO 之類的關鍵信息

構造

早起的版本中 Next 還是使用 webpack 做 bundle 的,從 Next 12 之后慢慢引入了 Rust 編寫的 SWC(Speedy Web Compiler),到現在的 15 版本,已經開始引入 turbopack 去漸漸代替 webpack

找到的資料說,dev 模式自動開啟 turbo,不過我看了下,好像還是要手動開啟:

? yarn dev --turbo
yarn run v1.22.22
$ next dev --turbo▲ Next.js 14.0.3 (turbo)- Local:        http://localhost:3000? Ready in 2.4s? yarn dev
yarn run v1.22.22
$ next dev▲ Next.js 14.0.3- Local:        http://localhost:3000? Ready in 2.7s

可以看到有 --turbo flag 的才會開啟 turbopack……

目前體感來說,使用 turbopack 會快不少,大概提速 30%-50%,不過我的練手項目都比較小,差別就在這幾秒或者是幾百毫秒的差別,不足以大到讓我有明顯的體感上的差別

? 看了一下,大概是 next 的 config 文件里面沒有配置,所以默認 dev 沒有開啟 turbo

app router vs page router

新版的項目結構也有了一些的變化,比如說之前的 directory 叫 page,現在改成了 app 。Next 還有一個選項是把所有的代碼包在 src 下面,我沒選那個,這里提一句

這種轉變,實際上是 Next 內部中實現的轉變,即從 page router 轉成了 app router,現在推薦使用的是 app router,因為 Next 基于 app router 實現了很多新的功能,同樣也是未來的轉變方向

二者核心對比:

功能Page Router (pages/)App Router (app/)
路由機制文件系統自動生成路由文件系統自動生成嵌套路由
支持 Layout? 僅支持 _app.js 全局包裝? 支持嵌套 layout.tsx
支持 Server Components? 僅客戶端組件(可用 SSR)? 默認是 Server Component
支持 Streaming? 不支持? 支持分塊傳輸 / loading UI
Data fetchinggetServerSideProps, getStaticProps, getInitialPropsfetch() in Server Component
Middleware 支持??
動態路由? [id].js? [id]/page.tsx
API Routes? pages/api/*? 仍使用 pages/api/*
文件結構限制只有一個頁面文件允許多個文件組合構成頁面(如 loading.tsx, error.tsx
狀態成熟度? 成熟穩定🚧 仍在改進(尤其是緩存行為)

server component

這應該是 page router 和 app router 最大的區別了,舊版的 page router 中,默認的還是 client side rendering,在 build 的階段將數據寫入 HTML 中。新版的 app router 則是 app 文件夾下默認所有的組件都在服務端生成,其中的一些狀態和日志不會在 client 端顯示,只會在服務端顯示,如下面這個 log:

page.js should render as page, and is server component, which will be rendered at server

前面的 server 標記了是 server 端的內容,在正式打包后就會被去除

另一個需要注意的是,server component 不能用 hooks,這是 client component 專用的。如果要使用 hooks 的話,需要在文件頭標注 use client;,這樣這個組件下所有的內容都會在 client 端生成,否則就會報錯:

如果想要利用好 Next 的 server side rendering,那么就盡可能的抽象組件,盡可能的在末端使用 use client

路由

基礎的路由比較簡單,新加一個文件夾,并且創建對應的 page.js 文件即可:

動態路由

根據官方文檔顯示,顯示的 directory 的名稱應該如下:

[folder]Dynamic route segment
[...folder]Catch-all route segment
[[...folder]]Optional catch-all route segment

并且在對應的文件夾下創建 page.js 文件即可

路由組與私有路由

根據官方文檔,實現如下:

(folder)Group routes without affecting routing
_folderOpt folder and all child segments out of routing

layout

這個也是 Next 提升了很多的地方,這是目前 template 中的 layout:

import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";const geistSans = Geist({variable: "--font-geist-sans",subsets: ["latin"],
});const geistMono = Geist_Mono({variable: "--font-geist-mono",subsets: ["latin"],
});export const metadata: Metadata = {title: "Create Next App",description: "Generated by create next app",
};export default function RootLayout({children,
}: Readonly<{children: React.ReactNode,
}>) {return (<html lang="en"><bodyclassName={`${geistSans.variable} ${geistMono.variable} antialiased`}>{children}</body></html>);
}

其中, metadata 就是當前頁面綁定的關鍵詞,這也是個保留詞。使用當前 layout 的所有頁面,都會共享這里面的布局和 metadata

除此之外,Next 做的改進就是,每個文件夾下面都可以有它獨立的 layout,這是不影響外層布局的。如果有這個需求的話,這個用途/設定挺好的

Image

Next15 也對其做了不少的改進,之前主要用的是 lazy loading 的特性,這次發現了一個 priority,即與 lazy loading 相反的特性,很適合加在 logo/banner 等地方

加載數據

現在 Next 所有的組件默認都是 server component 了,因此也不太需要使用 useEffect 去渲染數據,而是可以直接創建新的 async 組件,如:

const Meals = async () => {const meals = await getMeals();return <MealsGrid meals={meals} />;
};

加載狀態

這里我主要新創建了一個 loading.js 文件,然后搭配了 Suspense 使用:

import React from "react";
import classes from "./loading.module.css";const MealsLoadingPage = () => {return <div className={classes.loading}>Fetching meals...</div>;
};export default MealsLoadingPage;
const MealsPage = () => {return (<><header className={classes.header}><h1>Delicious meals, created{" "}<span className={classes.highlight}>by you</span></h1><p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Magnamvoluptatibus fuga voluptas temporibus porro consequatur totam nihilquae omnis eos blanditiis asperiores, repudiandae itaque officiaoptio? Repudiandae recusandae sit sequi?</p><p className={classes.cta}><Link href={"/meals/share"}>Share Your Favorite Recipe</Link></p></header><main className={classes.main}><Suspense fallback={<MealsLoadingPage />}><Meals /></Suspense></main></>);
};

效果如下:

如果不使用 Suspense 的話,那么整個頁面都會被 loading.js 所接管

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

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

相關文章

Pillow 安裝使用教程

一、Pillow 簡介 Pillow 是 Python 圖像處理庫 PIL&#xff08;Python Imaging Library&#xff09;的友好分支&#xff0c;是圖像處理的事實標準。它支持打開、編輯、轉換、保存多種圖像格式&#xff0c;常用于圖像批量處理、驗證碼識別、縮略圖生成等應用場景。 二、安裝 Pi…

SQL Server從入門到項目實踐(超值版)讀書筆記 20

9.4 數據的嵌套查詢所謂嵌套查詢&#xff0c;就是在一個查詢語句中&#xff0c;嵌套進另一個查詢語句&#xff0c;即&#xff0c;查詢語句中可以使用另一個查詢語句中得到的查詢結果&#xff0c;子查詢可以基于一張表或者多張表。子查詢中常用的操作符有ANY、SOME、ALL、IN、EX…

【MySQL\Oracle\PostgreSQL】遷移到openGauss數據出現的問題解決方案

【MySQL\Oracle\PostgreSQL】遷移到openGauss數據出現的問題解決方案 問題1&#xff1a;序列值不自動刷新問題 下面SQL只針對單庫操作以及每個序列只綁定一張表的情況 -- 自動生成的序列&#xff0c;設置序列值 with sequences as (select *from (select table_schema,table_…

【Maven】Maven命令大全手冊:28個核心指令使用場景

Maven命令大全手冊&#xff1a;28個核心指令使用場景 Maven命令大全手冊&#xff1a;28個核心指令深度解析一、構建生命周期核心命令1. mvn clean2. mvn compile3. mvn test4. mvn package5. mvn install6. mvn deploy二、依賴管理命令7. mvn dependency:tree8. mvn dependency…

大語言模型(LLM)按架構分類

大語言模型&#xff08;LLM&#xff09;按架構分類的深度解析 1. 僅編碼器架構&#xff08;Encoder-Only&#xff09; 原理 雙向注意力機制&#xff1a;通過Transformer編碼器同時捕捉上下文所有位置的依賴關系# 偽代碼示例&#xff1a;BERT的MLM任務 masked_input "Th…

MySQL(120)如何進行數據脫敏?

數據脫敏&#xff08;Data Masking&#xff09;是指通過某種方式對敏感數據進行變形&#xff0c;使其在使用過程中無法識別原始數據&#xff0c;從而保護數據隱私。數據脫敏通常應用在開發、測試和數據分析等場景中。下面我們詳細介紹如何在Java應用程序中進行數據脫敏&#xf…

使用 Dockerfile 構建基于 .NET9 的跨平臺基礎鏡像

官方基礎鏡像準備 微軟官方 dotnet sdk 基礎鏡像&#xff1a; docker pull mcr.microsoft.com/dotnet/sdk:9.0拉取 ubuntu 鏡像&#xff1a; docker pull ubuntu:24.04更多資源請參考&#xff1a; dotnet sdk images&#xff0c;https://mcr.microsoft.com/en-us/artifact/mar/…

C++ : 線程庫

C : 線程庫一、線程thread1.1 thread類1.1.1 thread對象構造函數1.1.2 thread類的成員函數1.1.3 線程函數的參數問題1.2 this_thread 命名空間域1.2.1 chrono二、mutex互斥量庫2.1 mutex的四種類型2.1.1 mutex 互斥鎖2.2.2 timed_mutex 時間鎖2.2.3 recursive_muetx 遞歸鎖2.2.…

idea的使用小技巧,個人向

idea的使用小技巧&#xff0c;個人向 一、前言二、過程1、顯示內存的使用情況2、去掉xml文件中的黃色背景3、顯示所有打開文件4、顯示工具欄到菜單下面5、使用JDK8 一、前言 每次重裝idea都需要重新設置一下&#xff0c;這里做個記錄。 這些技巧只是個人感覺的好用 演示用的…

debian及衍生發行版apt包管理常見操作

好的&#xff0c;這是 Debian 及其衍生版&#xff08;如 Ubuntu&#xff09;使用的 apt 包管理器的常用命令速查表。 一點說明&#xff1a;apt 是新一代的命令行工具&#xff0c;整合了 apt-get 和 apt-cache 的常用功能&#xff0c;并提供了更友好的交互體驗。本表主要使用現…

vue調用函數

好的&#xff0c;我們來講解如何在 Vue 模板中調用函數。您提供的代碼是一個非常棒的、很實用的例子。 在 Vue 模板中&#xff0c;你可以在兩個主要地方調用函數&#xff1a; 文本插值中&#xff1a;像 {{ formatDate(date) }} 這樣&#xff0c;函數的返回值會作為文本被渲染到…

前端常用構建工具介紹及對比

打包構建工具是現代軟件開發中必不可少的,它們幫助開發者自動化構建、打包、部署等流程,提升開發效率。不過,不同時期構建工具略有差異。 每個構建工具都有其擅長的領域,我們需要知道其優勢,才能在我們實際開發中選擇合適的構建工具進行構建處理。 1. Gulp Gulp 是一個…

Web后端開發-SpringBootWeb入門、Http協議、Tomcat

文章目錄Web后端開發簡介SpringBootWeb入門HTTP協議HTTP-概述HTTP-請求協議HTTP-響應協議HTTP-協議解析Web服務器-Tomcat簡介基本使用SpringBootWeb入門程序解析Web后端開發簡介 SpringBootWeb入門 package com.wuxuan.javaweb_wushuang.controller;import org.springframework…

物聯網通信技術全景剖析:從LoRa到5G的深度對比與選型指南

物聯網通信技術全景剖析&#xff1a;從LoRa到5G的深度對比與選型指南在萬物互聯時代&#xff0c;選擇合適的通信技術如同為設備構建“神經網絡”。本文將深入解析七大主流物聯網通信技術&#xff0c;助您在技術選型中精準決策。一、低功耗廣域網&#xff08;LPWAN&#xff09;技…

俄羅斯方塊AI深度解析:從算法原理到實現細節

俄羅斯方塊AI深度解析:從算法原理到實現細節 前言 俄羅斯方塊,這個誕生于1984年的經典游戲,至今仍然是人工智能研究領域的熱門課題。當簡單的幾何形狀在網格中不斷下落時,看似簡單的規則背后卻隱藏著復雜的策略決策問題。本文將深入剖析一個基于Python實現的俄羅斯方塊AI…

Spring Boot 框架創建一個簡單的后端接口,并介紹如何使用 Apifox 連接該接口

目錄 一、配置 二、使用 IntelliJ IDEA 創建 Spring Boot 項目 1.打開 IntelliJ IDEA&#xff0c;選擇 File > New > Project 2.在左側面板選擇 Spring Initializr&#xff0c;項目名稱設置為HelloWorldAPI 3.點擊 Create 完成項目創建 三、創建控制器類 四、運行項…

CICD[導航]、docker+gitlab+harbor+jenkins從安裝到部署

一、安裝 CICD[軟件安裝]&#xff1a;docker安裝gitlab-CSDN博客 CICD[軟件安裝]&#xff1a;ubuntu安裝jenkins-CSDN博客 CICD[軟件安裝]&#xff1a;ubuntu安裝私有鏡像倉庫-Harbor-CSDN博客 CICD[軟件安裝]&#xff1a;ubuntu24安裝Docker-CSDN博客 二、鏡像執行 CICD[…

深度學習圖像分類數據集—蘑菇識別分類

該數據集為圖像分類數據集&#xff0c;適用于ResNet、VGG等卷積神經網絡&#xff0c;SENet、CBAM等注意力機制相關算法&#xff0c;Vision Transformer等Transformer相關算法。 數據集信息介紹&#xff1a;蘑菇識別分類&#xff1a;[Agaricus, Amanita, Boletus, Cortinarius, …

iOS 多線程導致接口亂序?抓包還原 + 請求調度優化實戰

在一次性能優化過程中&#xff0c;我們將 iOS App 內多處請求改為并行處理&#xff0c;以提高頁面加載速度。但上線后卻收到部分用戶反饋&#xff1a;進入頁面后數據加載錯亂&#xff0c;有時展示前一次頁面內容&#xff0c;有時同一個接口請求重復返回不同內容。 日志僅顯示正…

PDFBox 在 Linux 報 “No glyph for U+535A (博)” —— 一次子集化踩坑與完整排查清單

PDFBox 在 Linux 報 “No glyph for U535A (博)” —— 一次子集化踩坑與完整排查清單關鍵詞&#xff1a;PDFBox、PDType0Font、子集嵌入&#xff08;subset embedding&#xff09;、SimHei、思源黑體、字體回退1. 背景業務場景 后端使用 Apache PDFBox 填充含 AcroForm 的中文…