詳解基于vue的服務(wù)端渲染框架NUXT
Nuxt
隨著現(xiàn)在vue和react的流行,許多網(wǎng)站都做成了SPA,確實提升了用戶體驗,但SPA也有兩個弱點,就是SEO和首屏渲染速度。為了解決單頁應(yīng)用的痛點,基于vue和react的服務(wù)端渲染應(yīng)運而生。由于公司的框架采用的是vue,所以就簡單的研究了一下基于vue的服務(wù)端渲染框架——NUXT。在vue的官網(wǎng)有關(guān)于服務(wù)端渲染的詳細(xì)介紹,而NUXT集成了利用Vue開發(fā)服務(wù)端渲染的應(yīng)用所需要的各種配置,也集成了Vue2、vue-router、vuex、vux-meta(管理頁面meta信息的),利用官方的腳手架,基本上是傻瓜式操作,不用寫路由配置,不用寫webpcak配置就可以跑起來一個基于服務(wù)端渲染的SPA。
Nuxt特性
NUXT的特性包括:
- 基于 Vue.js
- 自動代碼分層
- 服務(wù)端渲染
- 強大的路由功能,支持異步數(shù)據(jù)
- 靜態(tài)文件服務(wù)
- ES6/ES7 語法支持
- 打包和壓縮 JS 和 CSS
- HTML頭部標(biāo)簽管理
- 本地開發(fā)支持熱加載
- 集成ESLint
- 列表項目
- 支持各種樣式預(yù)處理器: SASS、LESS、 Stylus等等
Nuxt目錄結(jié)構(gòu)
通過vue init nuxt-community/starter-template <project-name>生成的文件目錄結(jié)構(gòu)如下:

其中有一些目錄(layouts、pages、static、store、nuxt.config.js、package.json)是Nuxt保留的,不可以更改,需要注意一下。
Nuxt路由
Nuxt中的一大特點就是路由無需手動配置,會根據(jù)pages下的文件路徑自動生成一套路由。如果路由中需要帶參數(shù),只需將pages下的文件已下劃線_作為前綴即可。例如pages下的目錄結(jié)構(gòu)如下:
pages/ --| user/ -----| index.vue -----| one.vue -----| _id.vue --| index.vue
Nuxt自動生成的路由配置為:
router: {
routes: [
{
name: 'index',
path: '/',
component: 'pages/index.vue'
},
{
name: 'user',
path: '/user',
component: 'pages/user/index.vue'
},
{
name: 'user-one',
path: '/user/one',
component: 'pages/user/one.vue'
},
{
name: 'users-id',
path: '/users/:id?',
component: 'pages/users/_id.vue'
},
]
}
而在vue文件中可以針對路由的參數(shù)進(jìn)行校驗,例如在pages/users/_id.vue文件中
export default {
validate ({ params }) {
// Must be a number
return /^\d+$/.test(params.id)
}
}
如果校驗方法返回的值不為 true, Nuxt 將自動加載顯示 404 錯誤頁面。而這個錯誤頁面需要寫在指定的位置,也就是layout中error頁面。接下來就來介紹有關(guān)視圖相關(guān)的東西。
Nuxt視圖
可以在layouts目錄下創(chuàng)建自定義的布局,可以通過更改 layouts/default.vue 文件來擴展應(yīng)用的默認(rèn)布局。需要在布局文件中添加 <nuxt/> 組件用于顯示頁面的主體內(nèi)容,感覺跟vue中的slot方法類似。例如在默認(rèn)布局中增加header和footer,這樣每個頁面都會加上header和footer。
<template> <div> <header>VUE SRR DEMO</header> <nuxt/> <footer>COPYRIGHT LXY</footer> </div> </template>
而上面說到的error頁面,可以通過在layouts下增加error.vue文件來修改默認(rèn)的錯誤頁面。該頁面可以接受一個error參數(shù)。
<template>
<div class="container">
<h1 v-if="error.statusCode === 404">頁面不存在</h1>
<h1 v-else>應(yīng)用發(fā)生錯誤異常</h1>
<p class="goback">
<nuxt-link to="/">返回首頁</nuxt-link>
</p>
</div>
</template>
<script>
export default {
props: ['error'],
layout: 'self-aside'
}
</script>
也可以給某個頁面指定特定的模板,做到個性化布局。例如在上面的error頁面中,我指定了一個self-aside的模板
以上所說的都是有關(guān)布局和路由相關(guān)的東西,而還沒有講到有關(guān)服務(wù)端渲染的知識,究竟 Nuxt 是如何做到SSR的呢,關(guān)鍵人物要出場了。
Nuxt asyncData 方法
Nuxt 擴展了 Vue.js,增加了一個叫 asyncData 的方法,使得我們可以在設(shè)置組件的數(shù)據(jù)之前能異步獲取或處理數(shù)據(jù)。這個函數(shù)可了不得了,有了它,我們可以先從服務(wù)員拿到數(shù)據(jù),在服務(wù)端解析好,拼成HTML字符串,返回給瀏覽器。
asyncData方法會在組件每次加載之前被調(diào)用,它可以在服務(wù)端或路由更新之前被調(diào)用。 可以利用 asyncData方法來獲取數(shù)據(jù),Nuxt 會將 asyncData 返回的數(shù)據(jù)融合組件 data 方法返回的數(shù)據(jù)一并返回給當(dāng)前組件。這個方法只能用在頁面組件中,在componets下在公共組件是不能調(diào)用該方法的,Nuxt 不會擴展增強該目錄下 Vue 組件。
因為 asyncData 方法是在組件 初始化 前被調(diào)用的,所以在方法內(nèi)是沒有辦法通過 this 來引用組件的實例對象。
async asyncData ({ params, error }) {
const { data } = await axios.get('https://jsonplaceholder.typicode.com/users')
return {
users: data.slice(0,5)
}
},
上面demo中asyncData返回的數(shù)據(jù)賦值給了users,這樣我就可以在頁面中像使用data里的數(shù)據(jù)一樣去使用users,例如我在template下循環(huán)出users
<ul>
<li v-for="item in users" :key="item.name">{{item.name}}</li>
</ul>
我現(xiàn)在去查看源代碼,發(fā)現(xiàn)頁面中l(wèi)i中的數(shù)據(jù)已經(jīng)渲染過來了,也就是達(dá)到了服務(wù)端渲染。

附一張Nuxt渲染的流程圖:

總結(jié)
整體感覺Nuxt還是很好上手的,利用腳手架,看看官方文檔,寫寫demo,大致就能了解整個流程。但其中的具體實現(xiàn)細(xì)節(jié),還需要去認(rèn)真看看 https://ssr.vuejs.org/zh/
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
打通前后端構(gòu)建一個Vue+Express的開發(fā)環(huán)境
這篇文章主要介紹了打通前后端構(gòu)建一個Vue+Express的開發(fā)環(huán)境,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
VUE v-model表單數(shù)據(jù)雙向綁定完整示例
這篇文章主要介紹了VUE v-model表單數(shù)據(jù)雙向綁定,結(jié)合完整實例形式分析了vue.js實現(xiàn)表單數(shù)據(jù)雙向綁定相關(guān)操作技巧,需要的朋友可以參考下2019-01-01
Vue對Element中的el-tag添加@click事件無效的解決
本文主要介紹了Vue對Element中的el-tag添加@click事件無效的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05

