首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SPA和React: 并不总是需要服务器端渲染

React文档建议选择支持服务器端渲染(SSR)的流行React框架之一,但是您是否真的需要SSR呢?...您可能已经注意到,React文档的“开始一个新的React项目”部分不再推荐使用CRA(Create React App)。...Create React App曾经是构建仅需要客户端路由和页面渲染的React应用的首选方法。然而,现在React文档建议选择支持服务器端渲染(SSR)的流行React驱动框架之一。...随着应用程序的增长和越来越多的JavaScript被添加,打包器需要做越来越多的工作。随着时间的推移,这个打包步骤开始花费更长的时间,真的会影响开发者的生产力。...最后的思考 所以,旧的被新的取代......但是React SPA的传统可以延续下去! 当然,在许多情况下,SPA并不是最合适的选择。

10210

SPA 和 React:你并不总是需要服务器端渲染

你可能已经注意到,React 文档的“Start a New React Project”部分不再推荐使用 CRA(Create React App)。...虽然有很多应用确实需要服务器端渲染,但是也有不少的应用并不需要服务器端渲染。如果选择 SSR React 框架,可能会引发新的问题而不是解决问题。 什么是 SPA?...随着应用程序的发展,会有越来越多的 JavaScript 添加进来,打包的工作量也会越来越大。随着时间的推移,打包步骤会变得越来越长,并可能真正影响开发人员的效率。...最后的想法 世界就这样,旧的不去,新的不来……但是,React SPA 的传统依然会持续! 当然,在很多情况下,SPA 并不是最合适的选择。...但是,在 SPA 或 SSR 的问题上,并不是“非此即彼”,而是 “兼而有之”。 声明:本文由 InfoQ 翻译,未经许可禁止转载。

28530
您找到你想要的搜索结果了吗?
是的
没有找到

问:React的setState为什么是异步的?

Dan 举了个栗子:假设 state 是同步更新的,那么下面的代码是可以预期工作的:console.log(this.state.value) // 0this.setState({ value: this.state.value...然而下面的代码却不能预期工作:console.log(this.props.value) // 0this.props.onIncrement();console.log(this.props.value...最后 Dan 总结说,React 模型更愿意保证内部的一致性和状态提升的安全性,而不总是追求代码的简洁性。...更多面试题解答参见 前端react面试题详细解答二、性能优化我们通常认为状态更新会按照既定顺序被应用,无论 state 是同步更新还是异步更新。然而事实并不一定如此。...三、更多的可能性Dan 最后说到,异步更新并不只关于性能优化,而是 React 组件模型能做什么的一个根本性转变(fundamental shift)。Dan 还是举了个栗子。

92410

问:React的setState为什么是异步的?_2023-03-01

Dan 举了个栗子: 假设 state 是同步更新的,那么下面的代码是可以预期工作的: console.log(this.state.value) // 0 this.setState({ value...然而下面的代码却不能预期工作: console.log(this.props.value) // 0 this.props.onIncrement(); console.log(this.props.value...最后 Dan 总结说,React 模型更愿意保证内部的一致性和状态提升的安全性,而不总是追求代码的简洁性。...然而事实并不一定如此。 React 会依据不同的调用源,给不同的 setState() 调用分配不同的优先级。调用源包括事件处理、网络请求、动画等。 Dan 又举了个栗子。...三、更多的可能性 Dan 最后说到,异步更新并不只关于性能优化,而是 React 组件模型能做什么的一个根本性转变(fundamental shift)。 Dan 还是举了个栗子。

78950

React中的setState为什么是异步的?

Dan 举了个栗子:假设 state 是同步更新的,那么下面的代码是可以预期工作的:console.log(this.state.value) // 0this.setState({ value: this.state.value...然而下面的代码却不能预期工作:console.log(this.props.value) // 0this.props.onIncrement();console.log(this.props.value...最后 Dan 总结说,React 模型更愿意保证内部的一致性和状态提升的安全性,而不总是追求代码的简洁性。...然而事实并不一定如此。React 会依据不同的调用源,给不同的 setState() 调用分配不同的优先级。调用源包括事件处理、网络请求、动画等。Dan 又举了个栗子。...参考 前端进阶面试题详细解答三、更多的可能性Dan 最后说到,异步更新并不只关于性能优化,而是 React 组件模型能做什么的一个根本性转变(fundamental shift)。

1.4K30

从 Prompt 来看微前端路由劫持原理

问题 前两天,业务方给我抛来一段代码,略去繁杂的逻辑,简化后的代码如下: // 代码示例 1 import { Prompt, Link } from 'react-router-dom'; export...">跳转到 detail ) } 在结合微前端框架 icestark 使用时,跳转到同一微应用的其他路由,会产生异常的效果:Prompt 弹窗了两次。..., [...rest]); urlChange(); } window.addEventListener('popstate', urlChange, false); } 但这样并不能解决全部问题...比如,当通过框架应用的 history.push 切换同一个微应用的不同路由时,微应用没有并不会渲染出正确的页面。 当然,问题总是有解的。...目前来说,这是一个预期的行为。 进一步分析 Prompt 的实现 似乎察觉到一些端倪了,接下来我们再深入 Prompt 的实现来看一下是什么原因导致了 Prompt 的两次触发。

1.3K30

从 Prompt 来看微前端路由劫持原理

问题 前两天,业务方给我抛来一段代码,略去繁杂的逻辑,简化后的代码如下: // 代码示例 1 import { Prompt, Link } from 'react-router-dom'; export...">跳转到 detail ) } 在结合微前端框架 icestark 使用时,跳转到同一微应用的其他路由,会产生异常的效果:Prompt 弹窗了两次。..., [...rest]); urlChange(); } window.addEventListener('popstate', urlChange, false); } 但这样并不能解决全部问题...比如,当通过框架应用的 history.push 切换同一个微应用的不同路由时,微应用没有并不会渲染出正确的页面。 当然,问题总是有解的。...目前来说,这是一个预期的行为。 进一步分析 Prompt 的实现 似乎察觉到一些端倪了,接下来我们再深入 Prompt 的实现来看一下是什么原因导致了 Prompt 的两次触发。

93310

React Router初学者入门指南(2023版)

使用React Router还有其他好处,比如创建复杂的导航、无缝的页面导航结构以及对动态URL的支持。 设置环境 要理解React Router的工作原理,最好的方法之一是构建一个简单的网站。...然而,这种方式并不理想,因为用户必须记住每个页面的确切URL才能访问。 a 标签通常用于解决这个问题,但它有一些限制。为了绕过这些限制,React Router使用 Link 组件。...然而,它不会预期呈现。 这是因为React Router不知道如何放置这些嵌套组件。...让我们看看它是如何工作的: import { useParams } from "react-router-dom"; function EraType() { const { type } = useParams...它的工作原理是:不使用React组件(JSX)的形式,而是使用JavaScript对象。

44531

React-Router 5.0 制作导航栏+页面参数传递

React中,常用的有两个包可以实现这个需求,那就是react-router和react-router-dom。本文主要针对react-router-dom进行说明。...和BrowserRouter HashRouter特点 在URL中采用#号来作为当前视图的地址,改变#号后的参数,页面并不会重载 BrowserRouter特点 和正常浏览网易url类似 页面并不会重载...to="/组件3" activeStyle={activeStyle}>组件3 以上代码已经实现了一个基本的导航 示例: ?...实现一个友好404页面 exact属性 严格匹配路由 防止 /one 匹配到 /one/two这个路由 因为路由的匹配顺序是至上而下 定义两个路由如果 /one/two 在前面的话 不使用严格匹配则不会返回预期结果...等属性 直接聚焦在这个组件上时style会应用给组件 Link一般作用于跳转到其他页面 实则就是A链接 React-Router-Dom 页面跳转参数传递 主要就是使用history对象进行页面跳转 API

3.4K10

前端组件设计原则

我在最近的工作中开始使用 Vue 进行开发,但是我在上一家公司积累了三年以上 React 开发经验。...如果你传给组件一个对象但是你并不能清楚的知道对象内部的属性值,所以找出实际需要的数据值是来自组件具体的属性值则是额外的工作。但如果 props 足够扁平化,那么起码会方便使用和维护。...) => {link.text}) <img src...我们总是希望能够进行充分的测试,比如对于一个组件,我们会期望它的正常工作不依赖特定的用例(上下文),并且所有 Javascript 逻辑都预期工作。...虽然你应该尽力维护良好的设计,但是不要为了包装 JIRA ticket 或一个取消请求而有损代码完整性,同时总是把理论置于现实世界结果之上的人也往往会让他们的工作受到影响。

1K20

前端组件设计原则

如果你传给组件一个对象但是你并不能清楚的知道对象内部的属性值,所以找出实际需要的数据值是来自组件具体的属性值则是额外的工作。但如果 props 足够扁平化,那么起码会方便使用和维护。...) => {link.text}) <img src...及时模块化 我们在实际进行组件抽离工作的时候,需要考虑到不要过度的组件化,诚然将大块代码变成松散耦合且可用的部分是很好的实践,但是并不是所有的页面结构(HTML 部分)都需要被抽离成组件,也不是所有的逻辑部分都需要被抽出到组件外部...我们总是希望能够进行充分的测试,比如对于一个组件,我们会期望它的正常工作不依赖特定的用例(上下文),并且所有 Javascript 逻辑都预期工作。...虽然你应该尽力维护良好的设计,但是不要为了包装 JIRA ticket 或一个取消请求而有损代码完整性,同时总是把理论置于现实世界结果之上的人也往往会让他们的工作受到影响。

1.7K20

【Web技术】314- 前端组件设计原则

如果你传给组件一个对象但是你并不能清楚的知道对象内部的属性值,所以找出实际需要的数据值是来自组件具体的属性值则是额外的工作。但如果 props 足够扁平化,那么起码会方便使用和维护。...) => {link.text}) <img src...及时模块化 我们在实际进行组件抽离工作的时候,需要考虑到不要过度的组件化,诚然将大块代码变成松散耦合且可用的部分是很好的实践,但是并不是所有的页面结构(HTML 部分)都需要被抽离成组件,也不是所有的逻辑部分都需要被抽出到组件外部...我们总是希望能够进行充分的测试,比如对于一个组件,我们会期望它的正常工作不依赖特定的用例(上下文),并且所有 Javascript 逻辑都预期工作。...虽然你应该尽力维护良好的设计,但是不要为了包装 JIRA ticket 或一个取消请求而有损代码完整性,同时总是把理论置于现实世界结果之上的人也往往会让他们的工作受到影响。

1.3K40

前端组件设计原则

如果你传给组件一个对象但是你并不能清楚的知道对象内部的属性值,所以找出实际需要的数据值是来自组件具体的属性值则是额外的工作。但如果 props 足够扁平化,那么起码会方便使用和维护。...) => {link.text}) <img src...及时模块化 我们在实际进行组件抽离工作的时候,需要考虑到不要过度的组件化,诚然将大块代码变成松散耦合且可用的部分是很好的实践,但是并不是所有的页面结构(HTML 部分)都需要被抽离成组件,也不是所有的逻辑部分都需要被抽出到组件外部...我们总是希望能够进行充分的测试,比如对于一个组件,我们会期望它的正常工作不依赖特定的用例(上下文),并且所有 Javascript 逻辑都预期工作。...虽然你应该尽力维护良好的设计,但是不要为了包装 JIRA ticket 或一个取消请求而有损代码完整性,同时总是把理论置于现实世界结果之上的人也往往会让他们的工作受到影响。

2.2K30

【译】你真的应该使用useMemo吗? 让我们一起来看看

>Benchmark with memo level: {level}); }; export default BenchmarkMemo; 然后,我们在 App.js 中添加这些组件,当下按钮时显示...当使用 useMemo 时,初始渲染会慢 19% ,这比预期的 5-10% 要高得多。随后的渲染仍然很慢,因为通过 useMemo 缓存的开销比重新计算实际的开销更大。...总之,对于复杂度 n = 1,不使用 useMemo 总是更快,因为缓存计算总是比性能增益更昂贵。...在这一点上,我们可以看到重新渲染的一些性能提高,但它并不是没有成本。最初的渲染速度要慢得多,损失了 183% 的时间,然而,二次渲染速度要快 37% ,这是否有用将在很大程度上取决于您的用例。...我们预计初始性能损失大约为 5-10% ,但结果发现甚至可能导致 500% 的性能损失(这在很大程度上取决于数据/处理的复杂性),这比预期的性能损失多 100 倍。

1.9K10

Next.js 强劲对手来了!💿 Remix 正式宣布开源

近期,由 React Router 原班团队打造,基于 TypeScript 与 React,内建 React Router V6 特性的全栈 Web 框架 Remix 正式开源。...,我们无需在前端使用任何 JavaScript 相关的内容,仅仅通过 HTML 与 HTTP 就完成了这个交互,所以 Remix 的网站在 Disbaled JavaScript 运行环境下也可以正常工作...正因为错误经常发生,且处理错误异常困难,包含客户端、服务端的各种错误,包含预期的、非预期的错误等,所以 Remix 内建了完善的错误处理机制,提供了类似 React 的 ErrorBoundary 的理念...,当出现这些非预期的错误时,就会激活这个函数,显示对应函数的表示错误信息的 UI。...当然这篇文章并不能包含所有 Remix 的特性,看到这里仍然对 Remix 感兴趣的同学可以访问官网(remix.run/)详细了解哦~ 官网提供了非常详细的实战教程帮助你使用 Remix 开发实际的应用

1.1K30
领券