You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
可以看到服务端把路由下的 组件 1 也给渲染出来了,而不是让客服端去动态加载,其次是 html 也被注入了一些 <script 标签去加载对应的客户端资源。这里再多说一下,有的同学可能不理解,服务端渲染不就是最后输出 html 让浏览器渲染吗,怎么 html 还带 js 脚本,注意,服务端渲染出的 html 只是首次展示给用户的页面而已,用户后期操作页面处理数据还是需要 js 脚本去跑的,也就是 webpack 为什么要打包出一套服务端代码(用于渲染首次html用),一套客户端代码(用于后期交互和数据处理用)
四、小结
本篇简单了解了 vue ssr 的简单流程,上面例子的demo放在对应项目根目录下,方便查看。服务端渲染还有比较重要的一部分是首屏数据的获取渲染,一般页面展示都会有一些网络数据初始化,服务端渲染可以将这些数据获取到插入到 html ,由于这部份内容涉及到的知识点也不少,放在下次讲。
服务端渲染(SSR)
什么是服务端渲染,简单理解是将组件或页面通过服务器生成html字符串,再发送到浏览器,最后将静态标记"混合"为客户端上完全交互的应用程序。
于传统的SPA(单页应用)相比,服务端渲染能更好的有利于SEO,减少页面首屏加载时间,当然对开发来讲我们就不得不多学一些知识来支持服务端渲染。同时服务端渲染对服务器的压力也是相对较大的,和服务器简单输出静态文件相比,通过node去渲染出页面再传递给客户端显然开销是比较大的,需要注意准备好相应的服务器负载。
一、一个简单的例子
上面例子利用
vue-server-renderer
npm 包将一个vue示例最后渲染出了一段 html。将这段html发送给客户端就轻松的实现了服务器渲染了。二、官方渲染步骤
上面例子虽然简单,但在实际项目中往往还需要考虑到路由,数据,组件化等等,所以服务端渲染不是只用一个
vue-server-renderer
npm包就能轻松搞定的,下面给出一张Vue官方的服务器渲染示意图:流程图大致意思是:将 Source(源码)通过 webpack 打包出两个 bundle,其中 Server Bundle 是给服务端用的,服务端通过渲染器 bundleRenderer 将 bundle 生成 html 给浏览器用;另一个 Client Bundle 是给浏览器用的,别忘了服务端只是生成前期首屏页面所需的 html ,后期的交互和数据处理还是需要能支持浏览器脚本的 Client Bundle 来完成。
三、具体怎么实现
实现过程就是将上面的示意图转化成代码实现,不过这个过程还是有点小复杂的,需要多点耐心去推敲每个细节。
1、先实现一个基本版
项目结构示例:
其中:
(1)、comp1.vue 和 copm2.vue 组件
(2)、App.vue 顶级 vue 组件
(3)、index.template.html html 模板
(4)、上面基础代码不解释,接下来看
路由 router
app.js app 入口文件
我们通过
createApp
暴露一个根 Vue 实例,这是为了确保每个用户能得到一份新的实例,避免状态污染,所以我们写了一个可以重复执行的工厂函数
createApp
。 同样路由 router 我们也是一样的处理方式createRouter
来暴露一个 router 实例(5)client-entry.js client 的入口文件
客户端代码是在路由解析完成的时候讲 app 挂载到 #app 标签下
(7)server-entry.js server 的入口文件
服务器的入口文件我们返回了一个 promise
2、打包
在第一步我们大费周章实现了一个带有路由的日常功能模板代码,接着我们需要利用webpack将上面的代码打包出服务端和客户端key的代码,入口文件分别是
server-entry.js
和client-entry.js
(1)、 webpack构建配置
一般配置分为三个文件:base, client 和 server。基本配置(base config)包含在两个环境共享的配置,例如,输出路径(output path),别名(alias)和 loader。服务器配置(server config)和客户端配置(client config),可以通过使用 webpack-merge 来简单地扩展基本配置。
webpack 配置完成,其实东西也不多,都是常规配置。需要注意的是
webpack.server.config.js
配置,output是生成一个 commonjs 的 library,VueSSRServerPlugin
用于这是将服务器的整个输出构建为单个 JSON 文件的插件。(2)、 webpack build poj
build 代码
打包后会生成一些打包文件,其中 server.config 打包后会生成
vue-ssr-server-bundle.json
文件,这个文件是给createBundleRenderer
用的,用于服务端渲染出 html 文件细心的你还会发现 client.config 不仅生成了一下客服端用的到 js 文件,还会生成一份
vue-ssr-client-manifest.json
文件,这个文件是客户端构建清单,服务端拿到这份构建清单找到一下用于初始化的js脚步或css注入到 html 一起发给浏览器。(3)、 服务端渲染
其实上面都是准备工作,最重要的一步是将webpack构建后的资源代码给服务端用来生成 html 。我们需要用node写一个服务端应用,通过打包后的资源生成 html 并发送给浏览器
server.js
这里我们用到了最开始 demo 用到的
vue-server-renderer
npm 包,通过读取vue-ssr-server-bundle.json
和vue-ssr-client-manifest.json
文件 renderer 出 html,最后ctx.body = html
发送给浏览器, 我们试着console.log(html)
出 html 看看服务端到底渲染出了何方神圣:可以看到服务端把路由下的
组件 1
也给渲染出来了,而不是让客服端去动态加载,其次是 html 也被注入了一些 <script 标签去加载对应的客户端资源。这里再多说一下,有的同学可能不理解,服务端渲染不就是最后输出 html 让浏览器渲染吗,怎么 html 还带 js 脚本,注意,服务端渲染出的 html 只是首次展示给用户的页面而已,用户后期操作页面处理数据还是需要 js 脚本去跑的,也就是 webpack 为什么要打包出一套服务端代码(用于渲染首次html用),一套客户端代码(用于后期交互和数据处理用)四、小结
本篇简单了解了 vue ssr 的简单流程,上面例子的demo放在对应项目根目录下,方便查看。服务端渲染还有比较重要的一部分是首屏数据的获取渲染,一般页面展示都会有一些网络数据初始化,服务端渲染可以将这些数据获取到插入到 html ,由于这部份内容涉及到的知识点也不少,放在下次讲。
运行项目
1、获取项目分支
2、项目构建
open http://localhost:8089/
The text was updated successfully, but these errors were encountered: