最近幾天折騰了下express,想找個合適的模版引擎,下面是一些折騰過程的備忘
選擇一門模版語言時,可能會考慮的幾點
注意到hbs,似乎滿足大部分的需求:
目錄結構如下:
.
├── node_modules
│ ├── express
│ └── hbs
├── package.json
└── views
└── index.hbs
var express = require('express'),
hbs = require('hbs'),
如果稍微看過hbs
原始碼可以知道,hbs缺省會到views
下找layout.hbs
這個模版,將這個模板作為基本骨架,來渲染返回的頁面。
以getting-started
裡的例子來說,比如使用者請求 那麼,處理步驟如下
查詢views/index.hbs
,進行編譯,並將編譯的結果儲存為 a
查詢views/layout.hbs
,如果
存在:對layout.hbs
進行編譯,其中}}
標籤替換成 a,並返回最終編譯結果b
不存在:返回a
直接看例子。目錄機構如下,可以看到多了個layout.hbs
。
.
├── node_modules
│ ├── express
│ └── hbs
├── package.json
├── public
│ └── style.css
└── views
├── index.hbs
├── layout.hbs └── profile.hbs
layout.hbs
的內容如下:
}title> head> }} body> html>
相應的,index.hbs
調整為
demo by }h1> }: welcome to homepage, i'm handsome!p>
再次訪問 可以看到返回的頁面
在專案中,我們會有這樣的需求。頁面的基礎骨架是共享的,但某些資訊,每個頁面可能是不同的,比如引用的css檔案、meta標籤等。那麼,除了上面提到的「繼承」之外,還需要引入類似「覆蓋」的特性。
var blocks = {};
hbs.registerhelper('extend', function(name, context) block.push(context.fn(this)); // for older versions of handlebars, use block.push(context(this)); }); hbs.registerhelper('block', function(name) );
此外,layout.hbs
需要做點小改動。裡面比較明顯的變化是加入了下面的block標記
}}
}}
那麼,可以在index.hbs
裡對這些標記的內容進行覆蓋(或者說自定義),包括其他的模版,如果有需要,都可以對這兩個`block進行覆蓋。
} }let the magic begin }document.write('foo bar!'); script> }
那麼問題來了。如果有這樣的需求:所有的頁面,都引用style.css
,只有index.hbs
引用index.css
,那麼上面的改動還不足以滿足這個需求。
var blocks = {};
hbs.registerhelper('extend', function(name, context) block.push(context.fn(this)); // for older versions of handlebars, use block.push(context(this)); }); // 改動主要在這個方法 hbs.registerhelper('block', function(name, context) );
Express 使用模版渲染
express可以使用jade,ejs作為模版引擎進行模版渲染,預設是jade,使用ejs作為模版引擎需要進行設定 設定模版檔案目錄 設定模版引擎const express require express 設定模版檔案目錄 設定模版引擎 在templates site index.ejs中渲染tit...
模版引擎總結之綜合分析模版引擎
方式一 var str function template filename,data filename代表模版檔案的路徑 方式二 template.compile source,options 返回渲染函式 方式三 template.render source,data,options 返回渲染結...
MGTemplateEngine模版引擎
如果你用過php的smarty,你一定知道模板引擎說的是什麼。matt gemmell開發了乙個基於cocoa的類似的模板引擎,叫做mgtemplateengine。mgtemplateengine是一套cocoa的模板系統,基於模板和資料來生成文字輸出,非常類似smarty freemarker和...