」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 實用指南 - 遷移到 Next.js App Router

實用指南 - 遷移到 Next.js App Router

發佈於2024-11-06
瀏覽:904

A practical Guide - Migrating to Next.js App Router

隨著 Next.js App Router 的發布,許多開發者都渴望遷移他們現有的專案。在這篇文章中,我將分享我將專案遷移到 Next.js App Router 的經驗,包括主要挑戰、變更以及如何使流程更加順利。

這是一種增量方法,您可以同時使用頁面路由器和應用程式路由器。

為什麼要遷移到 Next.js App Router?

App Router 帶來了幾個優點:

  • 改進的路由:更清晰的基於檔案系統的路由。
  • 伺服器端渲染 (SSR) 增強功能:更有效處理伺服器端資料。
  • 元處理:簡化的 SEO 管理。
  • 改進的性能:針對各種組件的內建最佳化。

透過遷移,您可以讓您的應用程式面向未來,以利用最新的 Next.js 功能。

遷移到 App Router 的步驟

  • 更新依賴關係

第一步是確保您的 Next.js 和相關依賴項是最新的。執行以下命令安裝最新版本的 Next.js 和 React:

npm install next@latest react@latest react-dom@latest
npm install -D eslint-config-next@latest
  • 建置應用程式資料夾

App Router 依賴新的應用程式目錄來管理路由、元資料和佈局。以下是如何建造它:

應用程式資料夾:將頁面移至應用程式資料夾。現在,每個路由都有自己的專用資料夾,其中包含 page.tsx 檔案。

佈局:新增layout.tsx 檔案來定義應用程式特定部分的佈局。這對於處理導覽列或頁腳等共用元件特別有用。

  • 路由器更改

最重要的變化之一是將 next/router 替換為 next/navigation,用於路由和導航功能。

將所有 next/router 匯入替換為 next/navigation。
在適當的情況下使用新的等效項更新 useRouter 等函數,例如 usePathname、useSearchParams 和 useRouter()。

  • 重構伺服器端程式碼

getServerSideProps 和 getStaticProps 在 App Router 中已棄用。
使用非同步伺服器元件或伺服器操作在伺服器端頁面中取得資料。

export async function getData() {
  const res = await fetch('https://getData.com/data');
  return res.json();
}
  • 處理客戶端元件

客戶端元件:
任何使用 React hooks、瀏覽器 API 或使用者互動的元件都必須標記為「使用客戶端」。這告訴 Next.js 在客戶端渲染它們。

伺服器元件:
任何不需要與瀏覽器互動的元件都可以保留為伺服器元件。這些更加高效,因為它們避免了向客戶端發送不必要的 JavaScript。

  • 處理外部庫

如果您正在使用 React Query、AntDesign 或 Framer 等外部函式庫。您需要更新它們並根據需要進行更改。無法在此部落格中包含所有變更。儘管他們的文檔中提到了更改。

遷移過程中常見的挑戰

  • 路由器事件處理:

隨著從 next/router 到 next/navigation 的更改,處理路由器事件可能需要不同的方法。
確保相應地更新任何路由器事件偵聽器或掛鉤。

  • 佈局轉換問題:

遷移具有複雜佈局的頁面(尤其是具有動畫的頁面)時,您可能會注意到佈局發生變化。新增佔位符或在伺服器端本身保持正確對齊以防止佈局變更。

  • 圖片與連結元件更新:

App Router 引入了對圖片和連結組件的變更。
使用codemods自動更新組件。
對於影像組件,刪除已棄用的屬性,例如responsive.

  • 動畫

動畫相關元件,如framer、swiper和lootie檔案需要保存在客戶端。

結論

遷移到 Next.js App Router 帶來了挑戰,但也帶來了效能、可擴展性和靈活性方面的顯著改進。透過將遷移分解為可管理的部分(應用程式層級、頁面層級和功能更新),我能夠系統地處理每個變更。

如果您對自己的遷移有任何疑問或提示,請告訴我!

版本聲明 本文轉載於:https://dev.to/shagun/a-practical-guide-migrating-to-nextjs-app-router-3j5i?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何使用Python理解有效地創建字典?
    如何使用Python理解有效地創建字典?
    在python中,詞典綜合提供了一種生成新詞典的簡潔方法。儘管它們與列表綜合相似,但存在一些顯著差異。 與問題所暗示的不同,您無法為鑰匙創建字典理解。您必須明確指定鍵和值。 For example:d = {n: n**2 for n in range(5)}This creates a dict...
    程式設計 發佈於2025-07-13
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-07-13
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,將常數列添加到Spark DataFrame,該列具有適用於所有行的任意值的Spark DataFrame,可以通過多種方式實現。使用文字值(SPARK 1.3)在嘗試提供直接值時,用於此問題時,旨在為此目的的column方法可能會導致錯誤。 df.withCo...
    程式設計 發佈於2025-07-13
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    答案: 在大多數現代編譯器中,while(1)和(1)和(;;)之間沒有性能差異。編譯器: perl: 1 輸入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    程式設計 發佈於2025-07-13
  • 如何使用node-mysql在單個查詢中執行多個SQL語句?
    如何使用node-mysql在單個查詢中執行多個SQL語句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    程式設計 發佈於2025-07-13
  • eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    稱量()和ast.literal_eval()中的Python Security 在使用用戶輸入時,必須優先確保安全性。強大的python功能eval()通常是作為潛在解決方案而出現的,但擔心其潛在風險。本文深入研究了eval()和ast.literal_eval()之間的差異,突出顯示其安全性含義...
    程式設計 發佈於2025-07-13
  • 左連接為何在右表WHERE子句過濾時像內連接?
    左連接為何在右表WHERE子句過濾時像內連接?
    左JOIN CONUNDRUM:WITCHING小時在數據庫Wizard的領域中變成內在的加入很有趣,當將c.foobar條件放置在上面的Where子句中時,據說左聯接似乎會轉換為內部連接。僅當滿足A.Foo和C.Foobar標準時,才會返回結果。 為什麼要變形?關鍵在於其中的子句。當左聯接的右側...
    程式設計 發佈於2025-07-13
  • Java中如何使用觀察者模式實現自定義事件?
    Java中如何使用觀察者模式實現自定義事件?
    在Java 中創建自定義事件的自定義事件在許多編程場景中都是無關緊要的,使組件能夠基於特定的觸發器相互通信。本文旨在解決以下內容:問題語句我們如何在Java中實現自定義事件以促進基於特定事件的對象之間的交互,定義了管理訂閱者的類界面。 以下代碼片段演示瞭如何使用觀察者模式創建自定義事件: args...
    程式設計 發佈於2025-07-13
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    程式設計 發佈於2025-07-13
  • 如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求和假用戶代理繞過網站塊?
    如何使用Python的請求模擬瀏覽器行為,以及偽造的用戶代理提供了一個用戶 - 代理標頭一個有效方法是提供有效的用戶式header,以提供有效的用戶 - 設置,該標題可以通過browser和Acterner Systems the equestersystermery和操作系統。通過模仿像Chro...
    程式設計 發佈於2025-07-13
  • 為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    使用php dateTime修改月份:發現預期的行為在使用PHP的DateTime類時,添加或減去幾個月可能並不總是會產生預期的結果。正如文檔所警告的那樣,“當心”這些操作的“不像看起來那樣直觀。 ; $ date->修改('1個月'); //前進1個月 echo $ date->...
    程式設計 發佈於2025-07-13
  • 如何同步迭代並從PHP中的兩個等級陣列打印值?
    如何同步迭代並從PHP中的兩個等級陣列打印值?
    同步的迭代和打印值來自相同大小的兩個數組使用兩個數組相等大小的selectbox時,一個包含country代碼的數組,另一個包含鄉村代碼,另一個包含其相應名稱的數組,可能會因不當提供了exply for for for the uncore for the forsion for for ytry...
    程式設計 發佈於2025-07-13
  • 如何在Chrome中居中選擇框文本?
    如何在Chrome中居中選擇框文本?
    選擇框的文本對齊:局部chrome-inly-ly-ly-lyly solument 您可能希望將文本中心集中在選擇框中,以獲取優化的原因或提高可訪問性。但是,在CSS中的選擇元素中手動添加一個文本 - 對屬性可能無法正常工作。 初始嘗試 state)</option> < o...
    程式設計 發佈於2025-07-13
  • 編譯器報錯“usr/bin/ld: cannot find -l”解決方法
    編譯器報錯“usr/bin/ld: cannot find -l”解決方法
    錯誤:“ usr/bin/ld:找不到-l “ 此錯誤表明鏈接器在鏈接您的可執行文件時無法找到指定的庫。為了解決此問題,我們將深入研究如何指定庫路徑並將鏈接引導到正確位置的詳細信息。 添加庫搜索路徑的一個可能的原因是,此錯誤是您的makefile中缺少庫搜索路徑。要解決它,您可以在鏈接器命令中添...
    程式設計 發佈於2025-07-13

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3