預(yù)渲染升級(jí)SSR

預(yù)渲染升級(jí)成服務(wù)端渲染

回顧預(yù)渲染 是基于 prerender-spa-plugin 在項(xiàng)目構(gòu)建時(shí)堕花,通過(guò)無(wú)頭瀏覽器模擬瀏覽器請(qǐng)求文狱,將得到的數(shù)據(jù)插入給出的模板中,從而生成已經(jīng)包含數(shù)據(jù)的html(這里其實(shí)有個(gè)天坑缘挽,最初嘗試預(yù)渲染時(shí)為了方便瞄崇,使用webpack-dev-server的proxy選項(xiàng)做了一次代理請(qǐng)求三方接口,然后預(yù)渲染并沒(méi)有渲染出這些動(dòng)態(tài)的數(shù)據(jù)到踏。原因是因?yàn)轭A(yù)渲染的無(wú)頭瀏覽器并不會(huì)走dev-server的代理,必須在客戶(hù)端再配一層nginx代理尚猿,才能將請(qǐng)求轉(zhuǎn)發(fā)窝稿,從而拿到動(dòng)態(tài)數(shù)據(jù)插入模板)。

SSR升級(jí)相比預(yù)渲染得到了什么

  1. 更快的構(gòu)建速度凿掂,SSR是動(dòng)態(tài)插入數(shù)據(jù)伴榔,并不會(huì)在構(gòu)建時(shí)就去預(yù)加載數(shù)據(jù),而是輸入url后在服務(wù)端請(qǐng)求庄萎,拿到返回的數(shù)據(jù)插入模板后再返回給客戶(hù)端踪少。
  2. 嵌套路由下的個(gè)性化頁(yè)面加載速度,個(gè)性化頁(yè)面無(wú)法進(jìn)行預(yù)渲染糠涛,ssr卻可以解決援奢。
  3. 更好的SEO。
  4. 更快的首屏加載速度忍捡。( 請(qǐng)求業(yè)務(wù)數(shù)據(jù)集漾,和將數(shù)據(jù)轉(zhuǎn)為html片段都在服務(wù)端進(jìn)行了,瀏覽器負(fù)責(zé)加載資源砸脊,請(qǐng)求CDN資源具篇,css渲染。到達(dá)時(shí)間縮短凌埂。之后走的依舊是前端路由驱显,然后前端預(yù)取數(shù)據(jù),所以這里僅僅首屏 )。

官方流程圖

ssr流程

官方demo

HackerNews Demo

升級(jí)要做哪些處理

一埃疫,使用SSR伏恐,后端掌握權(quán)應(yīng)在自己手里,具體如何實(shí)現(xiàn)熱更新熔恢,是后面的事脐湾。server.js做了什么。

服務(wù)端數(shù)據(jù)必須與客戶(hù)端數(shù)據(jù)保持一致叙淌,引入Vuex

  1. express生成一個(gè)服務(wù)器實(shí)例秤掌。
  2. 客戶(hù)端使用打包好的index.html,因?yàn)橹筮€是要走前端路由鹰霍,這個(gè)由html-webpack-plugin生成好的注入了前端打包好的腳本的html需要作為renderer的模板闻鉴。
  3. 服務(wù)端entry-server.js打包好的入口傳入createBundleRenderer做祝,這里產(chǎn)出的是首屏html的主體部分私植。
  4. 通過(guò)2,3vue-server-renderer會(huì)將它們拼合成一個(gè)整體针炉,再傳至前端督勺。
二渠羞,打包

打包分為客戶(hù)端文件的打包和服務(wù)端文件的打包。將公用的部分分離到webpack.base.config.js智哀。合并可以通過(guò)webpack-merge或者簡(jiǎn)單地通過(guò)Object.assign組合兩種config次询。

  1. 客戶(hù)端打包文件與正常SPA的打包文件沒(méi)有什么區(qū)別,入口為entry-client.js瓷叫。
  2. 服務(wù)端打包文件注意指定執(zhí)行環(huán)境為node屯吊,打包使用commonjs規(guī)范,因?yàn)橹笠诜?wù)端跑的呀摹菠,入口為entry-server.js盒卸。
  3. webpack.base.config也沒(méi)什么,默認(rèn)entry為entry-client.js次氨。webpack4以上記得指定打包模式蔽介。
三,入口entry-server.js&&entry-client.js
  1. 服務(wù)端入口通過(guò)app.vue導(dǎo)出的createApp生成一個(gè)新的實(shí)例煮寡。
  2. 傳入執(zhí)行上下文中的url屉佳,以此匹配對(duì)應(yīng)的所有組件,循環(huán)執(zhí)行所有匹配到組件中的asyncData()即所需獲取的異步數(shù)據(jù)洲押。獲取的數(shù)據(jù)存儲(chǔ)在store.state中武花。
  3. 執(zhí)行完畢后,將store.state注入context(之后客戶(hù)端入口可以通過(guò)window.INITIAL_STATE)獲取到這個(gè)已經(jīng)全部獲取過(guò)的store.state杈帐,以此保持服務(wù)端與客戶(hù)端數(shù)據(jù)的一致性体箕。此處若出錯(cuò)會(huì)導(dǎo)致混合失敗专钉,服務(wù)端數(shù)據(jù)被覆蓋。瀏覽器用客戶(hù)端的數(shù)據(jù)重新渲染
  4. 客戶(hù)端入口通過(guò)app.vue導(dǎo)出的createApp生成一個(gè)新的實(shí)例累铅。
  5. 將window.INITIAL_STATE注入store跃须。
  6. 之后走前端路由,asyncData()中預(yù)取的操作在服務(wù)端已不再執(zhí)行娃兽,所以此時(shí)前端預(yù)取菇民。通過(guò)router.beforeResolve((to, from, next)=>{})匹配路由并預(yù)取數(shù)據(jù)。(注意投储,在同一嵌套路由下的組件的數(shù)據(jù)不要再重新獲取了第练,diff實(shí)現(xiàn))。
  7. 預(yù)取完畢后玛荞,將該實(shí)例掛載到根組件娇掏。
四,前端入口文件src/index.js

從以上也可以看出勋眯,index.js必須作為一個(gè)工廠函數(shù)婴梧,導(dǎo)出一個(gè)生成vue實(shí)例的函數(shù),并且包含store客蹋,router這些在入口中使用到的實(shí)例塞蹭。

五,熱更新做了什么讶坯?

setup-dev-server.js導(dǎo)出一個(gè)接收express實(shí)例和處理index.html和server-bundle.js的函數(shù)番电。

  1. 生產(chǎn)模式下,依賴(lài)webpack-dev-middleware執(zhí)行代碼監(jiān)聽(tīng)并熱更新打包闽巩,依賴(lài)webpack-hot-middleware執(zhí)行頁(yè)面熱更新钧舌。
  2. 導(dǎo)出內(nèi)存中的打包好的index.html和server-bundle.js担汤。在server.js入口涎跨,通過(guò)vue-server-renderer整合模板和服務(wù)端入口。

官方文檔崭歧,很多地方值得深究和細(xì)細(xì)推究隅很,寫(xiě)了個(gè)小demo便于學(xué)習(xí)吧。

如果你依賴(lài)由組件生命周期鉤子函數(shù)填充的上下文數(shù)據(jù)率碾,則不建議使用流式傳輸模式叔营。??????

直接renderToString 帶注釋小demo??
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市所宰,隨后出現(xiàn)的幾起案子绒尊,更是在濱河造成了極大的恐慌,老刑警劉巖仔粥,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婴谱,死亡現(xiàn)場(chǎng)離奇詭異蟹但,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)谭羔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)华糖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瘟裸,你說(shuō)我怎么就攤上這事客叉。” “怎么了话告?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵兼搏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我超棺,道長(zhǎng)向族,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任棠绘,我火速辦了婚禮件相,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氧苍。我一直安慰自己夜矗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布让虐。 她就那樣靜靜地躺著紊撕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赡突。 梳的紋絲不亂的頭發(fā)上对扶,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音惭缰,去河邊找鬼浪南。 笑死,一個(gè)胖子當(dāng)著我的面吹牛漱受,可吹牛的內(nèi)容都是我干的络凿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼昂羡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼絮记!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起虐先,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怨愤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蛹批,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體撰洗,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膀息,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了了赵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潜支。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柿汛,靈堂內(nèi)的尸體忽然破棺而出冗酿,到底是詐尸還是另有隱情,我是刑警寧澤络断,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布裁替,位于F島的核電站,受9級(jí)特大地震影響貌笨,放射性物質(zhì)發(fā)生泄漏弱判。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一锥惋、第九天 我趴在偏房一處隱蔽的房頂上張望昌腰。 院中可真熱鬧,春花似錦膀跌、人聲如沸遭商。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)劫流。三九已至,卻和暖如春丛忆,著一層夾襖步出監(jiān)牢的瞬間祠汇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工熄诡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留可很,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓粮彤,卻偏偏與公主長(zhǎng)得像根穷,于是被迫代替她去往敵國(guó)和親姜骡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子导坟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)圈澈,斷路器惫周,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 寫(xiě)在開(kāi)頭 先說(shuō)說(shuō)為什么要寫(xiě)這篇文章, 最初的原因是組里的小朋友們看了webpack文檔后, 表情都是這樣的: (摘...
    Lefter閱讀 5,287評(píng)論 4 31
  • 導(dǎo)讀:在中國(guó),圍棋的正式在學(xué)群體有400萬(wàn)人以上登舞。加上公立校贰逾、幼兒園內(nèi)的圍棋興趣班學(xué)員,至少又有三四百萬(wàn)人菠秒,足見(jiàn)圍...
    繪客ART閱讀 504評(píng)論 0 0
  • 你在你的旅途上行走;我在我的路上前行禁灼。 地球是很大但總有一天會(huì)相遇#
    一與一閱讀 209評(píng)論 0 0
  • 花椒泡腳有什么好處? 1管挟、中醫(yī)認(rèn)為用花椒水泡腳比用熱水泡腳促進(jìn)睡眠效果更好。其實(shí)方法很簡(jiǎn)單弄捕,用一個(gè)棉布包50克花椒...
    月清清閱讀 308評(píng)論 0 0