ssr源代码(SSR和前端编译在这点上是一样的)
ssr源代码(SSR和前端编译在这点上是一样的)
2024-09-28 11:52:04  作者:俄式爷们儿  网址:https://m.xinb2b.cn/tech/irc335781.html

我们通过组件的方式来开发前端页面,在浏览器里面,组件渲染时会通过 dom api 对 dom 做增删改来显示相应的内容但在服务端并没有 dom api,我们可以把组件渲染成 html 字符串,然后下发到浏览器渲染,因为已经有了 html 了,就可以直接渲染成 dom,不再需要执行 JS,所以很快,接下来我们就来聊聊关于ssr源代码?以下内容大家不妨参考一二希望能帮到您!


ssr源代码

我们通过组件的方式来开发前端页面,在浏览器里面,组件渲染时会通过 dom api 对 dom 做增删改来显示相应的内容。但在服务端并没有 dom api,我们可以把组件渲染成 html 字符串,然后下发到浏览器渲染,因为已经有了 html 了,就可以直接渲染成 dom,不再需要执行 JS,所以很快。

第一种浏览器渲染的方式叫做 CSR (client side render),第二种服务端渲染的方式叫做 SSR(server side render)。

很明显,SSR 渲染出画面的速度会很快,因为不需要执行 JS ,而是直接解析 html。因此,app 里嵌的页面基本都用 SSR,这样体验会更好。而且低端机执行 JS 是可能很慢的,要是 CSR,那页面可能会有很长一段白屏时间。

此外,SSR 是直接返回了 html,这样搜索引擎的爬虫就能从中抓取到具体的内容,就会给更高的搜索权重,也就是更有利于 SEO (search engine optimize)。

在 app 里嵌的页面、搜索引擎排名优化这两种场景下,我们都要做 SSR。

知道了 SSR 是什么和为什么要做 SSR,那如何实现 SSR 呢?

SSR 实现原理

我们知道 vue 是通过 template 描述页面结构,而 react 是通过 jsx,但不管是 template 还是 jsx,编译后都会产生 render function,然后执行产生 vdom。

vdom 在浏览器里会通过 dom api 增删改 dom 来完成 CSR,在服务端会通过拼接字符串来完成 SSR。

图片

vdom 是一个树形结构,那么 SSR 就是遍历这棵树,拼接字符串的过程。

图片

看到这张图,不知你有没有想起编译的 generate 阶段也是这样的拼接字符串的过程:

图片

没错,SSR 中 vdom 打印成字符串,和编译中 AST 打印成字符串的逻辑确实是一样的。

口说无凭,我们来看下两者的源码再下结论。

Vue SSR 的渲染流程

vue 提供了 vue-server-renderer 这个包用于 SSR,它的作用就是把 Vue 组件渲染成字符串。

它提供了 createBundleRenderer 的 api:

const bundle = fs.readFileSync(resolve('./dist/server-bundle.js'), 'utf-8');

createBundleRenderer(bundle)

这个 bundle 就是 webpack 编译产生的目标代码:

图片

可能你会问,为啥要等 webpack 把代码编译成 bundle 才去渲染啊?

因为像 esm 的模块语法、像 ts、sass 等语法都不是 node 支持的呀,要先把代码编译打包成 bundle,这样才能在 node 里面跑。

这也是为啥提供的 api 叫做 createBundleRenderer。

创建好 renderer 之后,调用 renderToStream 方法,就开始执行渲染了。

当然,也可以调用 renderToString,这俩 api 的区别是一个是边渲染边返回内容,一个是完全渲染完再返回内容。

图片

渲染第一步,自然是要把传入的 bundle 给执行了:

图片

这里 runInVm 就是执行 bundle 那段字符串的代码,这是基于 node 提供的 vm 包的 api 实现的:

图片

通过 vm.runInContext 可以在某个上下文中执行一段代码。

执行之后,返回的就是 Vue 的实例:

图片

注意,这里是在 node 环境里创建的 Vue 实例,所以没有 dom api,不能操作 dom,但可以打印成字符串:

图片

这里 render 的实现就是拼接字符串:

图片

这样遍历完一遍 vdom,就拼接好了最终的 html:

图片

把这段 html 返回给浏览器即可。这样我们就实现了 Vue 的 SSR!

小结一下 Vue SSR 的流程:

vue-server-renderer 包提供了 createBundleRenderer 的 api,可以传入编译打包后的 bundle 代码来创建一个 renderer。renderer 有 renderToString 和 renderToStream 的 api。内部会通过 vm.runInContext 来执行 bundle 的代码,产生 Vue 实例,之后把 Vue 实例的 vdom 渲染成 html 字符串。返回这个 html 字符串就实现了 SSR。

当然,实际做 SSR 的时候,我们不会直接用 vue-server-renderer,而是会用封装了一层的 nuxt.js,因为它对路由等做了处理,并且对工具链的封装也很好,开箱即用。

到了这里,我们可以说 SSR 就是遍历 vdom 拼接字符串的过程了。

接下来再看下编译中的 generate 阶段:

编译流程

前端领域的编译基本都是源码转源码,所以流程都差不多,都是 parse、transform、generate 这三步:

图片

parse 阶段把源码转为 AST(抽象语法树),然后 transform 阶段会对 AST 做各种增删改,generate 阶段会把修改后的 AST 递归打印成字符串。

这里的 generate 阶段就像 SSR 的 render 一样,也是个拼接字符串的过程:

比如 babel 的 generate 的实现是这样的:

打印 while 节点:

图片

打印 condition 节点:

图片

递归遍历 AST,打印每个节点,拼接字符串,就能产生目标代码。

所以说,SSR 的 vdom render 和前端编译的 AST generate 是一样的逻辑,都是拼接字符串。

当然,也是有很多不同的地方的,比如 SSR 的 vdom 是动态执行 render function 产生的,而编译中的 AST 是从源码中静态编译产生的。只是代码生成的拼接字符串的逻辑一样。

总结

SSR 渲染首屏画面速度快,而且利于搜索引擎的抓取,所以在 app 里嵌的页面、SEO 这两种场景下,我们都会做 SSR。

SSR 的原理就是把 vdom 打印成 字符串,这和前端编译中的 generate 阶段很类似。

我们看了 Vue 的 vue-server-render 包的源码,它提供了 createBundleRenderer 的 api,传入编译打包后的 bundle 代码,通过 vm 执行它,然后把产生的 Vue 实例的 vdom 打印成 html 字符串,就实现了 SSR。

我们也看了 babel generator 的源码,它提供了每种节点的打印逻辑,递归遍历 AST,拼接字符串,就能产生目标代码。

虽然 SSR 和前端编译在流程上和目的上都不同,但是在生成代码这一点上是一样的,都是把树形结构打印成字符串。

  • 请问发泥怎么用
  • 2024-09-28请问发泥怎么用硬性发泥适合短头发的人使用,能抓出成束的效果,以男性头发为例,操作如下:1、用指甲盖的位置贴紧发泥2、刮出适合的用量3、放在掌心双手揉搓至融化后抹遍手掌4、顺着发根的方向向上抓揉头发5、直至出现想要的。
  • 东南亚鱼生各种做法(皇帝鱼生自海外)
  • 2024-09-28皇帝鱼生自海外皇帝鱼:生自海外,味留岭南|佛味鲜生好水好食材一方水土孕一席美食河网密布的佛山成了皇帝鱼的好居处皇帝鱼即苏丹鱼是一种鲤鱼幼时全身呈青色有白色旋涡状花纹长到23厘米左右的成鱼时旋涡状花纹会变成十多条黄色。
  • 15部笑炸了肺的喜剧电影值得收藏(保证你轻轻松松)
  • 2024-09-28保证你轻轻松松1.《银河护卫队》2014“逗比”超级英雄拯救宇宙[豆瓣评分]:8.0观看平台:爱奇艺/优酷/芒果TV/乐视观影小提示:无尿点,嗨翻你《银河护卫队》是北美年度票房TOP3,堪称2014年的一大惊喜作为。
  • 美国总统饮食史(美国总统爱吃什么)
  • 2024-09-28美国总统爱吃什么你知道美国总统都喜欢吃什么吗?今天我们就来聊聊历任美国总统在白宫里都吃些什么吧!乔·拜登乔·拜登是美国第46任总统,也是现任总统拜登的喜好在白宫是众所周知的事情他最喜欢的食物有冰淇淋、番茄酱天使发丝意。
  • 行为世范是什么意思(行为世范的解释)
  • 2024-09-28行为世范的解释行为世范的意思是:要努力树立自己的形象,规范自己的行为,为世人做个好的典范,成为社会中的楷模原句“学为人师行为世范”意思是:老师应该努力做好学问,有充足的知识和品格来教导学生;要努力树立自己的形象,规。
  • 云南十八怪的风俗传闻(云南18怪顺口溜都有哪些含义)
  • 2024-09-28云南18怪顺口溜都有哪些含义云南十八怪顺口溜你说奇怪不奇怪,云南就有十八怪四个竹鼠一麻袋,蚕豆花生数着卖;袖珍小马多能耐,背着娃娃再恋爱;四季衣服同穿戴,常年能出好瓜菜;摘下草帽当锅盖,三个蚊子一盘菜;石头长在云天外,这边下雨那。
  • 迪士尼公主风格写真 另一种画风的迪士尼公主
  • 2024-09-28迪士尼公主风格写真 另一种画风的迪士尼公主迪士尼公主系列是华特迪士尼影业旗下的经典的动漫IP,现在经过数十年的发展已经成为了非常庞大的系列,无数的公主加入了这个系列,并且成为了其中不可缺少的一员!其实迪士尼公主的画风一直是偏欧美的,毕竟本身就。
  • 山东有哪些大学(山东省152所高校 本科大学70所)
  • 2024-09-28山东省152所高校 本科大学70所距离高考百日冲刺已经过去差不多30天了,对于高三学生来说再过70多天就要高考了,马上要面临人生中最重要的一次考试你选好大学了吗?你梦想中的大学是什么样子的呢?山东省作为高考大省,每年高考人数非常多,2。
  • 三星堆再曝新发现说明什么?三星堆又双叒上热搜
  • 2024-09-28三星堆再曝新发现说明什么?三星堆又双叒上热搜来源:中国青年报近日,三星堆频上热搜3月30日,#三星堆考古90后担主力#也来了↓↓↓据报道,三星堆4号坑目前总计发现了3件青铜瑗,截至28日,考古人员顺利提取了其中的2件,都由90后的年轻人担纲主力。
  • 腹肌轮最高境界(男菩萨出现了人鱼线)
  • 2024-09-28男菩萨出现了人鱼线啧啧啧,说起敢于贡献美好肉体的男菩萨,还得是韩国的欧巴们啊最近颜酱看帅哥网红没心动,看抖音上的光剑变装没心动一不小心刷到近段时间刚更新完的《成人练习生》片段,哦嚯,不争气的口水瞬间流成了一条河让俺狠狠。
  • 补充碳水是多吃糖吗(说一说碳水化合物)
  • 2024-09-28说一说碳水化合物碳水化合物也叫糖类,与蛋白质和脂肪一起,组合我们人体所需要的三大营养素我们的身体可以将碳水化合物分解成葡萄糖葡萄糖或血糖是人体细胞、组织和器官的主要能量来源葡萄糖可以立即被使用,或储存在肝脏和肌肉中以。