createApp
创建一个应用实例,用于创建客户端渲染(Client-Side Rendering, CSR)
function cretateApp(Component,Props)
Component
根组件Props
传递根组件的Props
createSSRApp
创建一个应用实例,服务端渲染应用(SSR),用于创建服务器端渲染(Server-Side Rendering, SSR)
function createSSRApp(Component,Props)
Component
根组件Props
传递根组件的Props
createApp与createSSRApp的区别
-
渲染位置:
createApp()
:用于创建客户端渲染(Client-Side Rendering, CSR)的应用实例。这意味着所有的 Vue 组件都是在用户的浏览器中渲染的。createSSRApp()
:用于创建服务器端渲染(Server-Side Rendering, SSR)的应用实例。在这种模式下,Vue 组件首先在服务器上渲染成 HTML 字符串,然后这个字符串被发送到客户端(用户的浏览器)。
-
性能:
- 客户端渲染(
createApp()
):由于组件是在用户的浏览器中渲染的,因此初始加载可能需要一些时间,特别是当组件结构复杂或包含大量数据时。但是,一旦加载完成,应用就能实现高度的交互性和动态性。 - 服务器端渲染(
createSSRApp()
):服务器会预先渲染组件,因此用户能更快地看到页面的初始内容。这对于首屏加载速度至关重要,特别是在移动设备或慢速网络上。但是,服务器负担可能会加重,且用户与页面的交互可能会受到一定限制,因为大部分动态内容需要依赖后续的客户端渲染。
- 客户端渲染(
-
交互性和动态性:
- 客户端渲染(
createApp()
):能够实现更丰富的交互性和动态性,因为所有的 Vue 组件都在客户端实时渲染和更新。 - 服务器端渲染(
createSSRApp()
):虽然初始内容是由服务器渲染的,但后续的交互和动态更新通常仍然依赖于客户端的 JavaScript 执行。然而,由于初次渲染已经完成,交互和动态更新的延迟可能会减少。
- 客户端渲染(
-
搜索引擎优化(SEO) :
- 服务器端渲染(
createSSRApp()
):对于搜索引擎更加友好,因为搜索引擎可以直接读取服务器生成的 HTML 内容。这有助于搜索引擎更好地索引你的网页内容。 - 客户端渲染(
createApp()
):由于内容是在浏览器中通过 JavaScript 动态生成的,搜索引擎可能无法直接读取和索引这些内容。这可能会影响网页在搜索引擎结果中的排名。
- 服务器端渲染(
为什么搜索引擎可以读取服务器生成html的内容
- 直接访问性:搜索引擎的爬虫(或称为机器人)能够像普通用户一样,通过HTTP请求访问网站。当它们发送请求到服务器时,服务器会响应并返回相应的HTML内容。这些HTML内容是由服务器动态生成的,包括通过服务器端渲染(SSR)等技术生成的页面。由于搜索引擎爬虫能够直接访问并获取这些HTML内容,因此它们可以读取和解析服务器生成的页面内容。
- 文本解析能力:搜索引擎爬虫具备解析HTML的能力,它们可以分析HTML文档的结构和内容,提取出页面中的标题、段落、链接等关键信息。这些信息对于搜索引擎来说非常重要,因为它们帮助搜索引擎理解页面的主题和内容,从而进行索引和排名。
- 标准化格式:HTML是一种标准化的标记语言,用于描述网页的结构和内容。由于HTML的标准化,搜索引擎爬虫能够以一种一致和可预测的方式解析和提取页面信息。无论是静态HTML页面还是服务器动态生成的HTML页面,只要它们符合HTML规范,搜索引擎爬虫就能够读取和解析它们。
- SEO优化:许多网站为了提升在搜索引擎中的排名,会采用搜索引擎优化(SEO)的策略。这些策略包括使用合适的标题、关键词、描述等元素,以及优化页面结构和链接等。当服务器生成HTML内容时,这些SEO优化元素也会被包含在内,从而帮助搜索引擎更好地理解页面的内容和意图。
注意点
-
因为没有任何动态更新,所以像
onMounted
或者onUpdated
这样的生命周期钩子不会在 SSR 期间被调用,而只会在客户端运行。onMounted
:这个钩子在客户端被调用,当组件的模板被挂载到 DOM 上之后执行。在 SSR 中,因为组件的模板是在服务器上渲染成 HTML 的,所以onMounted
不会在服务器端被调用。它只在客户端被触发,这时组件已经插入到了真实的 DOM 中,可以进行 DOM 操作或启动一些需要 DOM 环境的插件和库。onUpdated
:这个钩子在组件的响应式状态发生变化导致重新渲染后调用。同样,在 SSR 期间,组件的初始渲染是在服务器上完成的,因此onUpdated
也不会在服务器端被调用。当页面在客户端被 Vue 接管后,如果组件的状态发生变化并导致重新渲染,那么onUpdated
会在客户端被触发。
为什么这些钩子不在 SSR 期间被调用?
- DOM 不存在:在服务器端,没有 DOM 环境,因此无法进行 DOM 操作或访问 DOM API。
onMounted
和onUpdated
这样的钩子通常涉及到 DOM 相关的操作,所以它们不适合在 SSR 期间调用。 - 性能考虑:SSR 的目标是尽快生成 HTML 并发送给客户端,以便用户能更快地看到页面的初始内容。在服务器端调用与 DOM 相关的钩子会增加渲染时间,这与 SSR 的目标相悖。
- 职责分离:SSR 负责生成初始的 HTML 内容,而 Vue 在客户端负责处理交互和动态更新。这种职责的分离使得每个部分都能专注于其擅长的领域,从而提高整体性能和用户体验。
-
你应该避免在
setup()
或者<script setup>
的根作用域中使用会产生副作用且需要被清理的代码。请将含有副作用的代码放到onMounted
中。-
在
setup()
或<script setup>
的根作用域中直接编写代码时,你需要特别注意避免使用会产生副作用且需要被清理的代码。副作用通常指的是那些改变外部状态或执行异步操作(如网络请求、定时器、事件监听器等)的代码。如果这些副作用代码没有被适当地清理,可能会导致内存泄漏、组件状态不一致或其他难以预见的问题。 -
为什么要在
onMounted
中放置含有副作用的代码呢?onMounted
是一个生命周期钩子,它会在组件的模板被挂载到 DOM 后调用。将副作用代码放在onMounted
中可以确保在组件已经准备好并可见给用户之前,这些代码不会被执行。此外,onMounted
钩子还提供了一个清理机制,你可以在其中返回一个清理函数,以确保在组件卸载时副作用被正确地清理。
-