Vuejs基礎(chǔ)與應(yīng)用開發(fā)實戰(zhàn)(微課版) 單元9教案_第1頁
Vuejs基礎(chǔ)與應(yīng)用開發(fā)實戰(zhàn)(微課版) 單元9教案_第2頁
Vuejs基礎(chǔ)與應(yīng)用開發(fā)實戰(zhàn)(微課版) 單元9教案_第3頁
Vuejs基礎(chǔ)與應(yīng)用開發(fā)實戰(zhàn)(微課版) 單元9教案_第4頁
Vuejs基礎(chǔ)與應(yīng)用開發(fā)實戰(zhàn)(微課版) 單元9教案_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

《Vue.Js基礎(chǔ)與應(yīng)用開發(fā)實戰(zhàn)(微課版)》配

套教學(xué)教案

單元

課時內(nèi)容服務(wù)器端渲染授課時間課時4

?區(qū)分服務(wù)器端渲染和客戶端渲染

?手動搭建項目實現(xiàn)簡單的服務(wù)器端渲染

?使用Nuxtjs框架實現(xiàn)服務(wù)器端渲染

教學(xué)目標(biāo)?認(rèn)知Vuc-SSR的工作原理

?能創(chuàng)建一個簡單的vue-ssr服務(wù)器端洎染項目、創(chuàng)建vue-cli改造而成的vue-

ssr服務(wù)器端渲染項目、基于Nuxt.js創(chuàng)建一個服務(wù)器端渲染應(yīng)用——旅游網(wǎng)

教學(xué)重點使用Nuxt.js框架實現(xiàn)服務(wù)器端渲染

教學(xué)難點使用Nuxtjs框架實現(xiàn)服務(wù)器端渲染

1.教學(xué)思路:先介紹服務(wù)器端渲染的概念,然后講解借助vue-server-rcndercr模塊手動

教學(xué)設(shè)計搭建項目實現(xiàn)簡的的服務(wù)器端渲染,最后講解使用Nuxt.js框架實現(xiàn)服務(wù)器端渲染。

2.教學(xué)手段:多媒體展示+軟件操作。

教學(xué)內(nèi)容

9.1區(qū)分服務(wù)器端渲染和客戶端渲染

為了更好地理解服務(wù)器端渲染,下面介紹幾個常用的概念。

①數(shù)據(jù)。通常來自數(shù)據(jù)庫或者笫三方服務(wù)等,例如用戶的信息、訂單詳情等。數(shù)據(jù)使用某些數(shù)據(jù)格式來

存儲和傳輸,例如JSON、XML、數(shù)組、MAPWo

②模板。一個頁面的基本輪廓和展示,模板定義了某個元素顯示在什么位置。例如,PHP/JSP就是模板

語言,還有很多的模板引擎,包括Smarty、Jad、JSX等。

③頁面。為了簡化后面的說明,把頁面狹義地定義為HTMLo

再引入一個公式:頁面=模板+數(shù)據(jù)。

上面加號的意思并不是加法,而是渲染(Render),渲染就是將模板和數(shù)據(jù)拼裝成HTML頁面。

④服務(wù)器端渲染。渲染過程在服務(wù)器端完成,最終的渲染結(jié)果HTML字符串通過HTTP發(fā)送給客戶端。

對干客戶端而言,只是看到了最終的HTML頁面,看不到數(shù)據(jù).也看不到模板°服務(wù)器端先調(diào)用數(shù)據(jù)庫,獲得

數(shù)據(jù)之后,將數(shù)據(jù)和頁面元素進(jìn)行拼裝,組合成完整的HTML頁面,再直接返回給瀏覽器,以便用戶瀏覽。

⑤客戶端渲染??蛻舳苏埱箜撁鏁r,服務(wù)器端把模板和數(shù)據(jù)發(fā)送給客戶端,通過請求JavaScnpt、CSS

等,在客戶端進(jìn)行渲染。

Vue是構(gòu)建客戶端應(yīng)用程序的框架。默認(rèn)情況下,可以在瀏覽器中輸出Vue組件,以生成DOM和操作

DOMo也可以將同一個組件渲染為服務(wù)器端的HTML字符串,將它們直接發(fā)送到瀏覽器,最后將這些靜態(tài)標(biāo)

記混合在客戶端上完全可交互的應(yīng)用程序中。

9.1.1熟知基本概念

在互聯(lián)網(wǎng)早期,前端頁面都是一些簡單的頁面。前端頁面都是后端將HTML拼接好,然后將它返回給前端

完整的HTML文件。瀏覽器獲取這個HTML文件之后就可以直接顯示了,這就是所謂的服務(wù)器端渲染。典型

的有通過“Java+Vek)city”“Node+Jade”進(jìn)行HTML模板拼接及渲戮。隨著前端頁面的復(fù)雜性越來越高,前端

的作用就不僅是頁面展現(xiàn)了,還有可能需要添加更多有復(fù)雜功能的組件。

隨著AJAX的興起,逐漸出現(xiàn)前端開發(fā)這個行業(yè),前后端分禹變得越來越重要。這個時候,后端就不提供

完整的HTML頁面,而是提供一些API接口.返回一些JSON數(shù)據(jù),前端拿到該JSON數(shù)據(jù)之后再使用HTML

對數(shù)據(jù)進(jìn)行拼接,然后展現(xiàn)在瀏覽器中,這種方式就是客戶端渲染。由此可見,前端專注于UI的開發(fā),后端

專注于邏輯的開發(fā)。

1.同構(gòu)

服務(wù)器端渲染的Vue應(yīng)用程序也可以被認(rèn)為是“同構(gòu)”或“通用”因為應(yīng)用程序的大部分代碼都可以在服務(wù)

器端和客戶端上運行,即同一套代碼既可以在服務(wù)器端渲染,也可以在客戶端渲染。當(dāng)首次訪問時,換言之,

當(dāng)訪問首屏頁面時,使用服務(wù)器謊渲染,返回已經(jīng)渲染完成的最終HTML頁面,這樣就同時解決了首屏白屏問

題和SE。問題。首屏頁面訪問完成后,當(dāng)再進(jìn)行交互時,則使用客戶端渲染,HTML、CSS、JavaScript等資

源都不需要再重新請求,只需要通過AJAX、WebSocket等途徑獲取數(shù)據(jù),在客戶端完成渲染過程。

一個服務(wù)器端渲染的同構(gòu)Web應(yīng)用架構(gòu)示意圖如圖所示。得益于Node.js的發(fā)展與流行,JavaScript成

為一門同構(gòu)語售,這意味著只需要編寫一套代碼,就可以同時在客戶端與服務(wù)器端執(zhí)行。

客戶端

JavaScriptCSS

,公共組件7__API

(React.Redux)X**(Java,PHP.Node)

HTML服務(wù)器端/

(Node),

-J,

一個服務(wù)器端渲染的同構(gòu)Web應(yīng)用架構(gòu)示意圖

2.前端渲染

前端渲染的方式起源于JavaScript的興起,AJAX更是讓前端渲染更加成熟,前端渲染真正意義上實現(xiàn)了

前后端分離,前端只專注于UI的開發(fā),后端只專注于邏輯的開發(fā)。前后端交互只通過約定好的API來交互,

后端提供JSON數(shù)據(jù),前端循環(huán)JSON生成DOM插入頁面中去。

下面以Vue為例進(jìn)行說明。生產(chǎn)環(huán)境的頁面的HTML源代碼如下:

<!DOCTYPEhtml>

<htmllang="en">

<head>

<metacharset="UTF-8">

<title>Vue</title>

</head>

<body>

<divid="app"></div>

<scripttype="text/javascript'src="xxx.js"></script>

<scripttype=,'text/javascript'src="yyy.js"></script>

<scripttype-"text/javascripfsrc",'zzz.js"></script>

</body>

</html>

這個就是瀏覽器從服務(wù)器端獲取到的HTML文件。這里只有<divid="app"></div>入口,以及引入一系列

的JavaScript文件。其實,用戶看到的頁面就是由這些JavaScript代碼渲染出來的,這就是前端渲染。

3.客戶端渲染

客戶端渲染(ClientSideRender,CSR)即傳統(tǒng)的SPA模式,Vue構(gòu)建的應(yīng)用程序默認(rèn)情況下是一個

HTML模板頁面,只有一個id為app的<div>根容器,然后通過webpack打包生成CSS、JavaScriot等資源

文件,瀏覽器再加載、解析來渲染HTMLo

客戶端渲染的數(shù)據(jù)是由瀏覽器通過AJAX請求動態(tài)取得的,再通過JavaScript文件將數(shù)據(jù)填充我DOM元

素并最終展示到網(wǎng)頁中。頁面上的內(nèi)容是加載的JavaScript文件渲染出來的,JavaScript文件運行在瀏覽器上

面,服務(wù)器端只返回一個HTML模板。

①客戶端渲染模式下,服務(wù)器端把渲染的靜態(tài)文件發(fā)送給客戶端,客戶端獲取服務(wù)器端發(fā)送過來的文件

后再運行一遍JavaScript代碼,根據(jù)JavaScript代碼的運行結(jié)果,生成相應(yīng)DOM,然后渲染給用戶。

②HTML僅作為靜態(tài)文件,客戶端在請求時,服務(wù)器端不做任何處理,直接以原文件的形式返回給客戶

端,然后根據(jù)HTML上的JavaScript文件生成DOM插入HTMLo

客戶端渲染模式下一般使用的是webpack-dev-server插件,它可以幫助用戶自動開啟一個服務(wù)器端,其

主要作用是監(jiān)控代碼并打包,也可以配合webpack-hot-middleware來進(jìn)行熱更替(HMR),這樣能提高開發(fā)

效率。

4.服務(wù)器端渲染

服務(wù)器端渲染顧名思義就是將頁面或者組件通過服務(wù)器生成HTML字符串,然后將它們直接發(fā)送到瀏覽

器,最后將靜態(tài)標(biāo)記“混合”到客戶端上完全可交互的應(yīng)用程序中。整個渲染過程是在服務(wù)器端執(zhí)行的,瀏覽器

只負(fù)責(zé)展示,即頁面上的內(nèi)容是通過服務(wù)器端渲染生成的,瀏覽器直接顯示服務(wù)器端返回的HTML就可以了。

也就是說,網(wǎng)頁的HTML一般是后端服務(wù)器通過模板引擎渲染好后再交給前端的。

服務(wù)器端渲染的模式下,當(dāng)用戶第一次請求頁面時,由服務(wù)器犯需要的組件或頁面渲染成HTML字符串,

然后把它返回給客戶端??蛻舳双@取的內(nèi)容是可以直接渲染然后呈現(xiàn)給用戶的HTML內(nèi)容,不需要為了生成

DOM內(nèi)容自己再去運行一遍JavaScript代碼。使用服務(wù)器端渲染的網(wǎng)站,可以說是“所見即所得”,頁面上呈

現(xiàn)的內(nèi)容在HTML源文件里也能找到。

Vue-SSR利用Node.js搭建頁面渲染服務(wù),在服務(wù)器端完成頁面的渲染(把以前需要在客戶端完成的頁

面渲染放在服務(wù)器端來完成),便于輸出SEO更友好的頁面。

Vue進(jìn)行服務(wù)器端渲染時,需要利用Node.js搭建一個服務(wù)器,并添加服務(wù)器端渲染的代碼邏輯。它使用

webpack-dev-middleware中間件對更改的文件進(jìn)行監(jiān)控,使用wbpack-hot-middleware中間件進(jìn)行頁面的熱更

新,使用vue-server-rendrere插件來渲染服務(wù)器端打包的bundle文件到客戶端。

5.服務(wù)器端渲染和客戶端渲染的區(qū)別

服務(wù)器端渲染和客戶端的渲染的本質(zhì)區(qū)別是誰來渲染HTML頁面,如果HTML頁面在服務(wù)器端那邊拼接

完成,那么它就是服務(wù)器端渲染,而如果是前端做的HTML拼接及渲染的話,那么它就屬于客戶端渲染的。

其實前后端的渲染本質(zhì)是一樣的,都是字符串的拼接,將數(shù)據(jù)渲染進(jìn)一些固定格式的HTML代照中,形成

最終的HTML代碼展示在用戶頁面上。因為字符串的拼接必然會損耗一些資源,如果在服務(wù)器端渲染,那么消

耗的就是服務(wù)器端的資源。如果是在客戶端渲染,常見的手段是直接生成DOM插入HTML中,或者是使用一

些前端的模板引擎等。它們初次渲染的原理大多是將原HTML中的數(shù)據(jù)標(biāo)記(例如{{text}})替換掉。

在前后端分離的項目中,前端部分需要先加載靜態(tài)資源,再采用異步的方式去獲取數(shù)據(jù),最后來渲染頁面。

其中,在獲取靜態(tài)資源和異步獲取數(shù)據(jù)階段,頁面上是沒有數(shù)據(jù)的,這將會影響首屏的渲染速度和年戶體驗。

服務(wù)器端渲染解析HTML模板的工作是交給服務(wù)器完成的,客戶端只需要解析標(biāo)準(zhǔn)的HTML頁面即可,

取內(nèi)容的,則需要使用服務(wù)器端渲染來解決此問題。

8.怎么判斷一個網(wǎng)站是不是服務(wù)器端渲染

打開一個網(wǎng)站的首頁,然后查看網(wǎng)頁源代碼,可以看到與網(wǎng)頁內(nèi)容相關(guān)的HTML代碼,則就是服務(wù)器端渲

染的。例如Vue官網(wǎng)(網(wǎng)址為/)就屬于服務(wù)器端渲染,HTML內(nèi)容都是服務(wù)器端拼接完成

后返回到客戶端的。

能看到與網(wǎng)頁內(nèi)容相關(guān)的HTML代碼,且大部分代碼加載的是JavaScript文件則就是客戶端渲染,例如

http://h5.ele.me/msite/這個網(wǎng)站就是客戶端渲染,頁面內(nèi)容都是由JavaScript動態(tài)渲染的。

9.使用服務(wù)器端渲染需要權(quán)衡之處

使用服務(wù)器端渲染時還需要考慮以下問題。

(1)開發(fā)條件所限

一些瀏覽器特定的代碼只能在某些生命周期鉤子函數(shù)中使用;一些外部擴(kuò)展庫(ExternalLibrary)可能需

要特殊處理,才能在服務(wù)器端渲染應(yīng)用程序中運行。

(2)涉及構(gòu)建和部署的更多要求

與可以部署在任何青爭態(tài)文件服務(wù)器上的完全靜態(tài)SPA程序不同,服務(wù)器端渲染應(yīng)用程序需要處于Node.js

Server運行環(huán)境中。

(3)更多的服務(wù)器端負(fù)載

在Node.js中渲染完整的應(yīng)用程序顯然比僅提供靜態(tài)文件的Server更加占用CPU資源,因此如果能預(yù)料

在高流量環(huán)境下使用,則需準(zhǔn)備相應(yīng)的服務(wù)器端負(fù)載,并明智地采用緩存策略。

10.預(yù)渲染(Prerendering)

如果使用服務(wù)器端渲染只是用來改善少數(shù)營銷頁面(例如關(guān)于我們頁面、聯(lián)系我們頁面等)的SEC,那么使

用預(yù)渲染就可以了。無須使用Web服務(wù)器實時動態(tài)編譯HTML,而是使用預(yù)渲染方式,在構(gòu)建時簡單地生成

針對特定路由的靜態(tài)HTML文件。這樣做的優(yōu)點是設(shè)置預(yù)渲染更簡單,并可以將前端作為一個完全靜態(tài)的站

點O

如果使用webpack,可以使用prerender-spa-plugin輕松地添加預(yù)渲染,它己經(jīng)被Vue應(yīng)用程序廣泛應(yīng)

用。

9.1.2認(rèn)知vue-router(前端路由)的兩種路由模式

vue-router有hash模式和history模式兩種路由模式,默認(rèn)是hash模式。

1.hash模式

hash也稱為錨點,其本身是用來做頁面定位的,它可以使對應(yīng)的id元素顯示在可視區(qū)域。hash模式是指

URL中會自帶#號,例如http://localhosV#/logino其中加login就是hash值,雖然#出現(xiàn)在URL中,但不會被

包括在http請求中,對后端完全沒有影響,因此改變hash不會被重新加載頁面。

hash值的變化不會導(dǎo)致瀏覽器向服務(wù)器發(fā)出請求,而hash改變(只改變#后面的URL片段)則會觸發(fā)

hashchange事件。hash發(fā)生變化都會被瀏覽器記錄下來,從而可以使用瀏覽器的前進(jìn)和后退按鈕。

2.history模式

history模式是指URL中不會自帶#號,看起來比較美觀一些,例如http://localhost/loginohistcry模式利

用history.pushState來完成URL跳轉(zhuǎn)而無須重新加載頁面。由于hash模式路由屬于前端路由,無法提交到服

務(wù)器,因此服務(wù)器端渲染的路由需要使用history模式。

9.2手動搭建項目實現(xiàn)簡單的服務(wù)器端渲染

本節(jié)借助vue-server-renderer模塊手動搭建項目實現(xiàn)簡單的服務(wù)器端渲染。

9.2.1了解vue-server-renderer的作用及基本語法

在Vue中使用服務(wù)器端渲染,需要借助Vue的擴(kuò)展模塊vue-server-renderer,執(zhí)行以下命令安裝vue-server-

「enderer模塊:

npminstallvue-server-renderervue-save

執(zhí)行以下命令也可以安裝指定版本的vue-server-renderer?模塊:

npminstallvue-server-renderer02.6.x-save

vue-server-renderer模塊的主要功能是處理服務(wù)器加載,給Vue提供在Node.js服務(wù)器端渲染的功能v

1.createRenderer。方法

該方法用于創(chuàng)建一個renderer實例,例如:

constrenderer=require('vue-server-renderer').createRenderer();

2.renderer.renderToString(vm,cb)方法

該方法的作用是將Vue實例呈現(xiàn)為字符串,該方法的回調(diào)函數(shù)是一個標(biāo)準(zhǔn)的Node.js回調(diào)函數(shù),它接收錯

誤作為第一個參數(shù)。示例代碼如下。

【示例】demo01-vue-ssr

保存文件renderer.js,然后在命令行中執(zhí)行noderenderer.js命令,輸出結(jié)果如下:

<divdata-server-rendered="true,'>Goodluck</div>

<divdata-server-rendered="true">Goodluck</div>

可以看到,在div中有一個特殊的屬性data-server-rendered,該屬性的作用是告訴Vue這是服務(wù)器端渲

染的元素,并且應(yīng)該以激活的模式進(jìn)行掛載。

3.createBundleRenderer(code,[rendererOptions])方法

Vue-SSR依賴包vue-server-render,它的調(diào)用支持兩種格式:createRenderer。方法和

createBundleRenderer()方法createRenderer。方法是以vue組件為入口的,而createBundleRenderer()方法以打包后

的JavaScript文件或JSON文件為入口。所以createbundleRencerer。方法的作用和createRenderer。方法

的作用是一樣的,無非就是支持的人口文件不一樣而已。

下面的代碼是createBundleRenderer()方法的使用實例。

【示例】demo02-vue-ssr

項目文件夾demo02-vue-ssr中的renderer.js文件的代碼如下:

constcreateBundleRenderer=require('vue-server-renderer').create6undleRenderer;

//絕對文件路徑

letrenderer=createBundleRenderer('./package.json');

console.log(renderer);

將以上代碼保存為renderer.js文件,在命令行中執(zhí)行noderenderer.js命令,輸出結(jié)果如下:

(

renderToString:[Function:renderToString],

renderToStream:[Function:renderToStream]

)

可以看到,該方法也同樣有renderToStringO^flrenderToStream。兩個方法。

9.2.2直接編寫代碼將Vue實例渲染為HTML

【實例9?1】在vue?ssr項目中編寫代碼將Vue實例渲染為HTML

【操作要求】

創(chuàng)建vue-ssr項目01-vue-ssr,在該項目中直接編寫代碼將Vue實例渲染為HTML?

【實現(xiàn)過程】

1.創(chuàng)建vue-ssr項目

在指定文件夾下,在命令行中執(zhí)行以下命令創(chuàng)建一個vue-ssr項目01-vue-ssr:

mkdir01-vue-ssr

cd01-vue-ssr

2.項目初始化

在命令行中執(zhí)行以下命令:

npminit-y

成功執(zhí)行上述命令后,會在文件夾01-vue-ssr中生成一個package.json文件。

3.創(chuàng)建服務(wù)器腳本文件serverjs

vue-server-renderer成功安裝后,創(chuàng)建服務(wù)器腳本文件server.js,實現(xiàn)將Vue實例的渲染結(jié)果輸出到控

制臺界面中。

(1)創(chuàng)建一個Vue實例

constVue=require('vue')

constapp=newVue({

template:*<div>Goodluck</div>'

})

(2)創(chuàng)建一個renderer

constrenderer=requirefvue-server-renderer^.createRendererO

(3)將Vue實例渲染為HTML

renderer.renderToString(app,(err,html)=>{

if(err)throwerr

console.log(html)

))

4.執(zhí)行運行腳本文件的命令

在命令行中執(zhí)行以下命令:

nodeserver.js

成功執(zhí)行該命令后,命令行中輸出以下內(nèi)容:

<divdata-server-rendered="true">Goodluck</div>

從輸出結(jié)果可以看出,在<dir>標(biāo)簽中添加了一個特殊的屬性data-server-rendered,該屬性告訴客戶端的

Vue標(biāo)簽是由服務(wù)器端演染的。vue-server-renderer的作用是將Vue實例渲染成HTML結(jié)構(gòu)。

9.2.3使用Express框架搭建服務(wù)器端渲染

FxprRss是一個基于Nedajs平臺的Wfth庖用開發(fā)框架,用來快速開發(fā)Web庖用程序。

【實例9-2]在vue-ssr項目中使用Express框架搭建服務(wù)器端渲染

【操作要求】

創(chuàng)建vue-ssr項目02-vue-ssr,在該項目中使用Express框架搭建服務(wù)器端渲染。

【實現(xiàn)過程】

1.創(chuàng)建vue-ssr項目

在指定文件夾下,在命令行中執(zhí)行以下命令創(chuàng)建一個vue-ssr項目02-vue-ssr:

mkdir02-vue-ssr

cd02-vue-ssr

2.項目初始化

在命令行中執(zhí)行以下命令:

npminit-y

成功執(zhí)行上述命令后,會在文件夾02-vue-ssr中生成一個package.json文件。

3.創(chuàng)建template.html文件

在剛創(chuàng)建的Vue項目中創(chuàng)建template.html文件,編寫模塊頁面。template.html文件的代碼如下:

<!DOCTYPEhtml>

<html>

<head><title>輸出當(dāng)前位假</litle></head>

<body>

<!-vue-ssr-outlet->

</body>

</html>

上述代碼中,注釋<!--vue-ssr-outlet-,是HTML注入的位置,該注釋不能刪除,否則會報錯。

4.使用Express框架實現(xiàn)服務(wù)器端渲染

(1)在vue-ssr項目中安裝Express框架

在命令行中執(zhí)行以下命令安裝Express框架:

npminstallexpress-save

在命令行中執(zhí)行以下命令安裝指定版本的Express框架:

npminstallexpress@4.17.x-seve

(2)創(chuàng)建server.js文件

在項目根文件夾02-vue-ssr口創(chuàng)建server.js文件,在該文件中編寫下表所示的代碼。

項目根義件夾02-vue-ssr中server.js文件的代碼

序號代碼

01//創(chuàng)建Vue實例

02constVue=require('vue')

03constserver=requirefexpress')()

04//讀取模板

05constrenderer=require('vue-server-renderer').createRenderer({

06template:requireCfs'J.readFileSyncC./template.html','utf-8')

07})

08constcontext={

09title:'vuessr1,

10metas:"

11<metaname="keyword,'content="vue,ssr">

12<metaname="description"content="vuesrrdemo">

13

14}

15//處理GET方式請求

16server.get('*',(req,res)=>{

17rGS.SGt({'Cont?nt-TypQ':'text/html;charsGt=utf-8'})

18constvm=newVue({

19data:{

20url:req.url

21},

22〃使用兩對大括號進(jìn)行HTML轉(zhuǎn)義插值

23template:、<div>當(dāng)前訪問的URL是:{{url}}</div>\

24})

25//將Vue實例渲染為HTML后輸出

26renderer.renderToString(vm,context,(err,html)=>{

27if(err){

28res.status(500i.end('err:'+err)

29return

30)

31res.end(html)

32))

33})

34server.listen(3000,function(){

35console.Iog('serverstartedatlocalhost:3000')

36!)

代碼第06行使用了一個頁面模板template.html,當(dāng)渲染Vue應(yīng)用程序時,renderer只從應(yīng)用程序生成

HTML標(biāo)記(Markup、本示例中,必須用一個額外的HTML頁面包裹容器來包裹生成的HTML標(biāo)記。為了簡

化這些,可以直接在創(chuàng)建renderer時提供一個頁面模板。大多數(shù)時候,會將頁面模板放在特有的文件中,例如

template.html,該頁面模板的代碼如前所述。

表9-2的第26行代碼通過傳入一個'渲染上下文對象”,作為renderToString()函數(shù)的第2個參數(shù)來提供插值數(shù)

據(jù)。也可以與Vue應(yīng)用程序?qū)嵗蚕韈ontext對象,允許模板插值中的組件動態(tài)地注冊數(shù)據(jù)。

(3)執(zhí)行啟動服務(wù)器的命令

在命令行中執(zhí)行以下命令啟動服務(wù)器:

nodeserver.js

成功執(zhí)行上述命令后,打開瀏覽器,在地址欄中輸入“http://localhost:3000/",按【Enter】鍵,頁面顯示“當(dāng)

前位置:心

在瀏覽器中查看源代碼如下:

<!DOCTYPEhtml>

<html>

<head>vtitle>輸出當(dāng)前位置v/1itle>〈/head>

<body>

<divdata-server-rendered='true">?:/</div>

</body>

</html>

從以上代碼可以看出,data-server-rendered屬性的值為true,說明當(dāng)前頁面是服務(wù)器端渲染后的結(jié)果。

9.2.4使用Koa框架搭建服務(wù)器端渲染

Koa是一個基于Node.js平臺的Web開發(fā)框架,Koa框架能幫助開發(fā)者快速地編寫服務(wù)器應(yīng)用程序,通

過async()函數(shù)很好地處理異步的邏輯,有力地增加錯誤處理能力。

【實例9-3]在vue-ssr項目中使用Koa框架搭建服務(wù)器端渲染

【操作要求】

創(chuàng)建vue-ssr項目03-vue-ssr,在該項目中使用Koa框架搭建服務(wù)器端渲染。

【實現(xiàn)過程】

1.創(chuàng)建vue-ssr項目

在指定文件夾下,在命令行中執(zhí)行以下命令創(chuàng)建一個vue-ssr項目03-vue-ssr:

mkdir03-vue-ssr

cd03-vue-33r

2.項目初始化

在命令行中執(zhí)行以下命令:

npminit-y

成功執(zhí)行上述命令后,會在文件夾03-vue-ssr中生成一個package.json文件。

3.創(chuàng)建template.html文件

在剛創(chuàng)建的Vue項目中創(chuàng)建1emplate.html文件,編寫模塊頁面。template.html文件的代碼如下:

<!DOCTYPEhtml>

<html>

<head><title>輸出當(dāng)前位置</1itle></head>

<body>

<!-vue-ssr-outlet->

</body>

</html>

上述代碼中,)ifl<!-vue-ssr-outlet->MHTML注入的位置,該注釋不能刪除,否則會報錯。

4.使用Koa框架實現(xiàn)服務(wù)器端渲染

使用Koa框架實現(xiàn)服務(wù)器端演染的過程與代碼編寫如下:

(1)在vue-ssr項目中安裝Koa框架

在命令行中執(zhí)行以下命令安裝Koa框架:

npminstallkoa@2.8.x-save

(2)創(chuàng)建server.js文件

(3)執(zhí)行啟動服務(wù)器的命令

在命令行中執(zhí)行以下命令啟動服務(wù)器:

nodeserver.js

成功執(zhí)行上述命令后,打開瀏覽器,在地址欄中輸入“http:〃localhost:8080/“,按【Enter】鍵,頁面顯示“當(dāng)

前位置:r0

9.3使用Nu戲js框架實現(xiàn)服務(wù)器端渲染

Nuxt.js是一個基于Vue.js的輕量級服務(wù)器端渲染框架,可以月來創(chuàng)建服務(wù)器端渲染應(yīng)用,也可以充當(dāng)靜

態(tài)站點引擎生成靜態(tài)站點應(yīng)用,具有優(yōu)雅的代碼結(jié)構(gòu)和熱加載等特性。

9.3.1頁面和路由

在項目中,pages文件夾用來存放應(yīng)用的路由及頁面文件,Nuxt.js項目創(chuàng)建時該文件夾下默認(rèn)會有兩個文件,

分別是index.vue和README.md,當(dāng)直接訪問根路徑/的時候,默認(rèn)打開的是index.vue文件。

Nuxt.js會根據(jù)文件夾結(jié)構(gòu)自動生成對應(yīng)的路由配置,將請求路徑和pages文件夾下的文件名映射,例如,

訪問/test就表示訪問test.vue文件,如果文件不存在,就會輸出“Thispagecouldnotbefound"(該頁面未找

到)錯誤提示信息。

Nuxt.js提供了非常方便的自動路由機(jī)制,當(dāng)它檢測到pages又件夾下的文件發(fā)生變更時,就會自動更新

路由。通過查看.nuxt'router.js路由文件,可以看到Nuxt.js自動生成的代碼。只要編寫.vue文件,Nuxt.js就會

自動生成路由文件,然后到瀏覽器就可以直接訪問。

1.一級路由

pages文件火下的所有一級.vue文件或者是一級文件火下的index.vue文件都是一級路由,pages文件災(zāi)

下的子文件夾以及.vue文件的結(jié)構(gòu)如下。

pages

J—about

|—Jd.vue

」index.vue

|—index.vue

1-news.vue

pages文件夾下的index.vue、news.vue屬于一級路由,只是直接放在了pages文件夾下,Nuxt.js會自動

檢測pages文件夾下的所有.vue文件,并自動生成路由,不需要編寫代碼進(jìn)行配置,因此如非必要,pages

文件夾的名稱不要隨意改動。通常訪問路徑為http:〃localhost:3000/index或http:〃

localhost:3000/news,分別對應(yīng)著首頁(index.vue)和新聞頁(news.vue卜

about文件夾下的index.vue文件也屬于一級路由,只不過是放在了about文件夾下。當(dāng)訪問about路由時,

會查找有沒有一級節(jié)路由about.vje,如果沒有就查找about文件夾并且默認(rèn)會查找index.vue文件。不管是

哪種方式,訪問路徑都為http://localhost:3000/abouto

2.二級路由

所謂二級路由就是建立一個與一級路由同名的文件夾,這個文件夾下的.vue文件就是二級路由。例如

news.vue需要建立一個news義件夾來存放news的一級路由,結(jié)構(gòu)如下。

pages

(-about

||—Jd.vue

I(—aboutChild.vue

1-index.vue

news

I」newsChild.vue

卜index.vue

1—news.vue

訪問路徑分別為http://localhost:3000/about/aboutChild與http://localhost:3000/news/newsChildo一級路由里

寫一個可以存放二級路由的標(biāo)簽<nuxt-child/>o

3.動態(tài)路由

對于以下的結(jié)構(gòu)。

pages

(―about

1—Jd.vue

I」index.vue

(—index.vue

」news.vue

如果要跳轉(zhuǎn)到about文件夾中的index.vue頁面,可以這么寫:

<nuxt-link:to="{name:'about'"〉about</nuxt-link>

如果需要傳遞參數(shù),則可以這么寫:

<nuxt-link:to="{name:'about/123456'">about</nuxt-link>

如果傳遞的是id,則需要先建立一個」d.vue的文件作為接收參數(shù)的頁面,注意必須這么建,這是一個Nuxt

的約定。

9.3.2頁面跳轉(zhuǎn)

Nuxt.js中使用<nuxt-link>組件來完成頁面中路由的跳轉(zhuǎn),它類似于Vue中的路由組件<router-

link>,它們具有相同的屬性,并且使用方式也相同。需要注意的是,在Nuxtjs項目中不要直接使用<a>標(biāo)簽來進(jìn)

行頁面的跳轉(zhuǎn),因為<a>標(biāo)簽是重新獲取一個新的頁面,而<nuxt-link>更符合SPA的開發(fā)模式。

頁面跳轉(zhuǎn)的語法格式如下:

<nuxt-link:to="{name:*.vue文件名稱'}">頁面名稱</nuxt-link>

例如:

<nuxt-link:to="{name:'details'}">查看詳情頁</nuxt?link>

頁面跳轉(zhuǎn)時,參數(shù)傳遞的語法格式如下:

<nuxt-link:to="{name:'.vue文件名稱',params:{參數(shù)名:參數(shù)值}}”>頁面名稱v/nuxt-link>

<nuxt-link:to="{name:'.vue文件名稱queiy{參數(shù)名:參數(shù)值}}">頁面名稱</nuxt-link>

例如:

<nuxt-link:to="{name:'details',params:{id:'123456'}}"》查看詳情頁</iuxt-link>

<nuxt-link:to=',{name:'details',query:{id:'123456'}}”>查看詳情頁</nuxt-link>

1.聲明式路由與編程式路由

聲明式路由與編程式路由是Nuxt.js中頁面跳轉(zhuǎn)的兩種方式。

(1)聲明式路由

在頁面中使用<nuxt-link>標(biāo)簽實現(xiàn)聲明式路由跳轉(zhuǎn)。以pages\test.vue頁面為例,實現(xiàn)代碼如下:

<template>

<div>

<div>

<nuxt-linkto="/sub/tes<’>跳轉(zhuǎn)到sub/test</nuxt-link>

</div>

<div>test</div>

</div>

</template>

(2)編程式路由

編程式路由就是在JavaScript代碼中通過程序代碼實現(xiàn)路由的跳轉(zhuǎn)。以pages\sub\test.vue頁面為例,實

現(xiàn)代碼如下:

<template>

<div>

<button@click="jumpTo”>跳轉(zhuǎn)到test〈/button>

<div>sub/test</div>

</div>

</template>

<script>

exportdefault{

methods:{

jumpTo(){

this.$router.push(7test')

}

}

)

</script>

Button組件綁定jumpTot)方法,然后在methods中加入jumpTo()方法,該方法中使用

this.$router.push(7test')導(dǎo)航至!]test頁面,實現(xiàn)了路由跳轉(zhuǎn)功能。

2.同級文件夾路由跳轉(zhuǎn)與嵌套路由跳轉(zhuǎn)

假設(shè)在文件夾pages中有1個子文件夾home和兩個.vue文件(index.vue,home.vue),子文件夾home

中也有兩個.vue文件(title.vue.xxx.vue),文件夾與文件的結(jié)構(gòu)如下。

pages

|—home

||—title.vue

|1-xxx.vue

index.vue

1-home.vue

(1)同級文件夾路由跳轉(zhuǎn)

從當(dāng)前文件夾中的index.vue跳轉(zhuǎn)到同級文件夾下的home.vue路由下,這種方式很簡單,代碼如下:

<nuxt-linkto=7home'>HOMEpage</nuxt-link>

也可以寫成以下形式,t。前面有半角冒號::

<nuxt-link:to="{name:'home.vue'}">HOMEpage</nuxt-link>

(2)嵌套路由跳轉(zhuǎn)

如果需要從當(dāng)前文件夾中的home.vue跳轉(zhuǎn)到同級文件夾home中的title.vue,由于在pages文件夾下有一

個和home子文件夾同書的home.vue,在home.vue中添加以下代碼即可切換到title.vue中:

<nuxt-linkto="/home/title,,>home/title</nuxt-link>

<nuxt-child></nuxt-child>

如果需要從當(dāng)前文件夾中的index.vue跳轉(zhuǎn)到同級文件夾home中的title.vue,可以通過動態(tài)添加路由的

方法實現(xiàn),在index.vue中添加以下代碼即可:

<nuxt-link:to="{name:'home-title',params:{id:'title'}}">title</nuxt-link>

關(guān)鍵點是要把Htle.vue的名字修改為」itle.vue,其中id:'title'的目的是使path為/home/title,這樣就實現(xiàn)了

嵌套路由跳轉(zhuǎn)。

如果需要在_title.vue中跳轉(zhuǎn)到同級文件夾下的xxx.vue中,在」itle.vue中添加以下代碼即可:

<nuxt-linkto='/home/xxx'>xxx</nuxt-link>

【實例9-4】創(chuàng)建Nuxt.js項目搭建服務(wù)器端渲染

【操作要求】

創(chuàng)建Nuxt.js項目04-nuxt-ssr,在該項目中搭建服務(wù)器端渲染。

【實現(xiàn)過程】

1.全局安裝create-nuxt-app腳手架工具

在命令行中執(zhí)行以下命令,完成create-nuxt-app腳手羋T具的全局安裝:

npminstallcreate-nuxt-app-g

執(zhí)行以下命令,可以安裝指定版本的create-nuxt-app腳手架工具:

npminstallcreate-nuxt-app@2.9.x-g

2.創(chuàng)建Nuxt.js項目

在指定文件夾下執(zhí)行以下命令,創(chuàng)建Nuxt.js項目:

create-nuxt-app04-nuxt-ssr

命令啟動后,會有一些選項需要進(jìn)行選擇例如項目名稱選擇04-nuxt-ssr程序開發(fā)語言選擇“JavaScript”,

包管理器選擇“Npm”,渲染模式(Renderingmode)選擇“Universal(SSR/SSG)”選項等。各個選項的選擇結(jié)

果如下:

create-nuxt-appv3.7.1

□GeneratingNuxt.jsprojectin04-nuxt-ssr

?Projectname:04-nuxt-ssr

?Programminglanguage:JavaScript

?Packagemanager:Npm

?UIframework:None

?Nuxt.jsmodules:(Press<space>toselect,<a>totoggleall,<i>toinvertselection)

?Lintingtools:(Press<space>toselect,<a>totoggleall,<i>toinvertselection)

?Testingframework:None

?Renderingmode:Universal(SSR/SSG)

?Deploymenttarget:Server(Node.jshosting)

?Developmenttools:(Press<space>toselect,<a>totoggleall,<i>toinvertselection)

?WhatisyourGitHubusername?

?Versioncontrolsystem:None

成功創(chuàng)建Nuxt.js項目后,命令行中會顯示以下信息:

Successfullycieuledprujeul04-nuxl-ssr

Togetstarted:

cd04-nuxt-ssr

npmrundev

Tobuild&startforproduction:

cd04-nuxt-ssr

npmrunbuild

npmrunstart

3.啟動Nuxt.js項目

在命令行中執(zhí)行以下命令,啟動Nuxt.js項目:

cd04-nuxt-ssr

npmrundev

在Nuxt.js項目04-nuxt-ssr的啟動過程中,命令行中會出現(xiàn)圖9-2所示的提示信息。

Nuxt.js項目04-nuxt-ssr啟動過程中命令行的提示信息

打開瀏覽器,在地址欄中輸入“http:〃localhost:3000/",按[En:er]鍵后,04-nuxt-ssr首頁的瀏覽結(jié)果如

圖9-3所示。

ZANuxtJS

Nuxt.js項目04-nuxt-ssr首頁的瀏覽結(jié)果1

4.查看創(chuàng)建Nuxt.js項目默認(rèn)生成的文件

(1)查看package.json文件中的代碼

(2)查看nuxt.config.js文件中的代碼

(3)查看文件夾.nuxt下router.js文件中的代碼

在Nuxt.js項目新建頁面時,Nuxt.js會自動在.nuxt/router.js文件中注冊好路由,訪問的默認(rèn)文件是

index.vue<>

5.創(chuàng)建新的.vue文件實現(xiàn)所需功能

(1)在pages文件夾中的index.vue文件中編寫代碼

將圖片文件tO1.jpg復(fù)制到static文件夾中,然后在index.vue文件中添加以下代碼:

<template>

<imgsrc="-/static/tO1.jpg"alt='"'>

</template>

<script>

exportdefault{}

</script>

對新添加的代碼予以保存。

打開瀏覽器,在地址欄中輸入“http:〃localhost:3000J按[Enter]鍵后,首頁的瀏覽結(jié)果如圖所示。

Nuxt.js項目04-nuxt-ssr首頁的瀏覽結(jié)果2

(2)在Nuxt.js項目中創(chuàng)建與使用組件

在文件夾components中創(chuàng)建User.vue文件,打開User.vue文件,添加以下代碼:

<template>

<p>歡迎登錄</p>

</template>

在pages文件夾中的index.vue添加以下代碼:

<template>

<div>

<User></User>

</div>

</template>

<script>

importUserfrom~/comporents/User.vue*

exportdefault{

components:{

User

}

}

</script>

重新瀏覽index.vue頁面,首頁的瀏覽結(jié)果如圖所示。

OX

<-->C@localhost:3000☆公介士:

歡I膻錄

Nuxt.js項目04-nuxt-ssr首頁的瀏覽結(jié)果3

(3)在Nuxt.js項目中使用布局

在文件夾04-nuxt-ssr中創(chuàng)建子文件夾layouts,在該子文件夾中創(chuàng)建myNav.vue文件,再在該文件中輸

入以下代碼:

<template>

<div>

<ul>

vli>登錄v/li>

<li>注冊</li>

</ul>

<nuxt/>

</div>

</template>

代碼中的<的乂(/>與vue-route的<router-view/>作用類似。

在pages文件夾中的index.vue文件中添加以下代碼:

<template></template>

<script>

exportdefault{

layout:'myNav'

)

</scrlpt>

重新瀏覽index.vue頁面,首頁的瀏覽結(jié)果如圖所示。

+

<■">C①localhos

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論