vue服務(wù)端渲染操作簡(jiǎn)單入門實(shí)例分析
本文實(shí)例講述了vue服務(wù)端渲染操作。分享給大家供大家參考,具體如下:
想到要學(xué)習(xí)vue-ssr的同學(xué),自不必多說(shuō),一定是熟悉了vue,并且多多少少做過(guò)幾個(gè)項(xiàng)目。然后學(xué)習(xí)vue服務(wù)端渲染無(wú)非解決首屏渲染的白屏問(wèn)題以及SEO友好。
話不多說(shuō),筆者也是研究多日才搞明白這個(gè)服務(wù)端渲染到底是雜么回事?。?!
一,首先實(shí)現(xiàn)下官網(wǎng)的基本案例
隨便建一個(gè)目錄,然后執(zhí)行npm init初始化項(xiàng)目,生成工程文件package.json;創(chuàng)建server.js;然后按照vue-ssr官方鏈接:https://ssr.vuejs.org/zh/basic.html教程里面介紹的server.js,復(fù)制教程里面代碼,如下
const Vue = require('vue') const server = require('express')() const renderer = require('vue-server-renderer').createRenderer() server.get('*', (req, res) => { const app = new Vue({ data: { url: req.url }, template: `<div>訪問(wèn)的 URL 是: {{ url }}</div>` }) renderer.renderToString(app, (err, html) => { if (err) { res.status(500).end('Internal Server Error') return } res.end(` <!DOCTYPE html> <html lang="en"> <head><title>Hello</title></head> <body>${html}</body> </html> `) }) }) server.listen(8080)
顯然需要按照上面引入的依賴vue,express和vue-server-renderer,安裝完畢,在終端執(zhí)行,node server.js,打開瀏覽器,http://localhost:8080/,不出意外會(huì)是亂碼,因?yàn)楣倬W(wǎng)的返回的html字符串里面沒(méi)有 <meta charset="utf-8">,而加上這個(gè) 就好了。
當(dāng)然還可以引入一個(gè)模板文件,同樣是官網(wǎng)的案例,此時(shí)的server.js為
const Vue = require('vue') const server = require('express')() const renderer = require('vue-server-renderer').createRenderer({ template: require('fs').readFileSync('./index.template.html', 'utf-8') }) server.get('*', (req, res) => { const app = new Vue({ data: { url: req.url }, template: `<div>訪問(wèn)的 URL 是: {{ url }}</div>` }) renderer.renderToString(app, (err, html) => { if (err) { res.status(500).end('Internal Server Error') return } res.end(html) }) }) server.listen(8080)
模板文件index.template.html
<!DOCTYPE html> <html lang="en"> <head><title>Hello</title></head> <body> <!-- 下面這個(gè)注釋必須有 --> <!--vue-ssr-outlet--> </body> </html>
上面注釋根據(jù)官網(wǎng)教程,是vue注入的位置標(biāo)記。然后同樣執(zhí)行,node server.js就可以了。
是不是很簡(jiǎn)單,還可以創(chuàng)建一個(gè)對(duì)象來(lái)改變模板的標(biāo)題和meta,這個(gè)時(shí)候的server.js和模板文件代碼分別是
const Vue = require('vue') const server = require('express')() const renderer = require('vue-server-renderer').createRenderer({ template: require('fs').readFileSync('./index.template.html', 'utf-8') }) server.get('*', (req, res) => { const context = { title: 'hello', meta: ` <meta ...> <meta ...> `,url:req.url } const app = new Vue({ data: { url: req.url }, template: `<div>訪問(wèn)的 URL 是: {{ url }}</div>` }) renderer.renderToString(app, context,(err, html) => { if (err) { res.status(500).end('Internal Server Error') return } res.end(html) }) }) server.listen(8080)
<!DOCTYPE html> <html lang="en"> <head> <title>{{title}}</title> {{{meta}}} </head> <body> <!-- 下面這個(gè)注釋必須有 --> <!--vue-ssr-outlet--> </body> </html>
這里說(shuō)下我的理解,vue服務(wù)端渲染實(shí)際是一套代碼的兩次應(yīng)用,所謂的一套代碼就是拿出server.js外面去的vm實(shí)例,上面之所以簡(jiǎn)單是因?yàn)槲覀冊(cè)趕erver內(nèi)部創(chuàng)建的vm實(shí)例,一旦將vm拿出去,在server.js外部引入,那么涉及的就麻煩了。
這里分兩條線說(shuō),一個(gè)是在server.js外面創(chuàng)建一個(gè)app.js;結(jié)果是無(wú)法引入到server中;而這個(gè)也不是關(guān)注的重點(diǎn);
另一條線是使用vue-loader創(chuàng)建一個(gè)vm實(shí)例,然后引入到server中,整個(gè)vue渲染就在解決這個(gè)問(wèn)題,解決引入的問(wèn)題,解決引入之后與前端混合的問(wèn)題。下面貼上簡(jiǎn)單案例的實(shí)現(xiàn)代碼。
因?yàn)椴荒苤苯討?yīng)用.vue文件以及外部的js文件,所以需要借助webpack,借助webpack將vue實(shí)例,轉(zhuǎn)譯為node可用代碼,以及對(duì)前端代碼進(jìn)行轉(zhuǎn)譯。
二,以vue init webpack-simple vuessr0 為基礎(chǔ)的vue-ssr案例
1)用vue-cli也就是vue腳手架建了一個(gè)簡(jiǎn)單模板,命令:vue init webpack-simple vuessr0,相信對(duì)此都比較熟悉,建好后的結(jié)構(gòu)如下
之后改造一下,創(chuàng)建幾個(gè)文件app.js,entry-client.js,entry-server.js,創(chuàng)建build目錄,刪除自動(dòng)生成的webpack.config.js文件,改之后的目錄結(jié)構(gòu)為
各個(gè)文件的作用,entry-server.js將vm實(shí)例,轉(zhuǎn)譯為node可用代碼;
entry-client.js和傳統(tǒng)前端處理一致。
好吧,github鏈接地址為:https://github.com/mstzhen/vue-ssr;我實(shí)在有點(diǎn)懶了。
需要說(shuō)明的是,webpack將一份文件打包為兩份,前端入口文件的作用是掛載到id上面,后端入口文件以及后端文件負(fù)責(zé)注入。
首先安裝依賴:npm install
;
然后依次
npm run build:client npm run build:server npm run dev
8080端口訪問(wèn)即可。
最后,本文只是對(duì)vue服務(wù)端官網(wǎng)最簡(jiǎn)單那個(gè)實(shí)例的實(shí)現(xiàn)。沒(méi)有使用vue-router,沒(méi)有vuex,更沒(méi)有服務(wù)端數(shù)據(jù)請(qǐng)求。希望對(duì)正在學(xué)習(xí)vue服務(wù)端學(xué)習(xí)的小伙伴有所幫助。
錯(cuò)誤之處,請(qǐng)指出。
- 詳解vue服務(wù)端渲染(SSR)初探
- 詳解基于 Nuxt 的 Vue.js 服務(wù)端渲染實(shí)踐
- 基于vue-ssr服務(wù)端渲染入門詳解
- 詳解Vue基于 Nuxt.js 實(shí)現(xiàn)服務(wù)端渲染(SSR)
- 詳解如何使用Vue2做服務(wù)端渲染
- Vue服務(wù)端渲染和Vue瀏覽器端渲染的性能對(duì)比(實(shí)例PK )
- vue服務(wù)端渲染的實(shí)例代碼
- 詳解Nuxt.js Vue服務(wù)端渲染摸索
- Vue 2.0 服務(wù)端渲染入門介紹
- 詳解基于vue的服務(wù)端渲染框架NUXT
- vue服務(wù)端渲染添加緩存的方法
- vue服務(wù)端渲染頁(yè)面緩存和組件緩存的實(shí)例詳解
相關(guān)文章
使用命令行工具npm新創(chuàng)建一個(gè)vue項(xiàng)目的方法
Vue.js 提供一個(gè)官方命令行工具,可用于快速搭建大型單頁(yè)應(yīng)用。下面小編給大家分享使用命令行工具npm新創(chuàng)建一個(gè)vue項(xiàng)目的方法,需要的朋友參考下吧2017-12-12Vue.js基礎(chǔ)指令實(shí)例講解(各種數(shù)據(jù)綁定、表單渲染大總結(jié))
這篇文章主要為大家詳細(xì)介紹了Vue.js基礎(chǔ)指令實(shí)例,各種數(shù)據(jù)綁定、表單渲染大總結(jié),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Vue 創(chuàng)建組件的兩種方法小結(jié)(必看)
Vue 創(chuàng)建組件的方法有哪些呢?下面小編就為大家分享一篇Vue 創(chuàng)建組件的兩種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02vue+elementui 表格分頁(yè)限制最大頁(yè)碼數(shù)的操作代碼
這篇文章主要介紹了vue+elementui 表格分頁(yè)限制最大頁(yè)碼數(shù)的操作代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-08-08vue3在自定義hooks中使用useRouter報(bào)錯(cuò)的解決方案
這篇文章主要介紹了vue3在自定義hooks中使用useRouter報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08Vue自定義全局Toast和Loading的實(shí)例詳解
這篇文章主要介紹了Vue自定義全局Toast和Loading,需要的朋友可以參考下2019-04-04Vue實(shí)現(xiàn)彈出框點(diǎn)擊空白頁(yè)彈框消失效果
這篇文章主要介紹了VUE實(shí)現(xiàn)彈出框點(diǎn)擊空白頁(yè)彈框消失,實(shí)現(xiàn)方法可以在Vue中實(shí)現(xiàn)彈出框然后通過(guò)點(diǎn)擊空白頁(yè)面來(lái)讓彈窗隱藏,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Element?plus中el-input框回車觸發(fā)頁(yè)面刷新問(wèn)題以及解決辦法
在el-form表單組件中el-input組件輸入內(nèi)容后按下Enter鍵刷新了整個(gè)頁(yè)面,下面這篇文章主要給大家介紹了關(guān)于Element?plus中el-input框回車觸發(fā)頁(yè)面刷新問(wèn)題以及解決辦法,需要的朋友可以參考下2024-03-03vue中v-for循環(huán)數(shù)組,在方法中splice刪除數(shù)組元素踩坑記錄
這篇文章主要介紹了vue中v-for循環(huán)數(shù)組,在方法中splice刪除數(shù)組元素踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06