關于SSR的文章網上很多,一開始看得我云里霧里。然后去Vue.js 服務器渲染指南和nuxt官網看了看,發現文章大多都是搬運官網的內容,真正講的清晰明了的很少。所以想寫篇文章學習下SSR,希望能夠幫助大家快速理解Vue SSR。
什么是SSR?
SSR,即服務器渲染,就是在服務器端將對Vue頁面進行渲染生成html文件,將html頁面傳給瀏覽器。 優點:
可以從下面兩張圖來看,第一張圖是SSR生成的HTML頁面,第二種是傳統SPA生成的HTML頁面。
SSR
SPA
Nuxt.js
我看了官方 SSR 的介紹,也看了 Nuxt.js 的文檔。本質上來說 SSR 是node后端的操作行為,作為只想好好寫前端代碼的我,不想太折騰。而 Nuxt.js 非常完美地整合了 SSR 的功能。讓我們可以開箱即用~官方也推薦使用 Nuxt.js 來搭建 SSR 項目。
好處
我覺得 Nuxt.js 相比自己寫 SSR 有幾點好處。
安裝
安裝方法在此。很簡單,生成模板,然后npm安裝依賴,最后再運行。
簡單搬運下步驟吧。
// vue-cli 創建nuxt模板項目$ vue init nuxt-community/starter-template <project-name>// 安裝依賴項$ cd <project-name>$ npm install// 編譯并啟動服務$ npm run dev// 打開 http://localhost:3000
安裝遇到的問題:
由于 Nuxt.js 中使用了 async...await 語法,而低版本的 node 不支持這個語法,所以必須升級 node 到 7.0 版本之上~
然后建議不要使用cnpm,我用cnpm安裝運行老報錯,感覺有坑。
目錄結構
Nuxt.js 花了很大的篇幅講它的目錄結構,其實了解了目錄結構就了解了 Nuxt.js 的大概。Nuxt.js 幫我們配置好了所有東西,我們只需要按照它的要求在相應目錄下創建文件寫代碼即可。
Demo演示
好消息,VueStudyDemos又更新啦!歡迎Star~本文Demo已收入到VueStudyDemos中。
下面我們來簡單實現下各文件夾所提到的功能。
資源加載
我在 assets 文件夾下添加了 font-awesome 字體庫,在 static 文件夾中放了張 Vue 的 logo 圖片。然后對資源進行調用。
<i class="fa fa-address-book" aria-hidden="true"></i><img src="~/static/logo.png" />
這里需要將 font-awesome 的 css 變為全局 css,避免每個用到的頁面中都 import 字體庫的css。所以我們在 nuxt.config.js 中添加如下配置。
module.exports = { ... css: [ '~/assets/font-awesome/css/font-awesome.min.css' ], ...}
組件定義
組件存放在 components 文件夾下,這個我們講目錄的時候提到過。組件的用法和常用 vue 組件用法一致。 定義組件 Avatar,然后在 Page 頁面中使用。
<template> <avatar/></template><script>import avatar from '~/components/Avatar'export default { ... components: { avatar }};</script>
布局
在 layouts 目錄中,default 是默認布局。我們可以修改默認布局也可以新建布局來使用。
在布局文件中 </nuxt> 標簽是我們要服務器渲染的區域。
下面我們來創建個布局玩玩。
// layouts/page.vue<template><div> <mt-header fixed title="標題2"></mt-header> <nuxt/></div></template>
然后我們來使用布局,在 pages 頁面中配置 layout 選項(如果不配置默認就是 default)。
export default { ... layout: 'page' // 默認是 'default'};
中間件
所謂中間件,就是在兩個頁面跳轉之間執行的行為。比如我定義一個中間件 add.js
export default function ({ store }) { store.commit('increment')}
然后在 nuxt.config.js 中進行配置:
module.exports = { ... router: { middleware: 'add' }, ...}
這樣,在每次頁面跳轉的時候都會執行一次中間件方法了。當然,也可以單獨定義某個頁面的中間件,具體看官網啦~
頁面
頁面,就是在pages目錄下的 *.vue 文件,Nuxt.js 將目錄結構配置為 vue-router 路由系統,所以我們可以直接通過文件名來訪問到相應頁面(先不提特殊路由)。
比如 pages/app.vue 文件就可以通過 http://localhost:3000/app 來進行訪問。
注意:頁面組件寫法與常用 Vue 組件寫法相同,但 Nuxt.js 還提供了一些特殊配置項來配置服務器渲染過程中的行為。具體有啥配置請看 頁面文檔。
路由
路由就是使 pages 目錄能夠直接訪問的原因。Nuxt.js 非常巧妙地使用目錄結構和文件名稱將 vue-router 的各種用法都涵蓋進去了。如動態路由、嵌套路由等。具體可參考文檔。也可以看看demo的 pages 目錄。
插件
對于前端項目,插件的使用當然是必不可少的。官網上對這方面講的很清楚。我貼一下 demo 中的用法。這里用的是 mint-ui 庫。
// plugins/mint-ui.jsimport Vue from 'vue'import MintUI from 'mint-ui'import 'mint-ui/lib/style.css'Vue.use(MintUI)
// nuxt.config.jsmodule.exports = { build: { vendor: ['mint-ui'] }, plugins: [ '~plugins/mint-ui' ]}
這樣就可以使用第三方庫 mint-ui 啦!
<template> <div> <mt-navbar v-model="selected"> <mt-tab-item id="1">選項一</mt-tab-item> <mt-tab-item id="2">選項二</mt-tab-item> <mt-tab-item id="3">選項三</mt-tab-item> </mt-navbar> <!-- tab-container --> <mt-tab-container v-model="selected"> <mt-tab-container-item id="1"> <mt-cell v-for="n in 10" :key="n" :title="'內容 ' + n" /> </mt-tab-container-item> <mt-tab-container-item id="2"> <mt-cell v-for="n in 4" :key="n" :title="'測試 ' + n" /> </mt-tab-container-item> <mt-tab-container-item id="3"> <mt-cell v-for="n in 6" :key="n" :title="'選項 ' + n" /> </mt-tab-container-item> </mt-tab-container> </div></template>
vuex
對于 vuex,用法有兩種:普通方式和模塊方式,用法和我們常用的 vuex 一樣。我的demo中是直接復制官網的代碼。
需要注意的是,vuex 的數據會存在context對象中,我們可以通過context對象獲取狀態數據。
發布
發布有兩種方式服務器應用渲染部署和靜態部署,發布方式看這里
最后
去看 Nuxt.js 的 API,會發現 Nuxt.js 真的是高度封裝。對于 Nuxt.js 生成的模板項目,只有一些必要配置是需要我們去完成的。Nuxt.js 可以說是一個非常友好而強大的 SSR 框架了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答