前端模板預編譯技術

什么是前端模板預編譯

前端模板預編譯通過預編譯技術讓前端模板突破瀏覽器限制,實現后端模板一樣的同步“文件”加載能力。它采用目錄來組織維護前端模板,從而讓前端模板實現工程化管理,最終保證前端模板在復雜單頁 web 應用下的可維護性。同時預編譯輸出的代碼經過多層優化,能夠在最大程度節省客戶端資源消耗。

按文件與目錄組織模板

template('tpl/home/main', data)

模板支持引入子模板

{{include '../public/header'}}

  

TmodJS 一經啟動,就無需人工干預,每次模板創建與更新都會自動編譯,引入一個 js 即可使用template(path)接口調用本地模板文件,直到正式上線都無需對代碼進行任何修改,整個過程簡單自然。

強大之處

  1. 編譯模板為不依賴引擎的 js 文件
  2. 前端模板按文件與目錄組織
  3. 模板之間支持引入外部模板
  4. 使用同步模板加載接口
  5. 可選多種規范的模塊輸出:AMD、CMD、CommonJS
  6. 支持作為 GruntJS 的插件構建項目
  7. 模板目錄可被前后端共享
  8. 支持檢測修改即時編譯
  9. 支持模板運行時調試
  10. 配置文件支持多人共享

使用tmodJS

全局安裝

npm install -g tmodjs

編寫模板

TmodJS 的前端模板不再耦合在業務頁面中,而是和后端模板一樣有專門的目錄管理。目錄名稱只支持英文、數字、下劃線的組合,一個模板對應一個.html文件。

模板語法

和artTemplate一脈相承,建議協同使用。

表達式

{{ 與 }} 符號包裹起來的語句則為模板的邏輯表達式。

輸出表達式

對內容編碼輸出:

{{content}}

不編碼輸出(編碼可以防止數據中含有 HTML 字符串,避免引起 XSS 攻擊)

{{#content}}

條件表達式

{{if admin}}<p>admin</p>
{{else if code > 0}}<p>master</p>
{{else}}<p>error!</p>
{{/if}}

遍歷表達式

無論數組或者對象都可以用 each 進行遍歷。

{{each list as value index}}<li>{{index}} - {{value.user}}</li>
{{/each}}

亦可以被簡寫:

{{each list}}<li>{{$index}} - {{$value.user}}</li>
{{/each}}

模板包含表達式

用于嵌入子模板:

{{include 'template_name'}}

子模板默認共享當前數據,亦可以指定數據:

{{include 'template_name' news_list}}

include 路徑規范約定

  1. 路徑不能帶后綴名
  2. 路徑不能夠進行字符串運算
  3. 路徑不能使用變量代替
  4. 必須使用以.開頭的相對路徑

輔助方法

{{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,可選cmdamdcommonjs
  • --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

指定格式(amd / cmd / commonjs)

此時每個模板就是一個單獨的模塊,無需引用 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}
}

這里寫圖片描述

gulp配置

讓 TmodJS 作為 Gulp 的一個插件使用:

npm install gulp-tmod --save-dev

由@lichunqiang開發,項目主頁:https://github.com/lichunqiang/gulp-tmod

常見Q&A

問: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。

轉載于:https://www.cnblogs.com/jiaxinjie/p/6185985.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456699.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456699.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456699.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python如何生成windows可執行的exe文件

打包工具 pyinstaller 安裝pyinstaller 如果你的網絡穩定&#xff0c;通常直接使用下面的命令安裝即可&#xff1a; pip install pyinstaller 當然了&#xff0c;你也可以下載pyinstaller源碼包&#xff0c;然后進入包目錄執行下面的命令&#xff0c;同樣可以安裝&#xff…

招商銀行信用卡中心華泰證券暑期實習軟開筆試小結

白菜自動化小碩一枚&#xff0c;18屆&#xff0c;下學期就正式要找工作了&#xff0c;沒有實習經驗&#xff0c;感覺心慌慌。現在學校里已經開始各種提前招實習&#xff0c;內推了&#xff0c;so暑假想提前試試水&#xff0c;投一投暑期實習。 看到心水的單位就投一投&#xff…

理想的程序猿

出處 | http://guoze.me 最近看到的一篇不錯的文章&#xff0c;分享一下。 我算是靠坑蒙拐騙進了程序員的門&#xff0c;然后一路狂奔。26歲之前幾乎沒有任何寫代碼的經驗&#xff0c;研究生畢業卻意外選擇了一家不可能提供培訓的初創公司&#xff0c;在每日擔憂公司倒閉、害…

node08-express

目錄&#xff1a;node01-創建服務器 node02-util node03-events node04-buffer node05-fs node06-path node07-http node08-express node09-cookie express模塊&#xff1a; 1 /*2 * express是一個應用框架3 * 1、路由4 * 2、中間件5 * 3、模板引擎6 * */7 8 var express requ…

【python】1. 兩數之和

給定一個整數數組 nums 和一個目標值 target&#xff0c;請你在該數組中找出和為目標值的那 兩個 整數&#xff0c;并返回他們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;你不能重復利用這個數組中同樣的元素。 示例: 給定 nums [2, 7, 11, 15], t…

The user specified as a definer (#39;root#39;@#39;%#39;) does not exist

&#xfeff;&#xfeff;通常是因為root用戶對全局host無訪問權限。因此僅僅要給root用戶加入一個訪問權限就可以。解決的方法&#xff1a; 登陸mysql 。運行 mysql -u root -pPasswd mysql >grant all privileges on *.* to root"%" identified by "Passwd…

Java基礎常見筆試題總結

以下是自己總結的一些Java常見的基礎知識題&#xff0c;答案僅供參考&#xff0c;如有異議請指出。一直保持更新狀態。 1.什么是Java虛擬機&#xff1f;為什么Java被稱作是“平臺無關的編程語言”&#xff1f; Java虛擬機是一個可以執行Java字節碼的虛擬機進程。Java源文件被編…

ThreadLocal的練習代碼

場景: 有三個小孩兒,買了一個變形金剛玩具(Transformer).... 三個小孩都爭著玩這個玩具....沒有一個人可以玩... 第一種方式:每個人各玩一會.... 第二種方式:再買兩個玩具,一個人玩一個. 每個小孩都當成一個線程.三個小孩就有三個線程. Child.java 2 3 import java.util.Random…

nginx+uwsgi部署Django

本篇文章主要介紹了解決nginxuwsgi部署Django的所有問題(小結)&#xff0c;小編覺得挺不錯的&#xff0c;現在分享給大家&#xff0c;也給大家做個參考。一起跟隨小編過來看看吧 最近&#xff0c;自己暑假寫的小項目也算完畢了&#xff0c;想著投放到自己云服務器上&#xff0…

$(document).scrollTop()與$(window).scrollTop()

$(document).scrollTop() 獲取垂直滾動的距離 即當前滾動的地方的窗口頂端到整個頁面頂端的距離 要獲取頂端 只需要獲取到scrollTop()0的時候 就是頂端了 要獲取底端 只要獲取$(document).scrollTop()>(document).height()?(window).height() 就可以知道已經…

各種機器學習開源項目精選TOP30

8800個機器學習開源項目為你精選TOP30&#xff01; 授權自AI科技大本營&#xff08;ID: rgznai100) 本文共圖文結合&#xff0c;建議閱讀5分鐘。 本文為大家帶來了30個廣受好評的機器學習開源項目。 最近&#xff0c;Mybridge發布了一篇文章&#xff0c;對比了過去一年中機…

Python中is與==的使用區別詳解

>>> a 1000 >>> b 1000 >>> print(id(a),id(b)) 2689566689904 2689566688880 >>> a ,b 1000,1000 >>> print(id(a),id(b)) 2689566689968 2689566689968 一行執行的用一個id地址 分行執行用兩個地址

解決:Please specify a different SDK name--PyCharm報錯

這個問題出現的原因是因為PyCharm中存在相同名字的虛擬環境變量。 本人的出錯原因是&#xff0c;一直使用PyCharm的默認設置來建立工程&#xff0c;所以每個工程都建立了自己獨立的虛擬環境。 我個人刪除了一些工程后&#xff0c;又建立相同名字的工程。所以才會出現存在相同…

Tomcat控制臺輸出到文件

為什么80%的碼農都做不了架構師&#xff1f;>>> 修改startup.bat call "%EXECUTABLE%" start %CMD_LINE_ARGS% 為 call "%EXECUTABLE%" run %CMD_LINE_ARGS% >> ..\logs\test.log 轉載于:https://my.oschina.net/cccyb/blog/886047

常見算法詳解(原理及代碼實現Python版本)

文章目錄前言1、冒泡排序2、選擇排序3、插入排序4、希爾排序5、快速排序6、歸并排序7、二分法查找總結前言 最近復習了下常見的算法&#xff0c;在這里手動再寫一遍&#xff0c;權當加深自己的印象。代碼實現用的是python3.6版本。 1、冒泡排序 原理&#xff1a; 冒泡排序&a…

解決:pycharm運行程序時在Python console窗口中運行 ?????????????1?????

解決&#xff1a;pycharm運行程序時在Python c 問題&#xff1a; 在pycharm中右鍵點擊run運行程序&#xff0c;發現沒有打開run窗口運行&#xff0c;而是在Python console窗口中運行的。 解決方法&#xff1a; 打開菜單欄 run->edit configurations&#xff0c; 把下圖中的…

Autowire異常

Autowire異常主要由三個情況發生的 1. 你的ServiceImpl必須以Service或Component注解才行。 2. 自動寫入的時候把接口寫成實現類了&#xff0c;例如 Autowired private BrandServiceImpl brandServiceImpl; 應該是 Autowired private BrandService brandService; 3. 在Dao 類上…

[轉載] 全方位提升網站打開速度:前端、后端、新的技術

原文地址&#xff1a;Building a Shop with Sub-Second Page Loads: Lessons Learned原文作者&#xff1a;Erik Witt譯文出自&#xff1a;掘金翻譯計劃譯者&#xff1a;luoyaqifei校對者&#xff1a;Romeo0906&#xff0c;L9m全方位提升網站打開速度&#xff1a;前端、后端、新…

20個頂級大數據軟件應用程序

目錄1. Domo2. Teradata Database3. Hitachi Vantara4. TIBCO公司的Statistica5. Panoply6. IBM Watson Analytics7. SAS Visual Analytics8. Sisense商業智能軟件9. Talend的大數據工作室10. Cloudera11. MongoDB12. Vertica Analytics Platform13. SAP Vora14. Oracle Big Da…

python完成‘21點游戲’

完成‘21點游戲’ 人機對戰&#xff1a; 輸入玩家姓名&#xff1a;玩家可以多次要牌&#xff0c;其中JQK&#xff0c;大小王是半點&#xff0c;其他是正常點數&#xff0c;玩家每要一次牌就打印下當前點數和系統點數。可以設置系統&#xff1a;只要大于等于21點就不要牌了&am…