https://juejin.im/entry/5b2c55c551882574dd4ad5bb
https://ssr.vuejs.org/zh/
什么是服務(wù)器端渲染(SSR)胚嘲?
Vue.js 是構(gòu)建客戶端應(yīng)用程序的框架幕庐。默認(rèn)情況下谈为,可以在瀏覽器中輸出 Vue 組件培己,進(jìn)行生成 DOM 和操作 DOM。然而热鞍,也可以將同一個(gè)組件渲染為服務(wù)器端的 HTML 字符串,將它們直接發(fā)送到瀏覽器,最后將這些靜態(tài)標(biāo)記"激活"為客戶端上完全可交互的應(yīng)用程序列粪。
服務(wù)器渲染的 Vue.js 應(yīng)用程序也可以被認(rèn)為是"同構(gòu)"或"通用",因?yàn)閼?yīng)用程序的大部分代碼都可以在服務(wù)器和客戶端上運(yùn)行谈飒。
#為什么使用服務(wù)器端渲染(SSR)岂座?
與傳統(tǒng) SPA(Single-Page Application - 單頁(yè)應(yīng)用程序)相比,服務(wù)器端渲染(SSR)的優(yōu)勢(shì)主要在于:
-
更好的 SEO杭措,由于搜索引擎爬蟲(chóng)抓取工具可以直接查看完全渲染的頁(yè)面费什。
請(qǐng)注意,截至目前手素,Google 和 Bing 可以很好對(duì)同步 JavaScript 應(yīng)用程序進(jìn)行索引鸳址。在這里,同步是關(guān)鍵泉懦。如果你的應(yīng)用程序初始展示 loading 菊花圖稿黍,然后通過(guò) Ajax 獲取內(nèi)容,抓取工具并不會(huì)等待異步完成后再行抓取頁(yè)面內(nèi)容崩哩。也就是說(shuō)巡球,如果 SEO 對(duì)你的站點(diǎn)至關(guān)重要,而你的頁(yè)面又是異步獲取內(nèi)容琢锋,則你可能需要服務(wù)器端渲染(SSR)解決此問(wèn)題辕漂。
更快的內(nèi)容到達(dá)時(shí)間(time-to-content),特別是對(duì)于緩慢的網(wǎng)絡(luò)情況或運(yùn)行緩慢的設(shè)備吴超。無(wú)需等待所有的 JavaScript 都完成下載并執(zhí)行钉嘹,才顯示服務(wù)器渲染的標(biāo)記,所以你的用戶將會(huì)更快速地看到完整渲染的頁(yè)面鲸阻。通嘲匣粒可以產(chǎn)生更好的用戶體驗(yàn),并且對(duì)于那些「內(nèi)容到達(dá)時(shí)間(time-to-content)與轉(zhuǎn)化率直接相關(guān)」的應(yīng)用程序而言鸟悴,服務(wù)器端渲染(SSR)至關(guān)重要陈辱。
使用服務(wù)器端渲染(SSR)時(shí)還需要有一些權(quán)衡之處:
開(kāi)發(fā)條件所限。瀏覽器特定的代碼细诸,只能在某些生命周期鉤子函數(shù)(lifecycle hook)中使用沛贪;一些外部擴(kuò)展庫(kù)(external library)可能需要特殊處理,才能在服務(wù)器渲染應(yīng)用程序中運(yùn)行。
涉及構(gòu)建設(shè)置和部署的更多要求利赋。與可以部署在任何靜態(tài)文件服務(wù)器上的完全靜態(tài)單頁(yè)面應(yīng)用程序(SPA)不同水评,服務(wù)器渲染應(yīng)用程序,需要處于 Node.js server 運(yùn)行環(huán)境媚送。
更多的服務(wù)器端負(fù)載中燥。在 Node.js 中渲染完整的應(yīng)用程序,顯然會(huì)比僅僅提供靜態(tài)文件的 server 更加大量占用 CPU 資源(CPU-intensive - CPU 密集)塘偎,因此如果你預(yù)料在高流量環(huán)境(high traffic)下使用疗涉,請(qǐng)準(zhǔn)備相應(yīng)的服務(wù)器負(fù)載,并明智地采用緩存策略吟秩。
在對(duì)你的應(yīng)用程序使用服務(wù)器端渲染(SSR)之前咱扣,你應(yīng)該問(wèn)的第一個(gè)問(wèn)題是,是否真的需要它峰尝。這主要取決于內(nèi)容到達(dá)時(shí)間(time-to-content)對(duì)應(yīng)用程序的重要程度偏窝。例如收恢,如果你正在構(gòu)建一個(gè)內(nèi)部?jī)x表盤(pán)武学,初始加載時(shí)的額外幾百毫秒并不重要,這種情況下去使用服務(wù)器端渲染(SSR)將是一個(gè)小題大作之舉伦意。然而火窒,內(nèi)容到達(dá)時(shí)間(time-to-content)要求是絕對(duì)關(guān)鍵的指標(biāo),在這種情況下驮肉,服務(wù)器端渲染(SSR)可以幫助你實(shí)現(xiàn)最佳的初始加載性能熏矿。
#服務(wù)器端渲染 vs 預(yù)渲染(SSR vs Prerendering)
如果你調(diào)研服務(wù)器端渲染(SSR)只是用來(lái)改善少數(shù)營(yíng)銷(xiāo)頁(yè)面(例如 /
, /about
, /contact
等)的 SEO,那么你可能需要預(yù)渲染离钝。無(wú)需使用 web 服務(wù)器實(shí)時(shí)動(dòng)態(tài)編譯 HTML票编,而是使用預(yù)渲染方式,在構(gòu)建時(shí)(build time)簡(jiǎn)單地生成針對(duì)特定路由的靜態(tài) HTML 文件卵渴。優(yōu)點(diǎn)是設(shè)置預(yù)渲染更簡(jiǎn)單慧域,并可以將你的前端作為一個(gè)完全靜態(tài)的站點(diǎn)。
如果你使用 webpack浪读,你可以使用 prerender-spa-plugin 輕松地添加預(yù)渲染昔榴。它已經(jīng)被 Vue 應(yīng)用程序廣泛測(cè)試 - 事實(shí)上,作者是 Vue 核心團(tuán)隊(duì)的成員碘橘。
#關(guān)于此指南
本指南專注于互订,使用 Node.js server 的服務(wù)器端單頁(yè)面應(yīng)用程序渲染。將 Vue 服務(wù)器端渲染(SSR)與其他后端設(shè)置進(jìn)行混合使用痘拆,是后端自身集成 SSR 的話題仰禽,我們會(huì)在 專門(mén)章節(jié) 中進(jìn)行簡(jiǎn)要討論。
本指南將會(huì)非常深入,并且假設(shè)你已經(jīng)熟悉 Vue.js 本身吐葵,并且具有 Node.js 和 webpack 的相當(dāng)不錯(cuò)的應(yīng)用經(jīng)驗(yàn)勇边。如果你傾向于使用提供了平滑開(kāi)箱即用體驗(yàn)的更高層次解決方案,你應(yīng)該去嘗試使用 Nuxt.js折联。它建立在同等的 Vue 技術(shù)棧之上粒褒,但抽象出很多模板,并提供了一些額外的功能诚镰,例如靜態(tài)站點(diǎn)生成奕坟。但是,如果你需要更直接地控制應(yīng)用程序的結(jié)構(gòu)清笨,Nuxt.js 并不適合這種使用場(chǎng)景月杉。無(wú)論如何,閱讀本指南將更有助于更好地了解一切如何運(yùn)行抠艾。
當(dāng)你閱讀時(shí)苛萎,參考官方 HackerNews Demo 將會(huì)有所幫助,此示例使用了本指南涵蓋的大部分技術(shù)检号。