vue服務(wù)端渲染(SSR)初探

前言

首先來講一下服務(wù)端渲染,直白的說就是在服務(wù)端拿數(shù)據(jù)進(jìn)行解析渲染,直接生成html片段返回給前端。具體用法也有很多種比如:

  • 傳統(tǒng)的服務(wù)端模板引擎渲染整個(gè)頁面
  • 服務(wù)渲染生成htmll代碼塊, 前端 AJAX 獲取然后js動態(tài)添加

服務(wù)端渲染的優(yōu)劣

首先是seo問題,前端動態(tài)渲染的內(nèi)容是不能被抓取到的,而使用服務(wù)端渲染就可以解決這個(gè)問題。還有就是首屏加載過慢這種問題,比如在SPA中,打開首頁需要初始加載很多資源,這時(shí)考慮在首屏使用服務(wù)端渲染,也是一種折中的優(yōu)化方案。但是使用SSR時(shí),勢必會增加服務(wù)器的壓力,還有可能會需要前后端同構(gòu),使用同樣的模板引擎,這似乎與前后端分離的觀點(diǎn)又是矛盾的。廢話就說到這里,下面來看一下vue框架中的服務(wù)器渲染。

vue-server-renderer

vue-server-renderer就是vue中處理服務(wù)端加載的一個(gè)模塊了,官方文檔:https://ssr.vuejs.org/en/,暫時(shí)沒有中文版的,我也只是稍微看了一些,然后寫了一個(gè)簡單的demo。首先新建一個(gè)test.js文件,并用npm安裝依賴express、vue、vue-server-renderer。引入vue-server-renderer之后,然后新建一個(gè)temp.html作為渲染的基本模板,用createRenderer方法新建一個(gè)render實(shí)例,這里我傳入temp.html作為renderer的template的參數(shù),在后面渲染時(shí)就會以這個(gè)temp.html作為基礎(chǔ)模板。

const renderer = require('vue-server-renderer').createRenderer({
    template: require('fs').readFileSync('./temp.html', 'utf-8')
})

temp.html:

<!DOCTYPE html><br><html lang="en"><br><head><title>{{title}}</title></head>
  <body>
    <!--vue-ssr-outlet-->
  </body>
</html>

接下來隨便定義一些渲染用的數(shù)據(jù),然后用express新建一個(gè)node服務(wù)器,再定義一個(gè)vue的實(shí)例。然后再調(diào)用renderer的renderToString方法來渲染生成html,渲染成功后返回給客戶端。

const Vue = require('vue')
const server = require('express')()
const context = {
  title: 'hello'
}
const mocktitle = '我愛吃的水果'
const mockdata = ['香蕉', '蘋果', '橘子']
server.get('*', (req, res) => {
  const app = new Vue({
    data: {
      url: req.url,
      data: mockdata,
      title: mocktitle
    },
    template: `<div>The visited URL is: {{ url }}
    <h3>{{title}}</h3>
    <p v-for='item in data'>{{item}}</p>
    </div>`
  })
  renderer.renderToString(app, context, (err, html) => {
    if (err) {
      res.status(500).end('Internal Server Error')
      return
    }
    res.end(html)
  })
})
server.listen(8080)

注意這里渲染的數(shù)據(jù)有兩種,mockdata是作為vue實(shí)例的data來渲染在實(shí)例模板中的,而context是作為基礎(chǔ)模板的data來渲染temp.html的。可以看到在服務(wù)端用vue進(jìn)行渲染的規(guī)則和前端渲染時(shí)一樣,v-for、v-if等都可以正常使用。最后命令行輸入node test.js,然后在瀏覽器打開http://localhost:8080 查看結(jié)果如下:

示例.png

可以看到服務(wù)端直接返回了一個(gè)渲染完成的Doc,示例demo到此結(jié)束。

結(jié)語

服務(wù)端渲染還是客戶端渲染的問題,個(gè)人覺得還是要針對具體業(yè)務(wù)場景然后再做選擇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在實(shí)現(xiàn) egg + vue 服務(wù)端渲染工程化實(shí)現(xiàn)之前,我們先來看看前面兩篇關(guān)于Webpack構(gòu)建和Egg的文章: ...
    hubcarl閱讀 6,145評論 0 19
  • 轉(zhuǎn)載 :OpenDiggawesome-github-vue 是由OpenDigg整理并維護(hù)的Vue相關(guān)開源項(xiàng)目庫...
    果汁密碼閱讀 23,420評論 8 124
  • 沈華立,天貝車業(yè),盛和塾224期學(xué)員,【日精打卡第137天】 《六項(xiàng)精進(jìn)》1遍共235遍 《大學(xué)》1遍共235遍 ...
    沈華立閱讀 145評論 0 0
  • 我 : 好久沒吃火鍋了,好想吃?。?你 : 你來我這里我請你吃??! 我 : 你為什么要對我這么好? 你 : 你傻不...
    白山己閱讀 279評論 0 2
  • 夜色中,寒風(fēng)吹過,樹上的葉子還沒有落盡,它們還在瑟瑟地顫抖著不肯離去。 路邊LED大屏幕閃爍著艷麗的色彩,把樹葉一...
    紫色人生閱讀 314評論 2 0

友情鏈接更多精彩內(nèi)容