文章摘要
作者Dominik在博客中分享了他对Next.js的挫败感,特别是在生产环境中缺乏默认日志记录功能的问题。他决定通过设置生产级日志来解决这一问题,选择了pino作为日志库,并尝试在中间件中实现日志记录。尽管任务看似简单,但实际操作中遇到了不少挑战。
文章总结
Next.js 的令人沮丧之处 - Dominik 的博客
在本文中,作者Dominik分享了他对Next.js框架的失望和挫败感,特别是在处理日志记录和中间件功能时遇到的种种问题。以下是文章的主要内容:
背景与动机
作者在为公司开发Next.js服务时,遇到了日志记录的问题。默认情况下,Next.js的日志记录仅在开发环境中启用,导致生产环境中无法追踪问题。因此,作者决定为生产环境配置日志记录,但这一过程并不顺利。中间件的局限性
作者首先尝试使用Next.js的中间件来实现日志记录。然而,他发现中间件的功能非常有限,只能传递四个参数,且无法链式调用多个中间件。这让他感到非常失望,尤其是考虑到Express等框架早在2010年代就已经提供了强大的中间件功能。日志记录的尝试与失败
作者选择了pino作为日志库,并尝试通过AsyncLocalStorage来实现日志记录。然而,由于Next.js的默认中间件运行在edge环境下,日志记录无法正常工作。即使切换到nodejs运行时,问题依然存在。此外,作者还发现,中间件和页面渲染不在同一个异步上下文中,导致日志记录无法传递。复杂的解决方案
最终,作者通过使用headers来传递请求ID,勉强实现了日志记录。然而,这一解决方案非常复杂,且需要在多个文件中拆分日志记录逻辑。作者对此感到非常不满,认为Next.js的设计过于局限,开发者被迫使用不优雅的解决方案。自定义服务器的尝试
作者尝试使用自定义服务器来绕过Next.js的限制,但依然遇到了问题。尽管使用了AsyncLocalStorage,日志记录依然无法正常工作。作者对此感到极度失望,认为Next.js的设计存在严重缺陷。与其他框架的对比
作者对比了SvelteKit的中间件设计,认为SvelteKit提供了更灵活和强大的功能,允许开发者传递自定义数据,并支持多个中间件的链式调用。相比之下,Next.js的设计显得非常局限和落后。GitHub 问题追踪的糟糕体验
作者还批评了Next.js在GitHub上的问题追踪系统,指出许多问题长时间得不到回应,甚至有些问题在多年后依然没有得到解决。作者本人提交的bug报告也石沉大海,导致他对Next.js的开发团队失去了信心。总结与反思
作者表示,他已经对Next.js失去了兴趣,认为该框架存在太多问题和边缘情况。尽管他可能无法立即推动公司放弃Next.js,但他会在未来的项目中表达自己的意见,并考虑使用其他框架。
总的来说,本文通过作者的实际开发经历,揭示了Next.js在日志记录和中间件功能上的诸多不足,表达了对该框架的强烈不满。
评论总结
评论内容总结:
支持Next.js的观点: 1. Next.js是前端框架中的佼佼者:pjmlp认为,与Java和.NET的Web框架相比,Next.js是唯一合理的前端框架,Angular次之。他自1998年起从事Web开发,经验丰富。 - 引用:"Next.js is the only sane frontend framework followed by Angular." - 引用:"Saying this as someone doing Web related development since 1998, glory days of Perl and CGIs."
- Next.js带来开发乐趣:Jnr表示,Next.js和React让他重新找回了开发Web前端的乐趣,尽管框架有一些问题,但总体上令人满意。
- 引用:"Nextjs and React gave me back the joy to develop web frontend again."
- 引用:"There are a lot of gotchas and considerations with Nextjs, but it is a framework and it is not unexpected."
批评Next.js的观点: 1. 复杂性和错误信息不清晰:j-krieger指出,Next.js的错误信息难以理解,且经常遇到奇怪的水合问题,导致开发体验不佳。 - 引用:"Next.js, the frontier JavaScript framework embraced by React is the only experience where half the time, I have no idea what it’s error messages are trying to tell me." - 引用:"I can’t even count the hours I spent with weird hydration issues."
过度抽象和边缘情况处理差:thiago_fm认为Next.js试图抽象不可抽象的东西,处理边缘情况非常差,导致代码难以维护。
- 引用:"They’ve tried to abstract things that aren’t really abstractable."
- 引用:"It handles edge-cases extremely poorly, and when you have those scenarios, you either need to find a workaround or give up."
Next.js的复杂性不适合所有场景:solatic指出,Next.js的复杂性只有在特定场景下才有意义,如全球B2C产品或愿意支付Vercel高额托管费用的情况下。
- 引用:"Next.js has layers upon layers upon layers due to the interplay between the browser, middleware, edge vs. node, SSR."
- 引用:"It really only fits under the following set of circumstances: You sell a B2C product to a potentially global audience, so edge semantics actually help with latency issues."
其他观点: 1. Next.js的营销策略:UK-Al05认为Next.js的营销策略是为了将用户锁定在Vercel托管服务上。 - 引用:"Next.js is marketing to get you locked into vercel hosting."
- React和Next.js的复杂性:Vinnl指出,React和Next.js的方向是提供更细粒度的代码运行控制,但这大大增加了心智模型的复杂性。
- 引用:"The direction React and Next.js have been moving is to give you very granular control over where your code runs, and when."
- 引用:"Which is kinda neat, but also massively complicates the mental model."
总结:Next.js在提供强大功能和开发乐趣的同时,也因其复杂性、错误信息不清晰和边缘情况处理差而受到批评。其营销策略和锁定Vercel托管的特性也引发了一些争议。