建立AMD乒融、CMD掰盘、nodeJS通用的模板引擎,并封裝發(fā)布到npm赞季,方便使用

首先我們先來寫一個(gè)簡單的模板引擎代碼
var str = "My name is {{name}},I'm {{age}} years old";

var regex = /{{([a-zA-Z_$][0-9a-zA-Z\._$]*)}}/g;

 //match 匹配的字串
 //key 匹配正則括號(hào)中的值(如有多個(gè)括號(hào)就會(huì)有多個(gè)值)
 //offset 匹配字串的偏移量
 //string 整個(gè)字符串

  var data = {
  name: 'jimmy',
  age: 25,
  sex: '男',
  friend: {
    name: 'tom'
  }
};

var tpl = str.replace(regex, function(match, key, offset, string){
  return data[key] || match;
});

console.log(tpl);//"My name is jimmy,I'm 25 years old"

優(yōu)化簡單的模板引擎代碼

上面的代碼有缺陷愧捕,如果在對象中有嵌套層的話,那么是無法被上面的正則匹配替換的申钩。

將上述代碼{{name}}修改成{{friend.name}}則不替換:

var str = "My {{friend.name}} is jimmy,I'm {{age}} years old";
console.log(tpl);//"My {{friend.name}} is jimmy,I‘m 25 years old"

現(xiàn)在我們來修改下代碼:

//match 匹配的字串
//key 匹配正則括號(hào)中的值
//offset 匹配字串的偏移量
//string 整個(gè)字符串
var a = str.replace(regex, function(match, key, offset, string){
  var keys = key.split('.'),
      obj = data;
  while(keys.length > 0) {
    key = keys.shift();
    obj = obj[key];
  }
  return obj || match;
});

console.log(a);//"My name is tom,I'm 25 years old"次绘;

我們將{{friend.name}} 中的friend.name 通過 split('.') 截取成數(shù)組形成["friend", "name"],并且通過判斷長度length撒遣,循環(huán)調(diào)出最里面的值邮偎,直到循環(huán)到最里層,取到想要的值
相當(dāng)于:

//第一次循環(huán):
 obj = obj[key];//{name:"tom"}
//第二次循環(huán):
 obj = obj[key];//tom

那么現(xiàn)在來寫成函數(shù)
function easyTpl(data, str) {
  var regex = /{{([a-zA-Z_$][0-9a-zA-Z\._$]*)}}/g;
  var result = str.replace(regex, function(match, key, offset, string) {
    var keys = key.split('.'),
      obj = data;
    while (keys.length > 0) {
      key = keys.shift();
      obj = obj[key];
    }
    return obj || match;
  });
  return result;
}

var tpl = easyTpl(data, str);
console.log(tpl);

準(zhǔn)備封裝

首先封裝的代碼不僅要起到隔離作用域的作用义黎,并且要能夠在CMD禾进、AMD、nodejs中通用使用廉涕,也就是說將這段封裝好的代碼移到各自環(huán)境中泻云,自己匹配適合的代碼生成模塊。

我們先來定義一個(gè)自執(zhí)行函數(shù)

(function(name, definition, context){
  //TODO::
})(name, function(){}, this);

自執(zhí)行函數(shù)將要接受 一個(gè)(定義的函數(shù)名狐蜕,函數(shù)宠纯,作用域)

那么我們一步一步添加

(function(name, definition, context){
  if(typeof module != 'undefined' && module.exports){
    //在 node 環(huán)境中
    module.exports = definition();
  } else if (typeof context['define'] == 'function' && (context['define']['amd']) || typeof context['define'] == 'function' && (context['define']['cmd'])) {
    //在 AMD(requirejs) 或者 在 CMD(seajs) 環(huán)境中 
    define(definition);
  } else{
    //在客戶端client中 
    context[name] = definition();
  }
})(name, function(){}, this);

在這段代碼中,
第一個(gè)if判斷語句
通過能力檢測判斷 module 层释,module是在node環(huán)境中才有的方法婆瓜,并且module.exports存在,在將函數(shù)definition放進(jìn)mudule.exports 環(huán)境中,成為node環(huán)境下的代碼湃累。
第二個(gè)判斷語句
通過能力檢測判斷context['define']['amd']或context['define']['cmd']并且都判斷context是一個(gè)函數(shù)勃救,這樣說明在CMD或者AMD環(huán)境下,他們的定義磨礦化函數(shù)的方式都是difine(),所以通用格式寫成 difine(definition)治力。

最后一個(gè)是在不是 nodejs 和 CMD AMD 環(huán)境下 蒙秒,默認(rèn)在客戶端window環(huán)境下,所以context 等于 window 宵统。在window全局作用域下添加變量名name晕讲,并放入definition函數(shù)


完整代碼可以寫成
(function(name, definition, context) {
  if (typeof module != 'undefined' && module.exports) {
    //在 node 環(huán)境中
    module.exports = definition();
  } else if (typeof context['define'] == 'function' && (context['define']['amd']) || typeof context['define'] == 'function' && (context['define']['cmd'])) {
    //在 AMD(requirejs) 或者 在 CMD(seajs) 環(huán)境中 
    define(definition);
  } else {
    //在客戶端中 client
    context[name] = definition();
  }
})('easyTpl', function() {
  return function(data, str) {
    var regex = /{{([a-zA-Z_$][0-9a-zA-Z\._$]*)}}/g;
    return str.replace(regex, function(match, key, offset, string) {
      var keys = key.split('.'),
        obj = data;
      while (keys.length > 0) {
        obj = obj[keys.shift()];
      }
      return obj || match;
    });
  }
}, this);

最后 命令行操作
通過 npm init 生成packge.json
npm login
npm publish 發(fā)布上線
并通過 npm官網(wǎng)查找
下次自己使用通過 npm intall xxx 即可下載安裝到 全局或者 當(dāng)前文件夾的 node_modules中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末马澈,一起剝皮案震驚了整個(gè)濱河市瓢省,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痊班,老刑警劉巖勤婚,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涤伐,居然都是意外死亡馒胆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進(jìn)店門凝果,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祝迂,“玉大人,你說我怎么就攤上這事器净⌒亡ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵山害,是天一觀的道長纠俭。 經(jīng)常有香客問我,道長浪慌,這世上最難降的妖魔是什么柑晒? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮眷射,結(jié)果婚禮上匙赞,老公的妹妹穿的比我還像新娘。我一直安慰自己妖碉,他們只是感情好涌庭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著欧宜,像睡著了一般坐榆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冗茸,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天席镀,我揣著相機(jī)與錄音匹中,去河邊找鬼。 笑死豪诲,一個(gè)胖子當(dāng)著我的面吹牛顶捷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屎篱,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼服赎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了交播?” 一聲冷哼從身側(cè)響起重虑,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秦士,沒想到半個(gè)月后缺厉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隧土,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年芽死,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片次洼。...
    茶點(diǎn)故事閱讀 38,687評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡关贵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卖毁,到底是詐尸還是另有隱情揖曾,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布亥啦,位于F島的核電站炭剪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏翔脱。R本人自食惡果不足惜奴拦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望届吁。 院中可真熱鬧错妖,春花似錦、人聲如沸疚沐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亮蛔。三九已至痴施,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辣吃。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工动遭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人神得。 一個(gè)月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓厘惦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親循头。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 請參看我github中的wiki炎疆,不定期更新卡骂。https://github.com/ivonzhang/Front...
    zhangivon閱讀 7,117評論 2 19
  • 我的Github(https://github.com/tonyzheng1990/tonyzheng1990.g...
    tonyzheng1閱讀 17,582評論 5 58
  • 概述:項(xiàng)目中經(jīng)常需要使用js模版去渲染字符串,handlebars這樣的模版引擎又過于龐大形入,其實(shí)自己可以完全可以實(shí)...
    饑人谷_若愚閱讀 1,337評論 0 11
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理全跨,服務(wù)發(fā)現(xiàn),斷路器亿遂,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 通知一下:國慶的假期馬上結(jié)束啦Eㄈ簟!蛇数! 小皮鞭揮起來挪钓,我這個(gè)懶癌晚期患者也要好好的寫起來啦! 八耳舅、表白 “哥哥碌上!哥哥...
    月下琉璃微醉閱讀 471評論 2 4