ejs模板

現(xiàn)在整理ejs模板有點(diǎn)太old school了,而且實(shí)際使用下來(lái)感覺(jué)沒(méi)有jade模板便利(純屬個(gè)人愛(ài)好),但公司有的項(xiàng)目中有用到ejs,日常還是需要做點(diǎn)維護(hù)的,因此抽個(gè)時(shí)間整理一下ejs。

  • 安裝與使用
  • options
  • 標(biāo)簽
  • include
  • 過(guò)濾器
  • 自定義分隔符

安裝與使用

安裝TJ大神的ejs模板的安裝非常簡(jiǎn)單:

npm install ejs

使用的話,先定義ejs模板:

<% if (user) { %>
    <h2><%= user.name %></h2>
<% } %>

用compile API加載ejs模板:

var ejs = require('ejs');
…
var template = ejs.compile(str, options);       // compile的返回值是一個(gè)function
template(data);

也可以用render API來(lái)加載ejs模板,兩種方式是等價(jià)的:

var ejs = require('ejs');
…
ejs.render(str, data, options);     // render的返回值是最終結(jié)果string

options

無(wú)論是compile還是render都有參數(shù)options,用于指定如何加載ejs模板:

cache:true,         //是否對(duì)結(jié)果進(jìn)行緩存(需要filename)
filename:"path",  //cache的key,用于include指令中
scope:"this",      //指定函數(shù)執(zhí)行的上下文對(duì)象
debug:true,         //輸出生成的函數(shù)體
compileDebug:false,     //為false時(shí),debug指令不會(huì)被編譯
client:"",           //返回獨(dú)立的編譯后的函數(shù)
open:"<%",      //指定開(kāi)標(biāo)簽 
close:"%>",         //指定閉標(biāo)簽 

標(biāo)簽

模板的核心就是標(biāo)簽了,如果你用過(guò)世界上最好的語(yǔ)言PHP,那對(duì)這種方式一定不會(huì)陌生:

<% %>       //普通流程標(biāo)簽
<%= %>     //輸出轉(zhuǎn)義后的HTML標(biāo)簽。例如<div>Hello</div>輸出后會(huì)變成<div>Hello</div>
<%- %>      //輸出不轉(zhuǎn)義的HTML標(biāo)簽
<%# %>     //注釋標(biāo)簽,不會(huì)被執(zhí)行,也不會(huì)被輸出
-%>           //去掉后面的換行符

include

如果你定義了一段ejs模板作為公共模板,現(xiàn)在想引用這段公共模板的話,可以用include指令,需要在options里指定filename,否則指令不知道去哪個(gè)地方找文件。例如你有./views/users.ejs和./views/user/show.ejs。你要在users.ejs里引入show.ejs可以:

<ul>
    <% users.forEach(function(user){ %>
        <%- include('user/show', {user: user}) %>   //用<%-避免二次轉(zhuǎn)義
    <% }) %>
</ul>

也可以將路徑作為參數(shù)傳入include指令:

<%- include(somePath) %>

過(guò)濾器

用于將結(jié)果進(jìn)一步加工的API,例如ejs模板:

<p><%=: users | map:'name' | join %></p>    //注意起始的:和中間的|標(biāo)記

加載該ejs模板:

ejs.render(str, {
    users: [
      { name: 'tj' },
      { name: 'mape' },
      { name: 'guillermo' }
    ]
});
// 結(jié)果是:<p>Tj, Mape, Guillermo</p>

TJ大神的ejs模板提供了以下過(guò)濾器API:

first                                    //返回?cái)?shù)組的第一個(gè)元素
last                                      //返回?cái)?shù)組的最后一個(gè)元素
capitalize                           //返回首字母大寫(xiě)的字符串
downcase                            //返回小寫(xiě)字符串
upcase                              //返回大寫(xiě)字符串
sort                                      //排序
sort_by:'prop'                     //根據(jù)指定的屬性排序
size                                      //返回字符串長(zhǎng)度
length                                 //返回?cái)?shù)組長(zhǎng)度
plus:n                                  //加上n,并轉(zhuǎn)為Number進(jìn)行運(yùn)算
minus:n                              //減去n,并轉(zhuǎn)為Number進(jìn)行運(yùn)算
times:n                               //乘以n,并轉(zhuǎn)為Number進(jìn)行運(yùn)算
divided_by:n                          //除以n,并轉(zhuǎn)為Number進(jìn)行運(yùn)算
join:','                                     //將數(shù)組用指定的字符合并成字符串
truncate:n                            //截取前n個(gè)字符,超過(guò)長(zhǎng)度時(shí),返回一個(gè)副本
truncate_words:n                  //截取字符串前n個(gè)word(word用空格分隔)
replace:pattern,substitution   //字符串替換,substitution不提供將刪除匹配的子串
prepend:val                        //將val添加在字符串前面
append:val                          //將val添加在字符串后面
map:'prop'                          //返回?cái)?shù)組中屬性為prop的value組成的數(shù)組
reverse                              //反轉(zhuǎn)數(shù)組或字符串
get:'prop'                            //獲取屬性為prop的value

自定義分隔符

恕我淺薄,實(shí)在想不出有什么應(yīng)用場(chǎng)景。如果你對(duì)ejs默認(rèn)的<% %>覺(jué)得審美疲勞,你可以自定義開(kāi)閉標(biāo)簽,例如定義成<? ?>

ejs.open = '<?';
ejs.close = '?>';

<h1><?= title ?></h1>

或定義成{{ }}:

ejs.open = '{{';
ejs.close = '}}';

<h1>{{= title }}</h1>

總結(jié)

除了TJ大神的ejs模板,還有其他版本的ejs,都大同小異。在例如Node,Express等開(kāi)源項(xiàng)目中都能見(jiàn)到ejs的身影,為前后端分離做出了很大的貢獻(xiàn)。我個(gè)人感覺(jué)Jade更簡(jiǎn)潔易讀,但也看到Web上很多人不同意這個(gè)觀點(diǎn),這純屬個(gè)人愛(ài)好。所以在公司的項(xiàng)目中,同時(shí)使用Jade和ejs _

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • MEAN 全棧開(kāi)發(fā)系列文章,這里只是授課的部分課件,目的是為了便于學(xué)生在課外參考。 什么是模板引擎 模板引擎(Te...
    全棧開(kāi)發(fā)之道閱讀 1,496評(píng)論 0 3
  • 0x01 什么是 ejs 模板 使用過(guò) react.js 的朋友應(yīng)該知道 JSX 語(yǔ)法,其實(shí) ejs 模板與其類(lèi)似...
    小菜荔枝閱讀 2,592評(píng)論 0 2
  • 最近在用nodejs將公司商城的底層重寫(xiě)?;趎odejs的強(qiáng)大,我從原本的只寫(xiě)前端變成了寫(xiě)全棧??蚣懿捎胑xpr...
    小飛牛牛閱讀 7,335評(píng)論 9 6
  • 使用 vs創(chuàng)建的express站點(diǎn),默認(rèn)使用的是jade模板引擎,但是我不太喜歡這種方式,因?yàn)槲矣X(jué)得html本身的...
    ddai_Q閱讀 9,416評(píng)論 2 4
  • 我媽生我那會(huì),正是計(jì)劃生育搞得火熱的時(shí)候。我奶肯定希望我媽生個(gè)男娃,可誰(shuí)知道生了個(gè)女娃。哎,女娃就女娃吧...
    路三閱讀 170評(píng)論 0 0

友情鏈接更多精彩內(nèi)容