NodeJS框架Express的模板視圖機(jī)制分析
模板引擎
Express支持許多模板引擎,常用的有:
- haml 的實(shí)現(xiàn)Haml
- haml.js 接替者,同時(shí)也是Express的默認(rèn)模板引擎Jade
- 嵌入JavaScript模板EJS
- 基于CoffeeScript的模板引擎CoffeeKup
- 的NodeJS版本jQuery模板引擎
視圖渲染(view randering)
視圖的文件名默認(rèn)需遵循“<name>.<engine>”的形式,這里<engine>是要被加載的模塊的名字。比如視圖layout.ejs就是在告訴視圖系統(tǒng)要require(‘ejs'),被加載的模塊必須輸出exports.compile(str, options)方法,并要返回一個(gè)函數(shù)來遵守Express的模板接口約定。我們也可以使用app.register()來映射模板引擎到其它文件擴(kuò)展名,從而實(shí)現(xiàn)更靈活的模板引擎行為,如此一來就可以實(shí)現(xiàn)“csser.html”可以被ejs引擎所渲染。
下面我們將用Jade引擎來渲染index.html,因?yàn)槲覀儧]有設(shè)置layout:false,index.jade渲染后的內(nèi)容將被作為body本地變量傳入layout.jade。
<SPAN style="FONT-SIZE: 13px">app.get('/', function(req, res){
res.render('index.jade', { title: 'CSSer, 關(guān)注Web前端技術(shù)!' });
});
</SPAN>
新增的“view engine”設(shè)置可以指定默認(rèn)模板引擎,如果我們想使用jade可以這樣設(shè)置:
<SPAN style="FONT-SIZE: 13px">app.set('view engine', 'jade');
</SPAN>
于是我們就可以通過下面的方式:
</SPAN>
代替如下方式:
</SPAN>
當(dāng)“view engine”設(shè)置后,模板的擴(kuò)展名就成了可選項(xiàng),同時(shí)我們還可以混合匹配多模板引擎:
</SPAN>
Express同時(shí)提供了視圖選項(xiàng)設(shè)置,這些設(shè)置會(huì)在每次視圖渲染后應(yīng)用,比如你并不經(jīng)常使用layouts,就可以這樣設(shè)置:
layout: false
});
</SPAN>
如果需要,這些設(shè)置可以在后續(xù)的res.render()調(diào)用中被覆蓋:
</SPAN>
可以通過指定一個(gè)路徑的方式來實(shí)現(xiàn)用自己的layout來代替系統(tǒng)默認(rèn)的,比如如果我們將“view engine”設(shè)置為jade并且自定義了一個(gè)名為“./views/mylayout.jade”的layout,我們可以這樣使用它:
</SPAN>
否則必須指定擴(kuò)展名:
</SPAN>
這些路徑也可以是絕對(duì)路徑:
</SPAN>
這方面較好的例子就是自定義ejs模板的開始和關(guān)閉的標(biāo)記:
open: '{{',
close: '}}'
});
</SPAN>
局部視圖(View Partials)
Express視圖系統(tǒng)原生支持局部和集合視圖,這稱作微型視圖,主要用于渲染一個(gè)文檔片段。比如與其在視圖中循環(huán)顯示評(píng)論,不如使用局部集合(partial collection):
</SPAN>
如果不需要其它選項(xiàng)或本地變量,我們可以省略對(duì)象而簡(jiǎn)單的傳入評(píng)論數(shù)組,這和上面的示例是一樣的:
</SPAN>
當(dāng)使用局部集合時(shí),支持一些“魔術(shù)”本地變量:
- firstInCollection 當(dāng)為第一個(gè)對(duì)象時(shí)該值為true
- indexInCollection 集合中對(duì)象的索引值
- lastInCollection 當(dāng)為最后一個(gè)對(duì)象時(shí)為true
- collectionLength 集合的長(zhǎng)度
Local variables passed (or generated) take precedence, however locals passed to the parent view are available in the child view as well. So for example if we were to render a blog post with partial(‘blog/post', post) it would generate the post local, but the view calling this function had the local user, it would be available to the blog/post view as well.
傳入(或生成)的本地變量?jī)?yōu)先,但傳入父視圖的本地變量在子視圖仍有效。因此如果我們用partial(‘blog/post', post)來渲染博客日志時(shí),將生成post的本地變量,但調(diào)用本函數(shù)的視圖擁有本地用戶,它在blog/post視圖依然有效。(一回注:這段翻譯感覺有問題,請(qǐng)高人指點(diǎn))。
性能提示:當(dāng)使用局部集合渲染100長(zhǎng)度的數(shù)組就意味著需要渲染100次視圖,對(duì)于簡(jiǎn)單的集合你可以將循環(huán)內(nèi)聯(lián),而不要使用局部集合,這樣可以減少系統(tǒng)開銷。
視圖查找(View Lookup)
視圖查找是相對(duì)于父視圖進(jìn)行的,比如我們有一個(gè)名為“views/user/list.jade”的頁(yè)面視圖,如果在該視圖中調(diào)用 partial(‘edit'),視圖系統(tǒng)將會(huì)嘗試查找并加載“views/user/edit.jade”,而partial(‘.. /messages')將加載“views/messages.jade”。
視圖系統(tǒng)還支持索引模板,這樣你就可以使用一個(gè)同名的目錄。比如,在一個(gè)路由中我們執(zhí)行res.render(‘users'),這將指向“views/users.jade”或者“views/users/index.jade”。
當(dāng)使用上面的索引視圖時(shí),我們可以通過partial(‘users')從同名目錄下引用“views/users/index.jade”,同時(shí)視圖系統(tǒng)會(huì)嘗試“../users/index”,這能減少我們調(diào)用partial(‘index')的需要。
- nodejs教程 安裝express及配置app.js文件的詳細(xì)步驟
- node.js Web應(yīng)用框架Express入門指南
- Node.js使用Express創(chuàng)建Web項(xiàng)目詳細(xì)教程
- 詳解nodejs中express搭建權(quán)限管理系統(tǒng)
- Node.js Express安裝與使用教程
- Nodejs的express使用教程
- Node.js+Express+MySql實(shí)現(xiàn)用戶登錄注冊(cè)功能
- 深入理解nodejs中Express的中間件
- 用node和express連接mysql實(shí)現(xiàn)登錄注冊(cè)的實(shí)現(xiàn)代碼
- 使用 NodeJS+Express 開發(fā)服務(wù)端的簡(jiǎn)單介紹
- Node Express用法詳解【安裝、使用、路由、中間件、模板引擎等】
相關(guān)文章
JS簡(jiǎn)單實(shí)現(xiàn)表格排序功能示例
這篇文章主要介紹了JS簡(jiǎn)單實(shí)現(xiàn)表格排序功能,涉及javascript針對(duì)頁(yè)面元素的遍歷、判斷與排序相關(guān)操作技巧,需要的朋友可以參考下2016-12-12
JS實(shí)現(xiàn)仿Windows7風(fēng)格的網(wǎng)頁(yè)右鍵菜單效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)仿Windows7風(fēng)格的網(wǎng)頁(yè)右鍵菜單效果代碼,涉及JavaScript鼠標(biāo)右鍵響應(yīng)及動(dòng)態(tài)生成頁(yè)面菜單的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
如何用JS模擬實(shí)現(xiàn)數(shù)組的map方法
這篇文章主要介紹了如何用JS模擬實(shí)現(xiàn)數(shù)組的map方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
JavaScript實(shí)現(xiàn)復(fù)制粘貼剪切功能三種方法
這篇文章主要給大家介紹了關(guān)于JavaScript實(shí)現(xiàn)復(fù)制粘貼剪切功能的相關(guān)資料,在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的開發(fā)需求,文中通過代碼將三種方法介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
TypeScript泛型參數(shù)默認(rèn)類型和新的strict編譯選項(xiàng)
這篇文章主要介紹了TypeScript泛型參數(shù)默認(rèn)類型和新的strict編譯選項(xiàng),對(duì)TypeScript感興趣的同學(xué),可以參考下2021-05-05
javascript隨機(jī)生成用戶名的實(shí)現(xiàn)方式
這篇文章主要介紹了javascript隨機(jī)生成用戶名的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08

