- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 ssr 和代码分割以及仅在客户端上完成的代码分割的优点有点困惑。
我的想法是,服务器首先渲染页面将带来更好的体验,而无需解析所有 JavaScript,然后再进行服务器渲染。
我很困惑代码分割如何适合 ssr 模型,是不是 ssr 渲染第一个命中,然后在客户端上完成代码分割?
React.Lazy 强调,react.client 全部在客户端完成。它与服务器上的代码分割有何不同。如果您转到特定路线,那么您会检索该 block 以进行第一次渲染吗?
我知道 React.Lazy 都是在客户端完成的,他们确实这么说。如果在服务器上完成会有什么不同。
代码分割对 ssr 有什么真正的好处吗?这不仅增加了复杂性吗?
最佳答案
根据您的用例,您可以仅使用 SSR、仅使用代码分割或根据需要组合两者。
更好的 SEO,因为搜索机器人可以使用标记(不一定依赖于执行 JavaScript)来建立索引。
更快的初始渲染由于标记是从服务器发送的,因此浏览器不必等待执行 JavaScript 来渲染它。 (尽管标记仍然缺乏交互性,直到客户端进行水合 react 为止)。
首先交付关键 CSS。初始页面渲染的关键 CSS 可以内联,从而获得更好的用户体验,因为加载的标记已经准备好样式。
更简单的路线分割。 SSR imo 使您可以更轻松地推理应用程序的路由拆分。例如,您可能有不同的 /about
和 /home
页面,您可以将其路由拆分以减少包大小(如果需要,还可以在客户端预加载其他路由)。
可能不需要服务器渲染整个页面。例如,假设您的主页(您希望在服务器上呈现)包含一个 Chat
组件,以便用户可以直接向您提问。
如果此组件很大,您可能会决定不进行服务器渲染,以便用户可以首先获取页面最重要的部分。这将通过在主页组件中对该组件进行代码拆分来减少初始页面加载。
当浏览器解析标记后,它会在主包之后加载您的 Chat
组件。这样您就可以识别并控制您的 bundle 大小。
如果您对 SSR 的好处不感兴趣,那么在我看来,这是构建应用程序的完美方法。
例如,如果您的应用程序是经过身份验证的用户的用户仪表板,那么最好完全不用担心 SSR,而只需对应用程序进行代码拆分。另请注意,服务器渲染您的应用程序将花费更多时间在服务器上发送响应(而不是普通的 REST API),因为必须生成标记。
回答您的问题:
I am confused how code splitting fits into the ssr model, is it that ssr renders the first hit and then code splitting is done thereafter on the client?
是的,有点。浏览器从服务器接收初始负载,之后客户端负责加载必要的位。现在,您可能决定在服务器端预加载组件并发送所有内容(请检查我在本答案末尾提到的 react-loadable
)。
How would it differ from code splitting on the server. Is that if you go to a specific route then you retrieve that chunk for the first render?
lazy
只是一个更干净的 API,支持用于代码分割的 Suspense
。理想情况下,当第一次加载路由时,您将在服务器上渲染初始标记,然后让客户端负责加载下一个位和路由。伊莫 Next.js这确实做得很好。
How would it differ if it was done on the server.
您可以预加载所有组件或仅预加载必要的部分。请检查组合代码拆分组件和 SSR 部分。
Is there any real benefit to ssr with code splitting. Does it not just add complexity?
在我看来,一切都有自己的权衡。正如我在仅使用代码拆分部分中提到的,如果您的用例不需要 SSR 的优点,那么仅使用代码拆分是完全可以的。
Note
Currently
lazy
(in React v16.6.1) doesn't support SSR completely. You might want to check outreact-loadable
to handle the cases where you wish to preload components server side.
关于reactjs - 具有代码分割功能的 React ssr 和现在的 React.Lazy 的优缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53071053/
我正在构建一个 RCP 应用程序,其中每个季度都会更新功能/插件。因此,如果用户选择自动更新功能/插件,则会下载更新插件的新 jar,但旧插件仍在使用我不再使用的磁盘空间。 我厌倦了删除包含旧 jar
我如何从外部 Controller 功能中调用 Controller 内部的功能,例如电话间隙回调功能 这是 Controller 外部定义的功能 function onDeviceReady()
如果某个功能(例如 MediaSource)可用,我如何使用 Google Dart 检查。 new MediaSource() 抛出一个错误。如何以编程方式检查此类或功能是否存在?有任何想法吗?是否
我正在尝试运行 Azure Orchestrations,突然我开始从 statusQueryGetUri 收到错误: 协调器函数“UploadDocumentOrchestrator”失败:函数“U
我见过 iPhone 上的应用程序,如果在 3.0 上运行,将使用 3.0 功能/API,例如应用内电子邮件编辑器,如果在 2.x 上运行,则不使用这些功能,并退出应用程序以启动邮件相反。 这是怎么做
这是 DB 规范化理论中的一个概念: Third normal form is violated when a non-key field is a fact about another non-ke
如果我定义 #if SOMETHING #endif 而且我还没有在任何地方定义 SOMETHING。 #if 中的代码会编译吗? 最佳答案 当#if的参数表达式中使用的名称未定义为宏时(在所有其他宏
我刚刚澄清了 A* 路径查找应该如何在两条路径具有相等值的 [情况] 下运行,无论是在计算期间还是在结束时,如果有两条相等的短路径。 例如,我在我的起始节点,我可以扩展到两个可能的节点,但它们都具有相
Java有没有类似下面的东西 宏 一种遍历所有私有(private)字段的方法 类似于 smalltalk symbols 的东西——即用于快速比较静态字符串的东西? 请注意,我正在尝试为 black
这个程序应该将华氏度转换为摄氏度: #include int main() { float fahrenheit, celsius; int max, min, step;
当打开PC缓存功能后, 软件将采用先进先出的原则排队对示波器采集的每一帧数据, 进行帧缓存。 当发现屏幕中有感兴趣的波形掠过时, 鼠标点击软件的(暂停)按钮, 可以选择回看某一帧的波形
我有一个特殊的(虚拟)函数,我想在沙盒环境中使用它: disable.system.call eval(parse(text = 'model.frame("1 ~ 1")'), envir = e
使用新的 Service 实现,我是否必须为我的所有服务提供一个 Options 方法? 使用我的所有服务当前使用的旧 ServiceBase 方法,OPTIONS 返回 OK,但没有 Access-
我正在阅读 Fogus 的关于 Clojure 的喜悦的书,在并行编程章节中,我看到了一个函数定义,它肯定想说明一些重要的事情,但我不知道是什么。此外,我看不到这个函数有什么用 - 当我执行时,它什么
我有大量的 C 代码,大部分代码被注释掉和/或 #if 0。当我使用 % 键匹配 if-else 的左括号和右括号时,它也匹配注释掉的代码。 有没有办法或vim插件在匹配括号时不考虑注释掉或#if 0
我有这个功能: map(map(fn x =>[x])) [[],[1],[2,3,4]]; 产生: val it = [[],[[1]],[[2],[3],[4]]] 我不明白这个功能是如何工作的。
我使用 Visual Studio 代码创建了一个函数应用程序,然后发布了它。功能应用程序运行良好。我现在在功能门户中使用代码部署功能(KUDU)并跳过构建。下面是日志 9:55:46 AM
我有一个数据框df: userID Score Task_Alpha Task_Beta Task_Charlie Task_Delta 3108 -8.00 Easy Easy
我真的无法解决这个问题: 我有一个返回数据框的函数。但是,数据框仅打印在我的控制台中,尽管我希望将其存储在工作空间中。我怎样才能做到这一点? 样本数据: n <- 32640 t <- seq(3*p
有没有办法找出所有可能的激活器命令行选项? activator -help仅提供最低限度的可用选项/功能列表,但所有好的东西都隐藏起来,即使在 typesafe 网站在线文档中也不可用。 到目前为止,
我是一名优秀的程序员,十分优秀!