前端模板預編譯經過預編譯技術讓前端模板突破瀏覽器限制,實現後端模板同樣的同步「文件」加載能力。它採用目錄來組織維護前端模板,從而讓前端模板實現工程化管理,最終保證前端模板在複雜單頁 web 應用下的可維護性。同時預編譯輸出的代碼通過多層優化,可以在最大程度節省客戶端資源消耗。javascript
template('tpl/home/main', data)
{{include '../public/header'}}
TmodJS 一經啓動,就無需人工干預,每次模板建立與更新都會自動編譯,引入一個 js 便可使用template(path)接口調用本地模板文件,直到正式上線都無需對代碼進行任何修改,整個過程簡單天然。html
npm install -g tmodjs
TmodJS 的前端模板再也不耦合在業務頁面中,而是和後端模板同樣有專門的目錄管理。目錄名稱只支持英文、數字、下劃線的組合,一個模板對應一個.html文件。前端
和artTemplate一脈相承,建議協同使用。java
{{ 與 }} 符號包裹起來的語句則爲模板的邏輯表達式。git
對內容編碼輸出:github
{{content}}
不編碼輸出(編碼能夠防止數據中含有 HTML 字符串,避免引發 XSS 攻擊)web
{{#content}}
{{if admin}} <p>admin</p> {{else if code > 0}} <p>master</p> {{else}} <p>error!</p> {{/if}}
不管數組或者對象均可以用 each 進行遍歷。npm
{{each list as value index}} <li>{{index}} - {{value.user}}</li> {{/each}}
亦能夠被簡寫:json
{{each list}} <li>{{$index}} - {{$value.user}}</li> {{/each}}
用於嵌入子模板:gulp
{{include 'template_name'}}
子模板默認共享當前數據,亦能夠指定數據:
{{include 'template_name' news_list}}
{{time | dateFormat:'yyyy-MM-dd hh:mm:ss'}}
支持傳入參數與嵌套使用:
{{time | say:'cd' | ubb | link}}
爲了模板可維護,模板自己是不能隨意訪問外部數據的,它全部的語句都將運行在一個沙箱中。若是須要訪問外部對象能夠註冊輔助方法,這樣全部的模板都能訪問它們。
新建一個輔助方法文件配置
在模板目錄新建一個 config/template-helper.js 文件,而後編輯 package.json 設置」helpers」: 「./config/template-helper.js」。
編寫輔助方法
在 config/template-helper.js 中聲明輔助方法。
以日期格式化爲例:
template.helper('dateFormat', function (date, format) { date = new Date(date); var map = { "M": date.getMonth() + 1, //月份 "d": date.getDate(), //日 "h": date.getHours(), //小時 "m": date.getMinutes(), //分 "s": date.getSeconds(), //秒 "q": Math.floor((date.getMonth() + 3) / 3), //季度 "S": date.getMilliseconds() //毫秒 }; format = format.replace(/([yMdhmsqS])+/g, function(all, t){ var v = map[t]; if(v !== undefined){ if(all.length > 1){ v = '0' + v; v = v.substr(v.length-2); } return v; } else if(t === 'y'){ return (date.getFullYear() + '').substr(4 - all.length); } return all; }); return format; });
調用:
{{time | dateFormat:'yyyy-MM-dd hh:mm:ss'}}
只須要運行tmod這個命令便可,默認配置參數能夠知足絕大多數項目。
tmod [模板目錄] [配置參數]
注意:模板目錄必須是模板的根目錄,若無參數則爲默認使用當前工做目錄,tmodjs 會監控模板目錄修改,每次模板修改都會增量編譯。
--debug
輸出調試版本--charset value
定義模板編碼,默認utf-8
--output value
定義輸出目錄,默認./build
--type value
定義輸出模塊格式,默認default
,可選cmd
、amd
、commonjs
--no-watch
關閉模板目錄監控--version
顯示版本號--help
顯示幫助信息注意:配置參數將會保存在模板目錄配置文件中,下次運行無需輸入配置參數(–no-watch 與 –debug 除外)。
tmod ./tpl --output ./build
根據編譯的 type
的配置不一樣,會有兩種不一樣使用方式:
TmodJS 默認將整個目錄的模板壓縮打包到一個名爲 template.js 的腳本中,可直接在頁面中使用它:
<script src="tpl/build/template.js"></script> <script> var html = template('news/list', _list); document.getElementById('list').innerHTML = html; </script>
RequireJS、SeaJS、NodeJS 加載 在線實例 http://aui.github.io/tmodjs/test/index.html
此時每一個模板就是一個單獨的模塊,無需引用 template.js:
var render = require('./tpl/build/news/list'); var html = render(_list);
注意:模板路徑不能包含模板後綴名
TmodJS 源碼包中test/tpl是一個演示項目的前端模板目錄,基於默認配置。切換到源碼目錄後,編譯:
tmod test/tpl
編譯完畢後你能夠在瀏覽器中打開 test/index.html
查看如何使用編譯後的模板。
TmodJS 的項目配置文件保存在模板目錄的 package.json 文件中:
{ "name": "template", "version": "1.0.0", "dependencies": { "tmodjs": "1.0.0" }, "tmodjs-config": { "output": "./build", "charset": "utf-8", "syntax": "simple", "helpers": null, "escape": true, "compress": true, "type": "default", "runtime": "template.js", "combo": true, "minify": true, "cache": false } }
讓 TmodJS 做爲 Gulp 的一個插件使用:
npm install gulp-tmod --save-dev
由@lichunqiang開發,項目主頁:https://github.com/lichunqiang/gulp-tmod
問:TmodJS 須要部署到服務器中嗎?
不須要,這是本地工具,基於 NodeJS 編寫是爲了實現跨平臺。
問:如何將每一個模板都編譯成單獨的 amd/cmd 模塊輸出?
指定 type 參數便可,如–type cmd則可讓每一個模板都支持 RequireJS/SeaJS 調用。
問:如何將模板編譯成 NodeJS 的模塊?
指定 type 參數便可,如–type commonjs。
問:線上運行的模板報錯了如何調試?
開啓 debug 模式編譯,如–debug,這樣會輸出調試版本,可讓你快速找到模板運行錯誤的語句以及數據。
問:如何不壓縮輸出 js?
編輯配置文件,設置」minify」: false。
問:如何修改默認的輸出目錄?
指定 output 參數便可,如–output ../../build
如何讓模板訪問全局變量?
具體參考上面的 輔助方法。
問:可使用使用相似 tmpl 那種的 js 原生語法做爲模板語法嗎?
能夠。編輯配置文件,設置」syntax」: 「native」便可,目前 TmodJS 默認使用的是 simple 語法。
問:如何兼容舊版本 atc 的項目?
編輯配置文件,分別設置」type」: 「cmd」、」syntax」: 「native」、」output」: 「./」
問:如何遷移原來寫在頁面中的 artTemplate 模板,改成 TmodJS 這種按按文件存放的方式?
參考 《頁面中的模板遷移指南》
問:我須要手動合併模板,如何讓 tmodjs 不合並輸出?
編輯配置文件,設置combo:false。