自己動手擼個簡易模板引擎(50行左右)

2021-09-18 03:01:47 字數 1806 閱讀 4279

模板的誕生是為了將顯示與資料分離,模板技術多種多樣,但其本質是將模板檔案和資料通過模板引擎生成最終的html**。目前有著很多這種模板引擎,諸如node的ejsjade,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.增加了對於命令選項處理的功能,但是不是很強大,目前只能處理單個引數!本...