Next.js 中為什么 App Router 可能是未來良狈,但 Pages Router 仍然重要后添?

Next.js 作為一個強大的 React 框架,為開發(fā)者提供了兩種路由系統(tǒng):App Router 和 Pages Router薪丁。這兩種路由系統(tǒng)各有特色遇西,適用于不同的場景。本文將深入探討這兩種路由系統(tǒng)的區(qū)別严嗜、優(yōu)缺點和使用場景粱檀,幫助你做出最佳選擇。

App Router:新一代的路由革命

App Router 是 Next.js 13 引入的新路由系統(tǒng)漫玄,它使用 app 目錄來組織路由茄蚯,帶來了許多令人興奮的新特性。

優(yōu)點:

  1. React 服務(wù)器組件支持:這是一個游戲規(guī)則改變者睦优,允許在服務(wù)器端渲染復(fù)雜組件渗常,大大提升了性能。

  2. 靈活的布局系統(tǒng):通過嵌套布局汗盘,你可以更容易地創(chuàng)建復(fù)雜的頁面結(jié)構(gòu)皱碘。

  3. 內(nèi)置加載 UI 和錯誤處理:提供了更好的用戶體驗,無需額外配置隐孽。

  4. 性能優(yōu)化:得益于服務(wù)器組件和其他優(yōu)化癌椿,App Router 通常能提供更好的性能。

  5. 并行路由:允許在同一布局中同時渲染多個頁面菱阵。

缺點:

  1. 學(xué)習(xí)曲線較陡:對于習(xí)慣了傳統(tǒng) React 開發(fā)的人來說踢俄,可能需要一些時間來適應(yīng)。

  2. 第三方庫兼容性:一些老舊的庫可能不兼容新的服務(wù)器組件模式送粱。

  3. 仍在發(fā)展中:作為較新的技術(shù)褪贵,可能會有一些未知的問題或變化掂之。

Pages Router:經(jīng)典可靠的選擇

Pages Router 是 Next.js 的傳統(tǒng)路由系統(tǒng)抗俄,使用 pages 目錄來組織路由脆丁。它仍然是許多項目的首選,特別是對于較老的 Next.js 版本动雹。

優(yōu)點:

  1. 簡單易上手:對于初學(xué)者來說槽卫,學(xué)習(xí)曲線相對平緩。

  2. 文件系統(tǒng)路由直觀:路由結(jié)構(gòu)與文件結(jié)構(gòu)一一對應(yīng)胰蝠,易于理解和管理歼培。

  3. 豐富的社區(qū)資源:由于使用時間較長,有大量的教程茸塞、示例和第三方庫支持躲庄。

  4. 穩(wěn)定性高:經(jīng)過多年的使用和優(yōu)化,bug 較少钾虐,表現(xiàn)穩(wěn)定噪窘。

缺點:

  1. 不支持 React 服務(wù)器組件:無法利用這一新特性帶來的性能提升。

  2. 布局系統(tǒng)相對簡單:實現(xiàn)復(fù)雜布局可能需要更多的代碼和配置效扫。

  3. 數(shù)據(jù)獲取方法較為固定:主要依賴 getServerSidePropsgetStaticProps倔监,靈活性較低。

實戰(zhàn)對比:博客頁面實現(xiàn)

讓我們通過一個簡單的博客頁面來對比這兩種路由系統(tǒng)的實現(xiàn)方式:

Pages Router 實現(xiàn)

// pages/posts/[id].js
import { useRouter } from 'next/router';

export default function Post({ post }) {
    const router = useRouter();

    if (router.isFallback) {
        return <div>Loading...</div>;
    }

    return (
        <div>
            <h1>{post.title}</h1>
            <p>{post.content}</p>
        </div>
    );
}

export async function getStaticProps({ params }) {
    const res = await fetch(`https://api.example.com/posts/${params.id}`);
    const post = await res.json();
    return { props: { post } };
}

export async function getStaticPaths() {
    const res = await fetch('https://api.example.com/posts');
    const posts = await res.json();

    const paths = posts.map(post => ({
        params: { id: post.id.toString() },
    }));

    return { paths, fallback: true };
}

在這個例子中菌仁,我們使用 getStaticPropsgetStaticPaths 來實現(xiàn)靜態(tài)生成浩习。這是 Pages Router 的典型用法,適合內(nèi)容不經(jīng)常變化的博客文章济丘。

App Router 實現(xiàn)

// app/posts/[id]/page.js
import { notFound } from 'next/navigation';

async function getPost(id) {
    const res = await fetch(`https://api.example.com/posts/${id}`);
    if (!res.ok) return undefined;
    return res.json();
}

export default async function Post({ params }) {
    const post = await getPost(params.id);

    if (!post) {
        notFound();
    }

    return (
        <div>
            <h1>{post.title}</h1>
            <p>{post.content}</p>
        </div>
    );
}

App Router 的實現(xiàn)更加簡潔谱秽。這里我們直接在組件中進行異步數(shù)據(jù)獲取,這得益于 React 服務(wù)器組件的支持闪盔。同時弯院,我們使用 notFound 函數(shù)來處理文章不存在的情況,這是 App Router 提供的內(nèi)置錯誤處理機制之一泪掀。

如何選擇听绳?

選擇 App Router 還是 Pages Router,沒有絕對的對錯异赫。以下是一些建議:

  1. 項目規(guī)模和復(fù)雜度:對于大型椅挣、復(fù)雜的項目,App Router 的靈活性和性能優(yōu)勢可能更有吸引力塔拳。

  2. 團隊熟悉度:如果團隊對 Next.js 較為陌生鼠证,可能從 Pages Router 開始更容易上手。

  3. 性能需求:如果項目對性能有較高要求靠抑,App Router 的服務(wù)器組件可能是更好的選擇量九。

  4. 項目時間線:對于需要快速開發(fā)的項目,Pages Router 可能更適合,因為學(xué)習(xí)成本較低荠列。

  5. 未來展望:考慮到 Next.js 的發(fā)展方向类浪,長期來看,掌握 App Router 可能更有優(yōu)勢肌似。

個人經(jīng)驗分享

作為一個初使用 Next.js 的開發(fā)者费就,我最初對 App Router 也感到困惑。但是川队,當(dāng)我開始處理復(fù)雜的布局和需要優(yōu)化性能的場景時力细,App Router 的優(yōu)勢就顯現(xiàn)出來了。

例如固额,在一個需要頻繁更新的數(shù)據(jù)密集型應(yīng)用中眠蚂,App Router 的服務(wù)器組件讓我能夠在服務(wù)器端處理大部分數(shù)據(jù)邏輯,顯著減少了傳輸?shù)娇蛻舳说?JavaScript 數(shù)量斗躏,提升了應(yīng)用的整體性能河狐。

然而,對于一些簡單的項目或者時間緊迫的情況瑟捣,我仍然會選擇 Pages Router馋艺。它簡單直接,能讓我快速搭建原型并上線迈套。

結(jié)論

App Router 和 Pages Router 各有千秋捐祠,選擇哪一個取決于你的具體需求和場景。

我的建議是:不要害怕嘗試新事物桑李。即使你現(xiàn)在使用的是 Pages Router踱蛀,也值得花些時間了解 App Router。

畢竟贵白,技術(shù)在不斷進步率拒,保持學(xué)習(xí)才能不被淘汰。

記住禁荒,技術(shù)只是工具猬膨,真正重要的是解決問題和創(chuàng)造價值。選擇最適合你的工具呛伴,才能事半功倍勃痴。

結(jié)語

感謝閱讀,我們下次再見热康!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沛申,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子姐军,更是在濱河造成了極大的恐慌铁材,老刑警劉巖尖淘,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異著觉,居然都是意外死亡德澈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門固惯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缴守,你說我怎么就攤上這事葬毫。” “怎么了屡穗?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵贴捡,是天一觀的道長。 經(jīng)常有香客問我村砂,道長烂斋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任础废,我火速辦了婚禮汛骂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘评腺。我一直安慰自己帘瞭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布蒿讥。 她就那樣靜靜地躺著蝶念,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芋绸。 梳的紋絲不亂的頭發(fā)上媒殉,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音摔敛,去河邊找鬼廷蓉。 笑死,一個胖子當(dāng)著我的面吹牛马昙,可吹牛的內(nèi)容都是我干的苦酱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼给猾,長吁一口氣:“原來是場噩夢啊……” “哼疫萤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起敢伸,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扯饶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尾序,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡钓丰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了每币。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片携丁。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖兰怠,靈堂內(nèi)的尸體忽然破棺而出梦鉴,到底是詐尸還是另有隱情,我是刑警寧澤揭保,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布肥橙,位于F島的核電站,受9級特大地震影響秸侣,放射性物質(zhì)發(fā)生泄漏存筏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一味榛、第九天 我趴在偏房一處隱蔽的房頂上張望椭坚。 院中可真熱鬧,春花似錦搏色、人聲如沸藕溅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巾表。三九已至,卻和暖如春略吨,著一層夾襖步出監(jiān)牢的瞬間集币,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工翠忠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鞠苟,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓秽之,卻偏偏與公主長得像当娱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子考榨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 最近在探索學(xué)習(xí)前端工程化相關(guān)內(nèi)容河质,在如今前后端分離的架構(gòu)下冀惭,為了提升首屏渲染速度和 SEO 效果震叙,兜兜轉(zhuǎn)轉(zhuǎn),又回到...
    DYBOY閱讀 3,017評論 0 3
  • 最簡單的服務(wù)端渲染框架-Next.js 快速入門 Next.js是一個用于React應(yīng)用的極簡的服務(wù)端渲染框架散休∶铰ィ框...
    cabber閱讀 5,907評論 1 6
  • 介紹 Next.js 是一個輕量級的 React 服務(wù)端渲染應(yīng)用框架,是 Create-React-App 的升級...
    zhulichao閱讀 1,082評論 0 0
  • 最近在寫組件庫戚丸,關(guān)注到了 Next.js划址,項目中也正在使用,現(xiàn)在把它整理成文檔記錄一下限府,也希望可以幫助需要的同學(xué)夺颤。...
    arial_1df2閱讀 5,667評論 0 0
  • React服務(wù)端渲染-next.js 前端項目大方向上可以分為兩種模式:前臺渲染和服務(wù)端渲染。 前臺渲染-SPA應(yīng)...
    娜姐聊前端閱讀 1,292評論 0 1