這次給大家?guī)鞱ode.js使用jade模板引擎步驟詳解,Node.js使用jade模板引擎的注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來看一下。
在“Node.js開發(fā)入門——Express安裝與使用”里,我們?cè)?jīng)使用express generator創(chuàng)建了一個(gè)HelloExpress網(wǎng)站,express工具為我們生成了基本的目錄結(jié)構(gòu)、模板、stylesheet、routers等。雖然那只是一個(gè)簡(jiǎn)單的HelloWorld類的小東西,可里面包含的內(nèi)容還是有些多了,為了更好的理解Express所支持的jade模板引擎的用法,我們這次提供一個(gè)手動(dòng)創(chuàng)建的小網(wǎng)站,可以顯示來訪者的IP,并對(duì)訪問進(jìn)行計(jì)數(shù)。
安裝jade
npm?install?-g?jade
執(zhí)行上面的命令,全局安裝。
Visitor網(wǎng)站
第1步,在myprojects目錄下創(chuàng)建一個(gè)Visitor目錄。
第2步,把下面的代碼保存在package.json文件里:
{ ?"name":?"Visitor", ?"version":?"0.0.0", ?"private":?true, ?"dependencies":?{ ?"express":?"~4.13.1", ?"jade":?"~1.11.0", ?} }
這個(gè)json文件描述了我們的Visitor網(wǎng)站的一些信息,最重要的部分是依賴。我們要使用express和jade。
var?express?=?require('express'); var?app?=?express(); var?counter?=?0; //?view?engine?setup app.set('views',?'./views'); app.set('view?engine',?'jade'); app.engine('jade',?require('jade').express); app.get('/',?function(req,?res)?{ ?counter++; ?app.locals.counter?=?counter.toString(); ?res.render('index',?{ip:?req.ip}); }); app.listen(3000); app.locals.title?=?"Welcome?to?Visitor"; app.locals.counter?=?"0";
app.js文件是我們網(wǎng)站的入口。
第4步,創(chuàng)建一個(gè)views目錄,在里面創(chuàng)建一個(gè)模板文件index.jade,內(nèi)容如下:
doctype?html html ?head ?title=?title ?body ?h1=?title ?p?Hello,?#{ip} ?p?You're?the?#{counter}?visitor.
第5步,在Visitor目錄里執(zhí)行“npm install”,安裝依賴。
第6步,在Visitor目錄里執(zhí)行“node app.js”,啟動(dòng)網(wǎng)站。
最后呢,就可以在瀏覽器里訪問了,地址欄里輸入“http://localhost:3000”即可,刷新幾次,你可能會(huì)看到下面的界面:
這個(gè)簡(jiǎn)單的Visitor網(wǎng)站,和之前的HelloWorld、HelloExpress都不太一樣了,它有了一些動(dòng)態(tài)的內(nèi)容。接下來我們就來看看這一切是如何發(fā)生的。
express與模板引擎
我在Visitor里使用了jade模板引擎,類似的還有ejs以及很多,可以訪問這里來了解:https://github.com/joyent/node/wiki/Modules。
模板引擎使用模板文件來動(dòng)態(tài)生成HTML文件,在生成時(shí)又可以按照一定的規(guī)則將應(yīng)用程序里的數(shù)據(jù)整合進(jìn)HTML文件。這樣,我們既避免了手動(dòng)編寫HTML的繁瑣(相對(duì)使用模板而言),又能生成具有動(dòng)態(tài)內(nèi)容的網(wǎng)頁。
Express和Jade結(jié)合得比較好,我們來看看怎么配置它。
Express配置jade
Express服務(wù)器的行為可以通過一些設(shè)置選項(xiàng)來控制,這些選項(xiàng)可以通過express對(duì)象的set(setting, value)、enable(setting)和disable(setting)來設(shè)置。具體支持哪些設(shè)置,可以看這里http://expressjs.com/4x/api.html。我們的Visitor只用到了“view engine”和“views”。
“view engine”選項(xiàng)用來設(shè)置要使用的引擎,Visitor的代碼如下:
app.set('view?engine',?'jade');
“views”選項(xiàng)用來設(shè)置模板文件所在目錄,Visitor的代碼如下:
app.set('views',?'./views');
我在這里簡(jiǎn)單的使用了相對(duì)路徑,更好的做法是使用path模塊,根據(jù)全局變量dirname來拼接。dirname指當(dāng)前正在執(zhí)行的腳本所在的目錄,對(duì)我們的Visitor示例來講,就是app.js所在的那個(gè)目錄。代碼可能是這樣的:
var?path?=?require('path'); path.join(dirname,?'views');
express默認(rèn)會(huì)根據(jù)模板文件的擴(kuò)展名來使用對(duì)應(yīng)的引擎。對(duì)于*.jade文件,express內(nèi)部會(huì)調(diào)用下面的語句:
app.engine('jade',?require('jade').express);
所以,我們的app.js,實(shí)際上也可以去掉這行代碼,結(jié)果是一樣的。
本地對(duì)象
我們可以在模板文件里包含動(dòng)態(tài)數(shù)據(jù),這些動(dòng)態(tài)數(shù)據(jù)來自應(yīng)用程序。我們可以使用express對(duì)象的locals對(duì)象來存儲(chǔ)本地變量。下面的代碼就存儲(chǔ)了標(biāo)題和訪問計(jì)數(shù):
app.locals.title?=?"Welcome?to?Visitor"; app.locals.counter?=?"0";
jade模板文件里可以直接訪問express對(duì)象的locals對(duì)象的屬性。我在app.js里設(shè)置的title和counter,在index.jade模板文件引用了它們。
現(xiàn)在我們來看這行代碼:
res.render('index',?{ip:?req.ip});
它調(diào)用express的Response對(duì)象的render方法來渲染模板文件,并且傳遞了一個(gè)本地對(duì)象。render方法原型:
res.render(view?[,?locals]?[,?callback])
res.render方法渲染一個(gè)view并且把渲染生成的HTML字符串發(fā)送給客戶端。res的API參考在這里http://expressjs.com/4x/api.html。
Response對(duì)象也有一個(gè)locals對(duì)象,它和app.locals的區(qū)別是,res的locals只在當(dāng)前渲染的view內(nèi)有效,而app.locals是全局的。
另外render方法的可選參數(shù)locals,也可以定義本地變量對(duì)象,傳遞給view。我在代碼里把ip傳了過去。
在jade文件里,常見的有兩種方式可以調(diào)用由應(yīng)用程序傳入的本地變量:
#{表達(dá)式}
標(biāo)簽=表達(dá)式
前面的index.jade模板文件里,對(duì)于頁面標(biāo)題,我們這么用的:
title= title
title是jade用來定義HTML文檔title的標(biāo)簽。
對(duì)于body里的一級(jí)標(biāo)題,我們這么用的(h1是jade用來定義HTML一級(jí)標(biāo)題的標(biāo)簽):
h1= title
這都是屬于“標(biāo)簽=表達(dá)式”這種調(diào)用方式,這種方式通常用在一行jade代碼的開始,也就是標(biāo)簽開始的地方。而“#{表達(dá)式}”這種方式的好處是可以插入到j(luò)ade模板文件的任意地方。比如:
p?Hello,?#{ip} p?You're?the?#{counter}?visitor.
我們也可以將“h1= title”修改為“h1 #{title}”,效果一樣。
jade引擎簡(jiǎn)介
jade使用一些標(biāo)簽來標(biāo)記如何生成HTML,jade模板文件看起來很不像HTML文件,但它的模板文件小而整潔。使用jade,需要了解它都支持哪些標(biāo)簽,這個(gè)可以直接去看jade-lang,那里最詳細(xì)也最權(quán)威,我們這里只介紹index.jade文件用到的那些標(biāo)簽。
關(guān)于jade,有兩篇文章不錯(cuò),可以看看,https://cnodejs.org/topic/5368adc5cf738dd6090060f2和http://www.jb51.net/article/139936.htm,后面這篇文章是網(wǎng)友根號(hào)三寫的一個(gè)關(guān)于jade的系列文章的開篇,整個(gè)系列里的文章都值得一看。
HTML文檔的開始通常是文檔聲明,對(duì)應(yīng)到j(luò)ade模板文件里,就是doctype html。還有其它的文檔類型,比如xml,可以寫作doctype xml。更多請(qǐng)參考http://jade-lang.com/reference/doctype/。
jade有很多標(biāo)簽,用于生成HTML對(duì)應(yīng)的標(biāo)簽。比如html對(duì)應(yīng),head對(duì)應(yīng),body對(duì)應(yīng),p對(duì)應(yīng),title對(duì)應(yīng),這也是我們的index.jade用到的所有標(biāo)簽了。通常我們?cè)贖TML里使用的標(biāo)簽寫法,去掉尖括號(hào)就成了jade里可用的標(biāo)簽,比如對(duì)應(yīng)jade里的p。
HTML標(biāo)簽往往可以設(shè)置name、id、class等屬性,在jade里,是通過tag(attr=value)這種形式表示的。比如p(class=”view-container”),又比如input(type=”checkbox”)。
關(guān)于jade標(biāo)簽,這篇文章http://www.jb51.net/article/139942.htm說得很好,請(qǐng)參考。
測(cè)試jade模板文件
一開始用jade模板,記不全它的標(biāo)簽,也經(jīng)常不知道自己的寫的模板文件生成的html文檔是否正確。還好安裝jade后,有一個(gè)命令行工具jade,可以用來驗(yàn)證模板文件。
jade的用法如下:jade [options] [dir|file …]
jade命令有很多選項(xiàng),可以執(zhí)行“jade -h”查看。要驗(yàn)證模板文件,最簡(jiǎn)單的辦法就是使用jade工具生成為html文檔。命令如下:
jade?xxx.jade
執(zhí)行上面的命令,就會(huì)在當(dāng)前目錄下生成一個(gè)與模板文件同名的html文檔。不過格式很難讀,完全是一坨屎擠在一起。加上 -P(–pretty) 就好了。這樣:
jade?-P?xxx.jade
比如我們有這么一個(gè)使用了AngularJS的模板文件scope_template.jade,內(nèi)容如下:
doctype?html html(ng-app="myApp") ?head ?title=?title ?link(rel='stylesheet',?href='/stylesheets/style.css') ?body ?p(ng-controller="SimpleTemplate") ?|?ValueA:? ?input(type="number"?ng-model="valueA") ?br ?|?ValueB:? ?input(type="number"?ng-model="valueB") ?br ?br ?|?Expression?Value:?{{valueA?+?valueB}} ?br ?br ?input(type="button"?ng-click="addValues(valueA,?valueB)"?value="Click?to?Add?Values?{{valueA}}?&?{{valueB}}") ?br ?|?Clicked?Value:?{{valueC}} ?br ?script(src="/javascripts/angular-1.4.3.min.js") ?script(src="/javascripts/scope_template.js")
運(yùn)行“jade -P scope_template.jade”命令會(huì)生成scope_template.html文件,內(nèi)容如下:
<!DOCTYPE html> <html ng-app="myApp"> ?<head> ?<title></title> ?<link rel="stylesheet" href="/stylesheets/style.css" rel="external nofollow" > ?</head> ?<body> ?<p ng-controller="SimpleTemplate">ValueA:? ?<input type="number" ng-model="valueA"><br>ValueB:? ?<input type="number" ng-model="valueB"><br><br>Expression?Value:?{{valueA?+?valueB}}<br><br> ?<input type="button" ng-click="addValues(valueA, valueB)" value="Click to Add Values {{valueA}} & {{valueB}}"><br>Clicked?Value:?{{valueC}}<br> ?</p> ?<script src="/javascripts/angular-1.4.3.min.js"></script> ?<script src="/javascripts/scope_template.js"></script> ?</body> </html>
需要提一下,我們既可以用jade編寫完整的HTML文檔,也可以編寫符合HTML語法的局部模板。比如下面的jade文件:
p(class="admin-user") ?p?添加用戶 ?table ?tr ?td ?label?用戶名: ?td ?input(type="text"?name="add_username") ?tr ?td ?label?密碼: ?td ?input(type="text"?name="add_password")? ?tr ?td(colspan='2'?align="right") ?input(type="submit"?value="增加")
相信看了本文案例你已經(jīng)掌握了方法,更多精彩請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
推薦閱讀:
nodeJS服務(wù)器創(chuàng)建與重啟操作代碼分享
以上是Node.js使用jade模板引擎步驟詳解的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級(jí)代碼編輯軟件(SublimeText3)

WebSocket與JavaScript:實(shí)現(xiàn)實(shí)時(shí)監(jiān)控系統(tǒng)的關(guān)鍵技術(shù)引言:隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,實(shí)時(shí)監(jiān)控系統(tǒng)在各個(gè)領(lǐng)域中得到了廣泛的應(yīng)用。而實(shí)現(xiàn)實(shí)時(shí)監(jiān)控的關(guān)鍵技術(shù)之一就是WebSocket與JavaScript的結(jié)合使用。本文將介紹WebSocket與JavaScript在實(shí)時(shí)監(jiān)控系統(tǒng)中的應(yīng)用,并給出代碼示例,詳細(xì)解釋其實(shí)現(xiàn)原理。一、WebSocket技

如何使用WebSocket和JavaScript實(shí)現(xiàn)在線語音識(shí)別系統(tǒng)引言:隨著科技的不斷發(fā)展,語音識(shí)別技術(shù)已經(jīng)成為了人工智能領(lǐng)域的重要組成部分。而基于WebSocket和JavaScript實(shí)現(xiàn)的在線語音識(shí)別系統(tǒng),具備了低延遲、實(shí)時(shí)性和跨平臺(tái)的特點(diǎn),成為了一種被廣泛應(yīng)用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實(shí)現(xiàn)在線語音識(shí)別系

如何利用JavaScript和WebSocket實(shí)現(xiàn)實(shí)時(shí)在線點(diǎn)餐系統(tǒng)介紹:隨著互聯(lián)網(wǎng)的普及和技術(shù)的進(jìn)步,越來越多的餐廳開始提供在線點(diǎn)餐服務(wù)。為了實(shí)現(xiàn)實(shí)時(shí)在線點(diǎn)餐系統(tǒng),我們可以利用JavaScript和WebSocket技術(shù)。WebSocket是一種基于TCP協(xié)議的全雙工通信協(xié)議,可以實(shí)現(xiàn)客戶端與服務(wù)器的實(shí)時(shí)雙向通信。在實(shí)時(shí)在線點(diǎn)餐系統(tǒng)中,當(dāng)用戶選擇菜品并下單

JavaScript和WebSocket:打造高效的實(shí)時(shí)天氣預(yù)報(bào)系統(tǒng)引言:如今,天氣預(yù)報(bào)的準(zhǔn)確性對(duì)于日常生活以及決策制定具有重要意義。隨著技術(shù)的發(fā)展,我們可以通過實(shí)時(shí)獲取天氣數(shù)據(jù)來提供更準(zhǔn)確可靠的天氣預(yù)報(bào)。在本文中,我們將學(xué)習(xí)如何使用JavaScript和WebSocket技術(shù),來構(gòu)建一個(gè)高效的實(shí)時(shí)天氣預(yù)報(bào)系統(tǒng)。本文將通過具體的代碼示例來展示實(shí)現(xiàn)的過程。We

如何使用WebSocket和JavaScript實(shí)現(xiàn)在線預(yù)約系統(tǒng)在當(dāng)今數(shù)字化的時(shí)代,越來越多的業(yè)務(wù)和服務(wù)都需要提供在線預(yù)約功能。而實(shí)現(xiàn)一個(gè)高效、實(shí)時(shí)的在線預(yù)約系統(tǒng)是至關(guān)重要的。本文將介紹如何使用WebSocket和JavaScript來實(shí)現(xiàn)一個(gè)在線預(yù)約系統(tǒng),并提供具體的代碼示例。一、什么是WebSocketWebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工

JavaScript教程:如何獲取HTTP狀態(tài)碼,需要具體代碼示例前言:在Web開發(fā)中,經(jīng)常會(huì)涉及到與服務(wù)器進(jìn)行數(shù)據(jù)交互的場(chǎng)景。在與服務(wù)器進(jìn)行通信時(shí),我們經(jīng)常需要獲取返回的HTTP狀態(tài)碼來判斷操作是否成功,根據(jù)不同的狀態(tài)碼來進(jìn)行相應(yīng)的處理。本篇文章將教你如何使用JavaScript獲取HTTP狀態(tài)碼,并提供一些實(shí)用的代碼示例。使用XMLHttpRequest

用法:在JavaScript中,insertBefore()方法用于在DOM樹中插入一個(gè)新的節(jié)點(diǎn)。這個(gè)方法需要兩個(gè)參數(shù):要插入的新節(jié)點(diǎn)和參考節(jié)點(diǎn)(即新節(jié)點(diǎn)將要被插入的位置的節(jié)點(diǎn))。

JavaScript中的HTTP狀態(tài)碼獲取方法簡(jiǎn)介:在進(jìn)行前端開發(fā)中,我們常常需要處理與后端接口的交互,而HTTP狀態(tài)碼就是其中非常重要的一部分。了解和獲取HTTP狀態(tài)碼有助于我們更好地處理接口返回的數(shù)據(jù)。本文將介紹使用JavaScript獲取HTTP狀態(tài)碼的方法,并提供具體代碼示例。一、什么是HTTP狀態(tài)碼HTTP狀態(tài)碼是指當(dāng)瀏覽器向服務(wù)器發(fā)起請(qǐng)求時(shí),服務(wù)
