模板的誕生是為了將顯示與資料分離,模板技術多種多樣,但其本質是將模板檔案和資料通過模板引擎生成最終的html**。目前有著很多這種模板引擎,諸如node的ejs
,jade
,php的smarty
。當然在用過這麼多的模板引擎後,也有著自己實現乙個簡易模板引擎的衝動。於是今天就實現了乙個簡單的模板引擎,這個模板引擎非常簡單,並不會涉及到語法分析,詞法分析等編譯原理相關知識,做的僅僅是將模板的js
**執行。下面來和大家分享下:
語法參照的是ejs
:
看下需要實現的目標:
// 模板**
下面來考慮下,其實形成上述的html
的話,利用js
拼接字串就可以做到,那麼對於模板來說,是不是可以將模板內的js
**轉化為原生js
**從而來實現呢?沒錯,這個簡單的模板引擎幹的就是這個事情,就是將模板內的被<% %>
包裹的js
**執行,從而將模板轉為html
。
但是,如何做呢?可以採用function(引數名, 函式主體)
,雖說這個平時不怎麼使用,但是在這個情況下是最好的選擇,將模板內的js
**解析提取後當做引數傳入到function
中:
/**
* 將模板引擎轉化為可用dom字串
* * @param tpl
* @param data 資料物件,為鍵值對形式,鍵值為資料名
* @return
*/function tpl2dom (tpl, data) /g,
quotre = /\"/g,
main = ""; // 函式主體
function fn (d)
}if (!main) ";\n`;
// res就是拼接的html字串
for (var i = 1; i < len; i++) `:
`\n$`;
main += `\nres += "$"`;
}main += "\nreturn res;";
}return data ? fn(data) : fn();
}
利用tpl2dom
函式可以得到html
,那下面在寫乙個函式來將html
轉為dom
節點。從下面的函式可以看出的就是,這個模板引擎所解析的模板,只能有乙個dom
根節點:
var cachediv = document.createelement("div");
/** * 將可用dom字串轉為dom節點
* * @param str
* @return
*/function str2dom (str)
到此為止,模板引擎就基本完成了,既然是仿照的ejs
,那麼在來完善下,比如img_tag
:
// 注意,實現該函式需放到全域性
function img_tag (url) " //>`
}
完整**請見github,當然這個模板引擎只是乙個玩物,並不能用於生產,比如,根本沒有考慮到渲染過程**錯時如何定位到具體位置等問題。 自己動手擼個模板引擎(50行左右)
模板的誕生是為了將顯示與資料分離,模板技術多種多樣,但其本質是將模板檔案和資料通過模板引擎生成最終的html 目前有著很多這種模板引擎,諸如node的ejs,jade,php的smarty。當然在用過這麼多的模板引擎後,也有著自己實現乙個簡易模板引擎的衝動。於是今天就實現了乙個簡單的模板引擎,這個模...
自己動手擼乙個靜態部落格生成器
國慶期間試著擼了個靜態部落格工具 歡迎一起交流 github.com laoqiren yo npm npm npm 乙個靜態部落格生成器,採用node.js開發。yohe 喲呵,乙個會讓你發出 喲呵,不錯哦 感嘆的靜態部落格生成器。線上demo luoxia.me yohe site englis...
自己動手製作乙個簡易的shell
本人最近在看 unix環境高階編層 其上面的程式清單1 5的程式介紹了如何製作乙個shell,而後本人又做了一點改進,改進的地方如下 1.為了方便檢視,刪除了原來的err sys 函式和其自定義的 apue.h 這個標頭檔案!2.增加了對於命令選項處理的功能,但是不是很強大,目前只能處理單個引數!本...