”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 实用指南 - 迁移到 Next.js App Router

实用指南 - 迁移到 Next.js App Router

发布于2024-11-06
浏览:656

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]删除
最新教程 更多>
  • 如何使用PHP将斑点(图像)正确插入MySQL?
    如何使用PHP将斑点(图像)正确插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call ...
    编程 发布于2025-07-14
  • Java字符串非空且非null的有效检查方法
    Java字符串非空且非null的有效检查方法
    检查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。isement(Isement() trim whitespace whitesp...
    编程 发布于2025-07-14
  • 如何高效地在一个事务中插入数据到多个MySQL表?
    如何高效地在一个事务中插入数据到多个MySQL表?
    mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
    编程 发布于2025-07-14
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-07-14
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-07-14
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-07-14
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将其...
    编程 发布于2025-07-14
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-07-14
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-07-14
  • 如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    编程 发布于2025-07-14
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-07-14
  • 在JavaScript中如何并发运行异步操作并正确处理错误?
    在JavaScript中如何并发运行异步操作并正确处理错误?
    同意操作execution 在执行asynchronous操作时,相关的代码段落会遇到一个问题,当执行asynchronous操作:此实现在启动下一个操作之前依次等待每个操作的完成。要启用并发执行,需要进行修改的方法。 第一个解决方案试图通过获得每个操作的承诺来解决此问题,然后单独等待它们: co...
    编程 发布于2025-07-14
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-07-14
  • 如何在Chrome中居中选择框文本?
    如何在Chrome中居中选择框文本?
    选择框的文本对齐:局部chrome-inly-ly-ly-lyly solument 您可能希望将文本中心集中在选择框中,以获取优化的原因或提高可访问性。但是,在CSS中的选择元素中手动添加一个文本 - 对属性可能无法正常工作。初始尝试 state)</option> < op...
    编程 发布于2025-07-14
  • Go语言垃圾回收如何处理切片内存?
    Go语言垃圾回收如何处理切片内存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片时,了解垃圾收集行为至关重要,以避免潜在的内存泄...
    编程 发布于2025-07-14

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3