
最近 React 发布了全新的文档,文档中已经不再将 create-react-app (CRA) 作为搭建 React 应用的推荐方式,而是推荐了很多其他方式,包括 Vite、Next.js、Remix、Gatsby 等,下面就分别看看这些方式都有哪些优缺点,2023年该如何做出选择!
Vite 很显然是 create-react-app (CRA) 的继任者,因为它与 CRA 没有太大的区别。与 create-react-app(使用 Webpack)相比,它要快得多,因为它在底层使用了esbuild。

和 create-react-app (CRA) 一样,Vite 也更倾向于使用客户端路由和渲染来创建单页面应用(SPA)。然而,由于服务端渲染(SSR)越来越受到重视,因此在 Vite 中它作为一个可选功能提供。

如果已经在使用 create-react-app(CRA),那么迁移到 Vite 是非常简单的。Vite 的 vite.config.js 文件以及特定功能的文件(例如 tsconfig)只需进行少量配置,就可以使用 TypeScript、ESLint 和 SSR 等可选功能了。

在 Vite 中允许开发者在没有框架的情况下使用 React。开发者可以自由选择用于路由、数据获取、状态管理和测试的 React 库。与所有 React 框架相比,它不会强制要求在项目级别上使用任何特定的 React 功能、库或配置。
Vite 鼓励初学者在没有框架的干扰下学习 React 及其基础知识。当使用 Vite 时,一个初学者可以专注于学习 React 和它的核心特性,而不需要受到框架的限制。相比之下,在使用框架的环境中学习 React 时,React 几乎处于被动状态,必须要遵循框架的意图来进行学习。
React + Vite 的优势:
React + Vite 的缺点:
为什么 Vite 可能不会成为 React 文档中的默认工具:
Next.js 作为框架是最成熟的,因此当 React 开发人员想要在框架环境中使用 React 时,这可能是最好的选择。它包含许多内置的功能(例如基于文件的路由)。如果 Next.js不适合你,可以看看去年开源的 Remix 框架;它与 Next.js 的不同之处在于它专注于 Web 标准。

Next.js 更注重服务端渲染(SSR)作为渲染技术。然而,它也可以与静态网站生成(SSG)和客户端渲染(CSR)一起使用。此外还有一些更先进的渲染技术可用,如增量静态再生(ISR)和 React 服务器组件(RSC)。另外,可以在 Next.js 应用中混合使用这些渲染技术。例如,一个营销页面可以使用 SSG,而注册/登录功能使用 SSR。

然而,使用这么多强大的功能需要付出代价:不同的渲染技术会增加工程开销,框架不断地开发新的渲染技术,因此最终会改变其优先顺序,而且并不是所有开发者都能跟得上这个速度。尽管 Next.js 在过去没有引入破坏性变化,做得非常好,但在推动 JavaScript/React 渲染到后端的前沿工作中,总会有新的标准/配置。
总之,虽然 React 本身(例如使用Vite)相对稳定,但在 Next.js 生态系统中肯定会看到变化,因为它是将 React 引入服务端领域的开路先锋。
Next.js 的优点:
Next.js 的缺点:
为什么 Next.js 可能是 React 文档中的默认选择:
Astro 允许开发人员创建以内容为中心的网站。由于其 island 架构和选择性水合作用,它默认为每个网站提供了快速性能。因此 SEO 相关的网站可以从使用 Astro 中受益。

从实现的角度来看,Astro更倾向于多页面应用(MPA)的概念,而不是单页面应用(SPA)。Astro 是一个与框架(此处为 React)无关的解决方案。因此,可以使用 Astro 的内置组件语法或选择的框架(例如 React)。该框架仅用于服务端渲染,不会暴露给客户端。只有当决定为客户端添加一个交互式 island 时,它才会将所有必需的 JavaScript 代码发送到浏览器。

在以内容为中心的网站方面,Astro 被视为 Gatsby 的竞争对手。在过去的几年里,Gatsby 在与 Next 的竞争中失败了。在这场竞争中,可能过于关注与 Next 的功能平衡(例如 SSR),因此较少关注真正重要的开发者体验和以内容为中心的网站的性能方面。这给了Astro一个机会成为可行的替代选择。
总之,即使是 Next(具有SSR / SSG / ISR)或 Gatsby 也适用于面向内容的网站,Astro 作为竞争对手虽然相对较新,但似乎更适合具有面向内容的网站的更具体要求(性能,注重内容生产(例如MDX))。
相比之下,支持使用 Next 的唯一事实是:它混合了渲染技术,因此可以在同一个应用中实现性能优化的营销页面和隐藏在登录后面的实际应用。但根据 Astro 的基准测试结果,它的性能仍然较低(不考虑 RSC,因为还不稳定),因此可以在现代 Monorepo 设置中混合使用 Next 和 Astro,以便同时拥有 Web 应用和网站。
React + Astro 的优点:
React + Astro 的缺点:
为什么它可能不是 React 文档中的默认设置:
除了上述方式之外,还有一些其他创建 React 应用的方式:
使用 React 之外的其他库来启动 SSR 项目:
参考:https://www.robinwieruch.de/react-starter/。
[1]Parcel: https://parceljs.org/。
[2]create-t3-app: https://create.t3.gg/。
[3]React Native: https://reactnative.dev/。
[4]Expo: https://expo.dev/。
[5]Tauri: https://tauri.app/。
[6]Electron: https://www.electronjs.org/。
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/