大家好,我是CUGGZ。近日,网友t3dotgg建议将React官方文档中的使用CreateReactApp新建项目的建议替换为使用Vite新建项目的建议。这一建议引起了网友的热议,大多数网友表示赞同:新的React官方文档即将发布(目前显示已经完成99%),Beta文档仍然推荐使用CreateReactApp创建新项目.此外,还提供了两种选择:Vite和Parcel。查看CreateReactApp的Githubrepository,可以发现已经5个月没有更新了,累积了1500+个issues。1月31日,React团队核心成员DanAbramov回应了这个建议,解释了React团队成员对这个建议的权衡,并提供了一些选择。下面就让我们一起来看看详情吧(可以跳到最后看结论)!CreateReactApp的演变当CreateReactApp于2016年发布时,该工具的环境是分散的。如果你想将React添加到现有的应用程序中,你需要添加一个标签和应用程序包。当加载一个空的HTML文件时,浏览器等待React代码和完整的应用程序包下载。这在低带宽连接上可能需要一段时间,并且用户在此期间在屏幕上看不到任何内容。然后,加载应用程序代码。此时用户在屏幕上看到了一些东西——但通常仍然需要加载数据。所以代码发送请求加载数据,用户需要等待它返回。最后加载数据,组件重新渲染数据,用户看到最终结果。这是非常低效的,尽管如果你只在客户端运行React很难做得更好。将此与服务器端框架(如Rails)进行对比:服务器将立即开始数据获取,然后生成包含所有数据的页面。在这种情况下,用户看到的是包含所有信息的HTML文件,而不是等待脚本加载的空白文件。HTML是网络的基石——那么为什么创建一个React应用程序会产生一个空的HTML文件?为什么不利用网络最基本的功能——在所有交互式代码加载之前快速查看内容的能力?为什么要等到所有客户端代码都已加载后再开始加载数据?CreateReactApp只解决了问题的一方面,它提供了良好的开发体验,但它没有强加足够的结构来帮助我们利用网络的力量来获得良好的用户体验。开发者可以尝试自己解决这些问题,但这违背了CreateReactApp的初衷。每个真正高效的React设置都是自定义的、不同的,并且超出了CreateReactApp的范围。这些UX问题并不是CreateReactApp独有的。它们甚至不特定于React。例如,从Preact、Vue、Lit和Svelte的Vite主页模板创建的应用程序都存在同样的问题。这些问题是没有静态站点生成(SSG)或服务器端呈现(SSR)的纯客户端应用程序所固有的。React框架的兴起有些人可能不喜欢完全使用React进行构建。例如,HTML页面可以在服务器端生成,也可以在构建过程中使用不同的工具(如Jekyll或Astro)生成。这解决了空HTML文件的问题,但是两种渲染技术必须混合使用。随着时间的推移,你想要添加的交互性越多,这种技术分裂就会越明显。这种碎片化不仅会损害开发人员的体验——用户体验也会受到影响。使用真正以HTML为中心且未充分利用React的工具,每个页面导航都会变成完整的页面重新加载,清除所有客户端状态。如今,许多用户希望应用程序内的导航顺畅,而不是90年代风格的整页重新加载。此外,许多开发人员更喜欢使用单一渲染模型而不是混合两种不同的模型来构建他们的应用程序。开发人员希望在React中构建整个应用程序。如果您正在使用React构建整个应用程序,那么能够使用SSG/SSR非常重要。CreateReactApp中缺乏对它们的支持。除此之外,经过多年的生态创新,React的许多其他问题现在都有成熟的解决方案。例如,网络瀑布和捆绑包大小。即使应用程序不像面向内容的网站那样受益于SSG或SSR,它也会遭受网络瀑布的影响。如果在挂载时获取数据,第一次数据获取甚至不会开始,直到所有代码加载完毕并呈现组件。这是一个瀑布:如果应用程序知道如何在代码仍在加载时开始获取数据,则可以并行完成。在导航中,如果父子组件都需要获取一些内容,会产生更糟糕的瀑布。当我们谈论React性能时,我们无法回避瀑布是许多应用程序的性能瓶颈这一事实。要解决这些瀑布,您需要将数据获取与路由集成,这是CreateReactApp无法实现的。我们的应用程序代码随着每个新功能和附加依赖项的添加而不断增长。如果频繁部署,应用程序每次使用时加载速度都会变得非常慢,因为它总是需要加载所有代码。有几种方法可以解决这个问题;一些代码可以移动到服务器端或在构建期间运行(如果工具允许的话)。理想情况下也按路由拆分代码。但是,如果您尝试手动进行代码拆分,通常会获得更差的性能。解决这个问题需要把数据抓取和路由打包结合起来,这是CreateReactApp做不到的。React本身只是一个库,它没有规定如何使用路由或数据获取,CreateReactApp也没有规定。不幸的是,这意味着单靠React和最初设计的CreateReactApp都无法解决这些问题。服务器端渲染与静态生成、数据获取、打包和路由相关联。当CreateReactApp发布时,React还很新,如何让这些功能独立工作还有很多需要弄清楚的地方,更不用说如何将它们完美地结合在一起了。时代在进步,现在越来越难推荐不具备这些功能的解决方案。即使您不立即使用它们,它们也应该在您需要时可用,并且您不必迁移到不同的模板并重建所有代码来利用它们。同样,并非所有数据获取或代码拆分都需要基于路由。但这是一个很好的默认值,应该适用于大多数React应用程序。虽然可以自己集成所有这些功能,但很难做好。正如CreateReactApp本身集成了几个与编译相关的功能一样,Next.js、Gatsby和Remix等工具更进一步——将编译与渲染、路由和数据获取集成在一起。这种编译、渲染、路由和数据获取工具被称为“框架”(或者,如果你更喜欢称React为框架,你可以称它们为“元框架”)。这些框架提供了更好的用户体验。作为一种架构的React我们喜欢React的灵活性,您可以使用React构建单个按钮,也可以使用它构建整个应用程序。您可以使用它在一个有20年历史的Perl站点中构建仪表板,或者您可以使用React构建一个混合SSG/SSR电子商务站点。这种灵活性是必不可少的,并且用户喜欢它。React团队还希望为完全使用React构建的新应用程序提供更好的默认设置。如果默认建议的创建React应用程序的方法支持SSG和SSR、自动代码拆分、路由预加载、保留客户端UI状态的导航以及其他可实现出色用户体验的功能,那就太好了。至少,默认建议的创建React应用程序的方法不应该完全排除这些功能,因为现有的仅客户端架构没有实现它们。React有其挑战,帮助React框架提供出色用户体验的最佳方法是专注于底层React。React本身可以在渲染层做一些独特的事情,极大地提高框架在其他层的能力。比如像
