首页 > 其他分享 >如何评价 Next.js?

如何评价 Next.js?

时间:2024-04-19 16:59:04浏览次数:23  
标签:请求 js react query 评价 SSR Next

作者:你不知道我是谁
链接:https://www.zhihu.com/question/52365623/answer/2814907079
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

16年的问题了,在6年后的平安夜刷到了。

Next.js,是第二个让我由心觉得好用,觉得「我艹,可以啊」的一个框架。第一个是在2015年的时候,接触到的Angular 1.x.

我们公司,在去年11月,开始对前端重构优化,将公司的主要页面由 egg.js + requireJS + jQuery 切换至 Next.js,由我来owner,最多时投入9个前端人力,日常4个,立项时排期3个月,实际历时5个月。

有兴趣的朋友可以看下效果: www.tianyancha.com/company/33934422

先说下最初的选型过程,是怎么一步步走进Next.js这个坑的心路历程:

  • 首先是Vue React,这个没啥好选的,组内成员对这两个框架的熟悉程度都差不多,但是我相对更熟悉React,所以就没得选咯
  • web server,由于之前用的egg.js,大家对这一套比较熟悉,所以选择了egg的升级版,midway。(web server这一层不符合对前端架构的整体规划,后续也给干掉了)
  • SSR,由于要支持SEO,所以就要选择一个支持SSR的方案。 为了减少出错,和提升开发效率,我们希望SSR是渐进增强的,实际开发人员在开发时,完全不需要考虑SSR的存在,最后再有一到两个人力来集中管理SSR的配置。由此,我们有两个方案:
    • 增加一个pre-render层,该pre-render层就类似是puppeteer,NG判断是SEO的请求,就转到pre-render层,pre-render再请求实际的前端服务。为此我们主要尝试了两个框架做这个事情:https://github.com/rendora/rendorahttps://github.com/scrapinghub/splash
    • 常规的SSR。还是前面说的,期望的效果是,开发人员在一开始开发时,完全不需要考虑SSR,直到最后再由专人去配置SSR功能,SSR类似是一个装饰器或者说是插件的形式存在。为此,找到一个省心的方案是使用react-query。具体它的实现方案就不细说了,简单来说就是通过react-query对请求的缓存和预请求逻辑,来实现页面实际有价值的SSR。并且react-query在介绍SSR时,还特别讲了搭配Next.js使用。
  • 最后就是前端框架,
    • 一个就是create-react-app整一个,eject出webpack的配置改巴改巴
    • 另一个就是Next.js,没踩坑之前,看文档看到的肯定都是好的,其中有几个开箱即用的功能,对我们来说,的确很有诱惑:1. 路由功能,替换react-router 2. 基于getServerSideProps的SSR功能。 3. 集成好的打包配置和打包优化
  • 状态管理,在当时组内相对比较熟悉的有 redux-trunk、redux-saga、dva。 但是我个人是比较反感redux这一套,而且在梳理和规划了我们的业务逻辑之后,我觉得把数据分散在每个小的业务组件中是可行的,需要共享的数据并不多。所以我们就完全是有需要共享数据,就手动全局包一个Context,最后实际发现,的确也没包几个Context。

前面提到一个重要的思想,就是SSR一定是渐进增强的,从而一开始开工可以先不考虑这个,先抓紧快速开发。

同时为了不让build的问题占用我们的时间,以及为了预选的两种SSR方案以后都能支持,所以选择使用 react-query + Next.js

最终,我们开工时确认的基础选型为: React + midway + Next.js + 无全局的状态管理库 + react-query。

蹲坑把腿蹲麻了,有人看了后续在写吧。。。


气短,胸闷,不敢睡觉。。。一个人住,担心万一睡过去了都没人知道,唉。。。

再扯两句,

用Next时有一个感觉不爽的点是,它要求除_app.js以外,引入的样式都必须走css module,但是我们希望能用全局样式,好在我们还搞了自己的组件库,可以绕过这一限制。

另外还有两种方式绕过这个限制,一个是配置css moudle对类名的哈希算法,对于指定格式的类名直接原样返回。另一个是在css moudle里使用:global语法。这两种方式我感觉都太骚了,所以没有用。

在next.js中,通过使用react-query缓存请求来做SSR时,需要注意一点就是,可能会导致页面上有个_NEXT_DATA元素里的内容特别的大。这个元素里就是server端发起的所有请求的返回值。没有找到好的方式避免这个问题,我们目前是在代码里对所有请求又包了一层预处理,或者也可以理解成增加了一层 后端接口返回值 和 前端数据model 的转换,从而尽可能的减少_NEXT_DATA元素的体积。

另一个问题,就是自动化测试,这里最麻烦的是元素定位。最初配置css moudle后的类名是纯哈希,然后给元素增加额外的data-属性用于元素定位。但是由于测试脚本是qa组来写,配合起来很费劲很低效。所以后来索性也不加data-属性了,qa需要哪个就f12自己找类名,然后css moudle生成的类名也改回了默认的「文件_类名_哈希」的格式,让他们的代码看起来更语义化一点。

还有一个和build相关的问题。next.js的spa逻辑判断,依赖一个.json文件,这个文件的路径包含一个buidId,可通过next.config里的generateBuildId()修改这个buildId的生成逻辑。

会导致一个问题:假设我们有20台负载机器,有一个功能我为了灰度50%,所以只发布10台机器,此时就有10台新代码机器,和10台旧代码机器。假设此时一个页面的请求,经过负载均衡落在了新代码的机器上,页面返回,在浏览器加载后再次请求用于spa的.json文件,该json文件的请求落在了旧代码的机器上,因为buildId的不同,在旧代码机器上找不到这个json文件,于是返回404,从而导致该用户的spa功能失效。解决办法就是每次发版都全量发布,灰度逻辑完全由代码控制。

感觉新冠不仅影响心脏,还间接影响了脑子表达的表达能力,不知道啰嗦的这些有没有表达清楚,写到哪算哪吧。。

祝2023我身体健康。

标签:请求,js,react,query,评价,SSR,Next
From: https://www.cnblogs.com/sexintercourse/p/18146356

相关文章

  • 网页幻灯片演示框架:Reveal.js
    网页幻灯片演示框架:Reveal.js谢小飞​北京京东方能源科技有限公司前端开发工程师已关注 63人赞同了该文章在生活和工作中,我们经常需要用到幻灯片进行演示或者汇报工作等,传统的幻灯片在排版、代码、动效和多媒体等方面操作起来需要一定的基础;......
  • HarmonyOS NEXT应用开发之深色模式适配
    介绍本示例介绍在开发应用以适应深色模式时,对于深色和浅色模式的适配方案,采取了多种策略如下:固定属性适配:对于部分组件的颜色属性,如背景色或字体颜色,若保持不变,可直接设定固定色值或引用固定的资源文件。双资源目录适配:在resources目录下新增dark子目录,用于存放深色模式下的特......
  • HarmonyOS NEXT应用开发之异常处理案例
    介绍本示例介绍了通过应用事件打点hiAppEvent获取上一次应用异常信息的方法,主要分为应用崩溃、应用卡死以及系统查杀三种。效果图预览使用说明:点击构建应用崩溃事件,3s之后应用退出,然后打开应用进入应用异常页面,隔1min左右后,显示上次异常退出信息。点击构建应用卡死事件,需手......
  • 2024-04-19 前端常见面试题汇总(js篇)
    以下是前端面试中关于JavaScript的一些常见问题及其答案,共包含超过50个问题:1.解释一下JavaScript中的变量提升(Hoisting)。变量提升是指在JavaScript中,变量和函数的声明会被提升到其所在作用域的最顶部。但需要注意,只有声明会被提升,赋值操作不会。2.解释一下JavaScript中的闭包(C......
  • 数仓的两种轻量级数据交换格式:json与jsonb
    本文分享自华为云社区《GaussDB(DWS)——探究JSON,JSONB》,作者:yd_283975606。1.前言适用版本:【8.1.1(及以上)】JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,常用于将数据从服务器发送到Web应用程序。它采用人类易读和机器易解析的文本格式,基于键值对的集合,用于......
  • jspdf 打印成pdf后模糊不清晰
    constpdfDPI=300;importhtml2canvasfrom'html2canvas'//设置截图的分辨率(单位为dpi)constdpi=300;html2canvas(document.querySelector('#app'),{dpi:dpi,//设置截图的分辨率scale:dpi/96,//设置截图缩放比例,以适应pdf的dpi}).then(canvas=>......
  • React 简单登录平台Demo(1):Next.js配置
    目录前言体验Next.js中文文档路径问题创建项目启动报错测试TailWindCSS热重载如何添加路由第三方库引入tailwindcss配置相关链接布局新建布局布局也是嵌套影响的根节点layout配置路由跳转Link跳转Hook跳转简单的登录页面前言我之前的那个项目写到后面,发现还不如直接用Next.js呢......
  • HarmonyOS NEXT应用开发之多层嵌套类对象监听
    介绍本示例介绍使用@Observed装饰器和@ObjectLink装饰器来实现多层嵌套类对象属性变化的监听。效果图预览使用说明加载完成后显示商品列表,点击刷新按钮可以刷新商品图片和价格。实现思路创建FistGoodsModel类,类对象是用@Observed修饰的类SecondGoodsItemList,SecondGoods......
  • 如何实现数据库数据到Abp vnext实体对象的同步?以及代码生成工具
    在采用了EFCore的CodeFirst方式下,如果你在数据库中直接添加了新表或存储过程,你需要在项目代码中手动反向工程这些数据库的更改,以保持CodeFirst的代码与数据库同步。这种情况可以通过如下两个步骤来实现:从现有数据库创建模型:使用EntityFrameworkCore的Scaffold-DbContext......
  • 30 天精通 RxJS (25):Subject 总结
    Subject其实在RxJS中最常被误解的一部份,因为Subject可以让你用命令式的方式虽送值到一个observable的串流中。很多人会直接把这个特性拿来用在不知道如何建立Observable的状况,比如我们在30天精通RxJS(23)中提到的可以用在ReactJS的Event中,来建立event的observab......