js 模板引擎 - 超級強大

来源:http://www.cnblogs.com/cnatcn/archive/2016/06/08/qianduan-js-mobanyinqing.html
-Advertisement-
Play Games

本來沒想寫這篇文章,但是網上誤導大眾的文章太多了,所以今天就抽出半小時時間談一下我對前端模板引擎的感受吧。 前端模板引擎相信大家都再熟悉不過了,市面上非常多的號稱最好、最快、最牛逼的,隨便就能找到一大把,但是真的深層次的對比才能發現其中的優劣,經過這段時間對各個模板引擎的使用分析,最終選定一款,也是 ...


本來沒想寫這篇文章,但是網上誤導大眾的文章太多了,所以今天就抽出半小時時間談一下我對前端模板引擎的感受吧。

前端模板引擎相信大家都再熟悉不過了,市面上非常多的號稱最好、最快、最牛逼的,隨便就能找到一大把,但是真的深層次的對比才能發現其中的優劣,經過這段時間對各個模板引擎的使用分析,最終選定一款,也是目前我見過的最為強大的模板引擎:nodetpl

官網地址:http://www.nodetpl.com/cn/

這篇博客是本人的使用心得,不同意見的可以留言一起討論。

nodetpl 相比其它幾款模板,有非常獨特的地方:

1. 完美支持模板級樣式,有效解決樣式衝突問題,別的模板幾乎都沒做到

考察了市面上多款模板引擎,包括國外用的比較多的模板引擎,幾乎都無法完美地支持模板級CSS和JS,這給平時開髮帶來許多不便。

模板應當是一個獨立的模塊,不管應用到任何一個頁面,他都不應當由外部定義樣式或者綁定事件,nodetpl 這一點做的比較好,下麵是一個簡單的例子:

模板代碼:

<style>
h1 {
  color: #f00;
}
</style>
<div id="$ROOT">
  <h1>Hello <?=@name?></h1>
</div>

調用:

nodetpl.render(html, {
  name: 'zhangsan'
}, function(d) {
  console.log(d);
});

最終編譯後的結果是這樣的:

<style>#nodetpl_g_002501583635846283 h1 {  color: #f00;}</style>
<div id="nodetpl_g_002501583635846283">
  <h1>Hello zhangsan</h1>
</div>

非常神奇,nodetpl 自動解析成一個 ID 為 nodetpl_g_002501583635846283 的DOM,樣式能夠完美地運行在當前模板中,而且不會影響到外部頁面!

2. 支持模板級js,同樣,別的模板也不具備這功能

同樣,書寫模板的 js 代碼也和上面 CSS 一樣做了強大的隔離:

模板代碼:

<style>
...
</style>
<div id="$ROOT">
  <h1>Hello <?=@name?></h1>
</div>
<script>
ROOT.style.border = '1px solid #00f';
</script>

在 js 裡面直接操作 “ROOT” 就可以了。

可以認為一個模板就是一個完完全全獨立的盒子,該盒子可以運行在任何頁面中,而不會對任何環境引發衝突。

用過其他的模板,平時使用不感覺有問題,但是時間久了,就會引發這樣那樣的問題,原因就是模板沒有很好地做好樣式和JS的隔離,比如:調用了 a 模板,然後又調用了 b 模板,由於 a 模板 和 b 模板裡面都定義了一個同名的 css,最終造成兩個模板的樣式亂掉,js也同樣存在衝突的問題,這個問題將會非常被動。

3. 支持 AMD / CMD,甚至 ES6

由於公司涉及到前端項目、後端項目(node.js),同時由於歷史原因,前端代碼有用 seajs 的,有的是頁面直接調用的,發現 nodetpl 能夠相容各種開發模式:

頁面直接引用、seajs引用、node.js 服務端引用,perfect!

目前 ES6 公司還沒用到,不過看似蠻弔的。

4. 支持所有js語法,上手容易,是團隊開發不錯的選型

當初公司選型的時候,對比過幾款,不過最終因為學習成本較高而放棄,畢竟是團隊開發,讓一個團隊的同事學習一門新的語法,執行起來還是不容易的。

nodetpl 做的不錯,支持所有原生js語法,比如:

<?
  var a=1;
  if(a === 1) {
?>
    <h1>Hello, <?=a?></h1>
<?} else {?>
    <h1>Welcome</h1>
<?}?>
<ul>
<?for(var i=0; i<@users.length; i++) {?>
<li><?=@users[i]?></li>
<?}?>
</ul>

<??> 裡面是純 js,所有人都會寫。

5. 支持複雜的多模板

若一個模板邏輯比較複雜,還可以將模板分割成多個小模板,通過下麵的方式:

<template name="main">
  // template code 1
</template>
<template name="othertemplate">
  // template code 2
</template>

模板之間項目調用直接通過 include('othertemplate') 就包過來了,很方便。

6. 強大的技術支持(作者特勤快,當天反饋問題幾乎當天就能發佈新版)

遇到過一次,公司項目需要實現 amd 和 get 共用,nodetpl 當時未能支持,通過QQ與作者協商,作者說評估一下合理性,然後當晚就給回覆,說更新一下新版本吧,你的需求已經支持到了。

7. 性能超級牛叉

別信網上別的一些模板吹噓的什麼性能對比結果什麼的,有的直接做個緩存然後拿來跟別的不緩存的比,當然牛逼了,通過分析 nodetpl 的原理髮現,nodetpl 幾乎不占性能!

官網也給了說明,在有的模式下,直接都不需要引用 nodetpl 類庫,就直接能跑起來!

8. 支持幾乎所有瀏覽器,包括變態的IE6,還支持運行在 node 服務端

目前我司node項目已經在用,框架是express.js,模板引擎是nodetpl

上面只是我幾個月來的感受,還有好多實用功能,就不寫了,感興趣的看官網上的文檔吧。

好多年沒寫博客了,今天一口氣寫這麼多,今天算是力推這款模板吧,不知nodetpl的作者看到會不會請我喝茶,哈哈。。。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 其實php開發中的中文編碼並沒有想像的那麼複雜,雖然定位和解決問題沒有定規,各種運行環境也各不盡然,但後面的原理是一樣的。瞭解字元集的知識是解決字元問題的基礎。 PHP程式設計中中文編碼問題曾經困擾很多人,導致這個問題的原因其實很簡單,每個國家(或區域)都規定了電腦信息交換用的字元編碼集,如美國的 ...
  • 一、重載(overload)指函數名相同,但是它的參數表列個數或順序,類型不同。但是不能靠返回類型來判斷。(1)相同的範圍(在同一個作用域中) ;(2)函數名字相同;(3)參數不同;(4)virtual 關鍵字可有可無。(5)返回值可以不同; 二、重寫(也稱為覆蓋 override)是指派生類重新定 ...
  • 1.什麼是JSP內置對象? jsp內置對象就是Web容器創建的一組對象,我們都知道Tomcat可以看成是一種Web容器,所以我們可以知道所謂的內置對象Tomcat創建的,使用內置對象時可以不適用new關鍵字, 直接使用即可. 2.什麼是內置對象? 解析:就是Web容器創建的一組對象,當Tocmat啟 ...
  • 在使用 masonry 框架實現自動佈局時,在程式里為一個佈局穿插著6行左右這樣的代碼 [View mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(anotherView); make.left.equalTo(a ...
  • 參考資料: Python:http://www.runoob.com/python/python-intro.html Python爬蟲系列教程:http://www.cnblogs.com/xin-xin/p/4297852.html 正則表達式:http://www.cnblogs.com/de ...
  • 本文介紹了抽象工廠模式的概念,UML類圖,優缺點,實現方式以及(未)遵循的OOP原則。同時結合J2EE中常用的DAO實例詳解了抽象工廠模式的實現。 ...
  • 獲取【下載地址】 【免費支持更新】三大資料庫 mysql oracle sqlsever 更專業、更強悍、適合不同用戶群體【新錄針對本系統的視頻教程,手把手教開發一個模塊,快速掌握本系統】 A集成代碼生成器 [正反雙向(單表、主表、明細表、樹形表,開發利器)+快速構建表單;freemaker模版技術 ...
  • 1.意圖 為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。 2.動機 將一個系統劃分成若幹子系統有利於降低系統的複雜性。一個常見的設計目標是使子系統間的通信和相互依賴達到最小。達到該目標的途徑之一是引入一個外觀對象,它為子系統提供了一個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...