我目前有一个React应用程序,我想使用SSR。除了一个组件之外,所有组件都是非常静态的内容,这使得SSR变得非常简单。现在,除了组件之外的所有内容都呈现得很好。
我的问题是,如何渲染这个需要首先获取数据的组件?因为它是一个呈现的复杂SVG,所以我的想法是,一旦数据传入,让它“更新”是一个糟糕的举动,如果没有数据(带有错误消息),它就不存在会更好。
因此,我的计划是:我可以向组件添加一个属性,以传递来自父组件的数据,而不是仅将其作为内部状态。因此,如果传递了数据,则不需要组件中的fetch请求。从那里我可以做的是获取应用程序的静态包输出,当页面被请求时,服务器将请求正确的数据,就像组件一样。一旦接收到数据,服务器就可以使用regex从捆绑包中获取组件,将数据作为道具添加,呈现组件,并将其与已呈现的其余静态内容放回一起。
这是正确的方法吗?这感觉有点复杂,但可能就是这样做的。我没有把握。
发布于 2020-11-04 12:28:57
你的直觉是正确的。在当前的React (17.0)中,在组件内部使用数据获取进行SSR是相当麻烦的。
需要在概念层面上实现的是,所有数据依赖关系都需要预先知道,即。在调用ReactDOM的render之前。这样,人们可以以同步的方式访问数据,从而允许在服务器上进行一遍渲染。
我不太理解你的想法“用正则表达式从捆绑包中抓取组件”。解决数据依赖问题的一种方法是将数据从根组件注入React树(即,ReactDOM.renderToString(<App componentStaticData={data} />)
),并让数据相关组件意识到这样一个事实,即它只能从那里获取数据,而不是进行(异步)调用。需要注意的是,useEffects不是在服务器上执行的。
获取所有数据依赖关系的另一个想法是进行两遍渲染。首先使用一个方法来收集所有使用的资源,然后等待它们的完成,并将它们作为静态数据注入到send传递中。
第三种方法是使用React框架之一,它提供了开箱即用的SSR。你可以看看Next.js或Gatsby。根据您的设置,这可能是实现SSR的最简单或最困难的方法。
https://stackoverflow.com/questions/64582977
复制相似问题