vue项目ssr试探(二)

上一篇讲了ssr的项目从零开始搭建和静态的数据渲染,这一篇探讨一下异步的数据如何通过服务端渲染,在浏览器输入url之后,直接就渲染出来(预拉去数据)。

demo代码地址:https://github.com/haolovewan/vue-ssr-demo

分析

上一篇我们渲染的静态数据是通过服务端renderer.renderToString方法返回给浏览器一个静态的html;如果我们的组件中有异步的ajax,在我们正常普通的项目中,一般会在mounted中或者在created中获取数据,然后浏览器加载js再去渲染的;这个时候就必须得等我们的js脚本加载完了才会有数据;那么在服务端渲染的话,就得提前把这个数据给拿到,返回给前端的html中,这个数据就已经是存在这个html中了;这一步是关键的一步,也是最重要的一步。

如何实现

1,在开始渲染之前,预先获取数据,把数据存在Vuex的store中,因为vue组件还没开始渲染
2,后端渲染的时候,通过Vuex把获取到的ajax数据注入到组件中;
3,把获取到的数据赋值给window.INITIAL_STATE,通过HTML传给浏览器;
4,浏览器通过Vuex将window.INITIAL_STATE里的数据注入到组件中;

image.png

疑问点:

  • 后端已经把 Ajax 数据转化为 HTML 了,为什么还需要把 Ajax 数据通过 window.INITIAL_STATE 传递到前端?
    这个我试过了不给context.state赋值stoe.state;window.INITIAL_STATE没有值页面也不会有问题😂;下面这个回答是在网上找的,没看懂是啥意思,有知道的大佬,可以在评论区留言告诉下小弟。
    → 因为前端渲染的时候仍然需要知道这些数据。举个例子,你写了一个组件,给它绑定了一个点击事件,点击的时候打印出 this.msg 字段值。现在后端是把组件 HTML 渲染出来了,但是事件的绑定肯定得由浏览器来完成啊,如果浏览器拿不到跟服务器端同样的数据的话,在触发组件的点击事件的时候,又上哪儿去找 msg 字段呢?
  • 为啥需要在组件中单独写一个asyncData() 方法触发ajax?
    在服务端渲染的时候,需要提前拉去数据,再去渲染vue组件;此时vue的生命周期还没有执行;通过当前访问的路由,通过router匹配到对应的组件,找到组件中绑定的静态方法去获取ajax数据就好了;这个时候是没有this的,那么我们的数据存储的话就需要一个媒介容器;这个时候vuex就再好不过了,把数据存在store里,所以需要把store当参数传入到asyncData方法中。
  • 搭的这个项目既可以ssr服务端渲染,又能正常的客户端渲染,当客户端渲染的时候页面报错?
    image.png

    这个错误的原因是,页面刷新后,不会调用router. beforeResolve()路由守卫方法;所以导致计算属性报错,因为这个守卫方法里面写了浏览器渲染ajax获取的异步数据。
    查看官网后发现,官网给出了两套方案:
    1.在路由导航之前解析数据
    2.匹配要渲染的视图后,再获取数据
    第一种就是一开始用的router. beforeResolve();网上有大佬说需要将这个方法放到router.onReady()方法外面,试过还是不行。所以后面尝试的第二种方式。官网地址
  • vuex Store action 需要返回promise
    因为在asyncData方法中触发的是store.dispatch方法,vuex-action是支持异步的,在预拉去数据的时候需要等待ajax数据返回后做后续的渲染操作。

总结

经过好几天的不懈努力,终于是把这个ssr搞定了,也没有对它有原先那么强的抗拒心理了,感觉还挺有意思的。而且搭的这个项目如果服务端渲染不行了,随时可以切换到客户端渲染;在写文章之前感觉自己懂了,但是在写文章的时候,真的是绞尽脑汁,虽然写了ssr写了两篇,感觉内容不是很丰富,或许还是自己没有真正的理解透这个东西,需要在后续的学习中继续深入研究;如果有大佬阅读到此,如有一些讲述的不对的地方,或者意思表达不清晰的地方,望大佬们在评论中指出,小弟也将及时的更正,谢谢大家~


参考:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,183评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,850评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,766评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,854评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,871评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,457评论 1 311
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,999评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,914评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,465评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,543评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,675评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,354评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,029评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,514评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,616评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,091评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,685评论 2 360

推荐阅读更多精彩内容

  • 作者:威威(沪江前端开发工程师)本文原创,转载请注明作者及出处。 背景 最近, 产品同学一如往常笑嘻嘻的递来需求文...
    iKcamp阅读 3,256评论 0 33
  • 为什么使用服务器端渲染 (SSR)?与传统 SPA (单页应用程序 (Single-Page Applicatio...
    天一呀阅读 1,826评论 0 1
  • 一、对于MVVM的理解? MVVM 是 Model-View-ViewModel 的缩写。Model 代表数据模型...
    豆腐先生就是我阅读 2,268评论 1 8
  • ## 框架和库的区别?> 框架(framework):一套完整的软件设计架构和**解决方案**。> > 库(lib...
    Rui_bdad阅读 2,917评论 1 4
  • 和利喷画 简约装饰工程有限公司 简•美画框工作室 一站式广告服务集商 比学习,营销产品的吸引力,把产品的特色充分表...
    0222e7fbf980阅读 88评论 0 0