SlideShare a Scribd company logo
1 of 15
基于 JS 的模板引擎实现思路 偶是来打酱油的…… 貘  2011-06-21
打酱油的来龙去脉 上上期主题:麦霸唐, JQuery Template 好玩,自己写了个 Template(就叫打酱油Template好了) 杭州主题:杜欢(风之石),JavaScript 模板引擎 - easyTemplate 的应用场景及设计实现 SINA 围脖前端在用 easyTemplate  跟杜欢水了下,一时兴起两地同说模板主题 easyTemplate 说明地址http://www.w3cgroup.com/article.asp?id=300 偶对自己的八卦行为表示有点无奈 〒﹃〒〣
例行公事的说下啥要用模板 方便呗 避免来回拼字符串呗 其他各种高级理由 理由都懂的,不多扯了 麦霸唐老师说:各种改!!尼玛伤不起啊!!!-
这个打酱油模板实现了啥 基本语法: ${data.xxx} 引入json数据,引用的数据对象命名为 data 支持一些简单语法标记:${expression}{{if (expression)}}   {{else if (expression)}}  {{else}}  {{/if}}{{for (expression)}} {{/for}}{{switch}}{{case}}{{/case}}{{/switch}} 支持语法标签嵌套错误校验 缓存转为JS源码的模板语句
模板与数据是均从 easyTemplate 无耻抄来的 偶们不谈效率问题~~ 演示~~
使用方法:jsTemplate(data [, sTemplate])
前期思路 JSP 与 Servlet 以第一次执行JSP时,将 JSP 标记解析,生成具体 Servlet Class文件 Servlet 文件内是纯纯的 JAVA <%...%> 标签被解释为 JAVA 代码段 <%=...%>标签被解释为表达式输出 数据变化,JSP文件不再被解析,只运行已编译的Servlet Class 看演示图
<% String message = "message string."; %> <div><%=messagge%></div> JSP public void _jspService(HttpServletRequest request, HttpServletResponse response)     throws java.io.IOException, ServletException {   PageContext pageContext = null;   HttpSession session = null;   ServletContext application = null;   ServletConfig config = null;   JspWriter out = null;   ...   String message = "message string."   out.write("");   out.write("<div>");   out.print(message);   out.write("</div>");   ... } Servlet
原理不变 实现变化 JSP 标记可映射为 JSTemplate 语法标记 Servlet 可映射为将语法标记与内容解析为原生JS程序段源码 Servlet 的执行可以映射为将JS程序源码执行 eval 或 new Function <%...%> 可映射为模板语法标签 {{...}}  <%=...%>可映射为模板输出标签 ${...} 当然,你也可以整自己的标签啦 数据变化后不再重新生成Servlet可以映射为缓存JS源码 看例子
<div>Template</div> {{if (data.length > 0)}}        <div>${data.length}</div> {{/if}} Template var sHtml = []; sHtml .push('<div>Template</div>'); if (data.length > 0) {   sHtml.push('    <div>');   sHtml.push(data.length);   sHtml.push('</div>'); } return sHtml.join(''); JavaScript
实现靠正则 这篇是打酱油的,不细说了,你懂的 用了一些简单的正则 var startSyntaxRegExp = /^*([a-z]+)*(.*)/; var closeSyntaxRegExp = /^*[][a-z]+*$/; var trimRegExp = /(^+)|(+$)/; var quotationRegExp = /(["'])/g; var newLineRegExp = /(|)/g; var expressionRegExp = /{([^{}]*)}/g; var syntaxTokenRegExp = /[{]{2}|[}]{2}/; var slashRegExp = //g; * 你自己实现时可以写个复杂的正则一次性匹配出模板语法元素等,这样或许效率会更高一些。
语法标签嵌套校验 思路很简单就是标签压栈 检测当前栈顶标签与将要入栈标签是否成对 JS 使用数组方法 push/pop 或unshift/shift来实现栈操作
缓存模板 都存起来备用 如果输入模板一致,就不再转换模板到JS代码 执行 JS 代码码,省去模板语法解析转换时间。 模板字符串和JS代码找个闭包放就好了 templateStringCache <div>Template</div> {{if (data.length > 0)}}        <div>${data.length}</div> {{/if}} JavaScriptStringCache var sHtml = []; sHtml .push('<div>Template</div>'); if (data.length > 0) {   sHtml.push('    <div>');   sHtml.push(data.length);   sHtml.push('<div>'); } return sHtml.join('');
Q&A 这个环节就省了吧~~
打酱油 Finished Thanks Zzzz... 貘

More Related Content

Viewers also liked

GitLab 8.6 - Release Webcast
GitLab 8.6 - Release Webcast GitLab 8.6 - Release Webcast
GitLab 8.6 - Release Webcast GitLab, Inc
 
簡介 GitHub 平台
簡介 GitHub 平台簡介 GitHub 平台
簡介 GitHub 平台Will Huang
 
Introduction to Gitlab
Introduction to GitlabIntroduction to Gitlab
Introduction to GitlabJulien Pivotto
 
快快樂樂打造自動化開發環境
快快樂樂打造自動化開發環境快快樂樂打造自動化開發環境
快快樂樂打造自動化開發環境Chen Cheng-Wei
 
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築CROOZ, inc.
 
Git 實務圖解
Git 實務圖解Git 實務圖解
Git 實務圖解Pokai Chang
 
少人数チームにおけるプロジェクト管理のベストプラクティス
少人数チームにおけるプロジェクト管理のベストプラクティス少人数チームにおけるプロジェクト管理のベストプラクティス
少人数チームにおけるプロジェクト管理のベストプラクティスCake YOSHIDA
 
寫給大家的 Git 教學
寫給大家的 Git 教學寫給大家的 Git 教學
寫給大家的 Git 教學littlebtc
 
用十分鐘瞭解 陳鍾誠的程式設計課 (採用JavaScript + C的原因)
用十分鐘瞭解  陳鍾誠的程式設計課  (採用JavaScript + C的原因)用十分鐘瞭解  陳鍾誠的程式設計課  (採用JavaScript + C的原因)
用十分鐘瞭解 陳鍾誠的程式設計課 (採用JavaScript + C的原因)鍾誠 陳鍾誠
 
提到 DevOps 到底在
談些什麼玩意兒?(@ Agile Tour Taichung 2017)
提到 DevOps 到底在
談些什麼玩意兒?(@ Agile Tour Taichung 2017)提到 DevOps 到底在
談些什麼玩意兒?(@ Agile Tour Taichung 2017)
提到 DevOps 到底在
談些什麼玩意兒?(@ Agile Tour Taichung 2017)Chen Cheng-Wei
 

Viewers also liked (14)

GitLab 8.6 - Release Webcast
GitLab 8.6 - Release Webcast GitLab 8.6 - Release Webcast
GitLab 8.6 - Release Webcast
 
Git由超淺入超深
Git由超淺入超深Git由超淺入超深
Git由超淺入超深
 
簡介 GitHub 平台
簡介 GitHub 平台簡介 GitHub 平台
簡介 GitHub 平台
 
Introduction to Gitlab
Introduction to GitlabIntroduction to Gitlab
Introduction to Gitlab
 
Docker & GitLab
Docker & GitLabDocker & GitLab
Docker & GitLab
 
快快樂樂打造自動化開發環境
快快樂樂打造自動化開發環境快快樂樂打造自動化開發環境
快快樂樂打造自動化開發環境
 
Git Tutorial 教學
Git Tutorial 教學Git Tutorial 教學
Git Tutorial 教學
 
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
 
Git 實務圖解
Git 實務圖解Git 實務圖解
Git 實務圖解
 
少人数チームにおけるプロジェクト管理のベストプラクティス
少人数チームにおけるプロジェクト管理のベストプラクティス少人数チームにおけるプロジェクト管理のベストプラクティス
少人数チームにおけるプロジェクト管理のベストプラクティス
 
沒有 GUI 的 Git
沒有 GUI 的 Git沒有 GUI 的 Git
沒有 GUI 的 Git
 
寫給大家的 Git 教學
寫給大家的 Git 教學寫給大家的 Git 教學
寫給大家的 Git 教學
 
用十分鐘瞭解 陳鍾誠的程式設計課 (採用JavaScript + C的原因)
用十分鐘瞭解  陳鍾誠的程式設計課  (採用JavaScript + C的原因)用十分鐘瞭解  陳鍾誠的程式設計課  (採用JavaScript + C的原因)
用十分鐘瞭解 陳鍾誠的程式設計課 (採用JavaScript + C的原因)
 
提到 DevOps 到底在
談些什麼玩意兒?(@ Agile Tour Taichung 2017)
提到 DevOps 到底在
談些什麼玩意兒?(@ Agile Tour Taichung 2017)提到 DevOps 到底在
談些什麼玩意兒?(@ Agile Tour Taichung 2017)
提到 DevOps 到底在
談些什麼玩意兒?(@ Agile Tour Taichung 2017)
 

Similar to Javascript template

prompt-simple-wfegwegerherhethrhrhrehreh.pptx
prompt-simple-wfegwegerherhethrhrhrehreh.pptxprompt-simple-wfegwegerherhethrhrhrehreh.pptx
prompt-simple-wfegwegerherhethrhrhrehreh.pptxGVRao8
 
模块加载策略 - 2012 SDCC, 北京
模块加载策略 - 2012 SDCC, 北京模块加载策略 - 2012 SDCC, 北京
模块加载策略 - 2012 SDCC, 北京Joseph Chiang
 
網頁三本柱最終章Javascript與jquery
網頁三本柱最終章Javascript與jquery網頁三本柱最終章Javascript與jquery
網頁三本柱最終章Javascript與jqueryAaron King
 
quick_orm 简介
quick_orm 简介quick_orm 简介
quick_orm 简介tyler4long
 
五行完成網頁多國語系
五行完成網頁多國語系五行完成網頁多國語系
五行完成網頁多國語系amostsai
 
那些mockup沒告訴你的事@WebConf.tw 2013
那些mockup沒告訴你的事@WebConf.tw 2013那些mockup沒告訴你的事@WebConf.tw 2013
那些mockup沒告訴你的事@WebConf.tw 2013Adam Wang
 
ASP.NET MVC 內建驗證擴充與活用技巧 -twMVC#3
ASP.NET MVC 內建驗證擴充與活用技巧 -twMVC#3ASP.NET MVC 內建驗證擴充與活用技巧 -twMVC#3
ASP.NET MVC 內建驗證擴充與活用技巧 -twMVC#3twMVC
 
twMVC#03 | ASP.NET MVC內建驗證活用與擴充
twMVC#03 | ASP.NET MVC內建驗證活用與擴充twMVC#03 | ASP.NET MVC內建驗證活用與擴充
twMVC#03 | ASP.NET MVC內建驗證活用與擴充twMVC
 
程式人雜誌 -- 2015 年1月號
程式人雜誌 -- 2015 年1月號程式人雜誌 -- 2015 年1月號
程式人雜誌 -- 2015 年1月號鍾誠 陳鍾誠
 
使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統Hsu Ping Feng
 
部落格小玩意
部落格小玩意部落格小玩意
部落格小玩意bookmoco
 
Javascript 培训第一节 分享·学习javascript过程
Javascript 培训第一节 分享·学习javascript过程Javascript 培训第一节 分享·学习javascript过程
Javascript 培训第一节 分享·学习javascript过程liziqi7
 
Javascript template & react js 初探
Javascript template & react js 初探Javascript template & react js 初探
Javascript template & react js 初探wantingj
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2twMVC
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲ArBing Xie
 
大型网站架构演变
大型网站架构演变大型网站架构演变
大型网站架构演变xiaozhen1900
 
當Scrum遇到Pattern
當Scrum遇到Pattern當Scrum遇到Pattern
當Scrum遇到Patternteddysoft
 
利用Javascript 與 html5開發線上遊戲_0基本概念
利用Javascript 與 html5開發線上遊戲_0基本概念利用Javascript 與 html5開發線上遊戲_0基本概念
利用Javascript 與 html5開發線上遊戲_0基本概念azole Lai
 

Similar to Javascript template (20)

prompt-simple-wfegwegerherhethrhrhrehreh.pptx
prompt-simple-wfegwegerherhethrhrhrehreh.pptxprompt-simple-wfegwegerherhethrhrhrehreh.pptx
prompt-simple-wfegwegerherhethrhrhrehreh.pptx
 
模块加载策略 - 2012 SDCC, 北京
模块加载策略 - 2012 SDCC, 北京模块加载策略 - 2012 SDCC, 北京
模块加载策略 - 2012 SDCC, 北京
 
網頁三本柱最終章Javascript與jquery
網頁三本柱最終章Javascript與jquery網頁三本柱最終章Javascript與jquery
網頁三本柱最終章Javascript與jquery
 
quick_orm 简介
quick_orm 简介quick_orm 简介
quick_orm 简介
 
五行完成網頁多國語系
五行完成網頁多國語系五行完成網頁多國語系
五行完成網頁多國語系
 
那些mockup沒告訴你的事@WebConf.tw 2013
那些mockup沒告訴你的事@WebConf.tw 2013那些mockup沒告訴你的事@WebConf.tw 2013
那些mockup沒告訴你的事@WebConf.tw 2013
 
ASP.NET MVC 內建驗證擴充與活用技巧 -twMVC#3
ASP.NET MVC 內建驗證擴充與活用技巧 -twMVC#3ASP.NET MVC 內建驗證擴充與活用技巧 -twMVC#3
ASP.NET MVC 內建驗證擴充與活用技巧 -twMVC#3
 
twMVC#03 | ASP.NET MVC內建驗證活用與擴充
twMVC#03 | ASP.NET MVC內建驗證活用與擴充twMVC#03 | ASP.NET MVC內建驗證活用與擴充
twMVC#03 | ASP.NET MVC內建驗證活用與擴充
 
日新培训
日新培训日新培训
日新培训
 
程式人雜誌 -- 2015 年1月號
程式人雜誌 -- 2015 年1月號程式人雜誌 -- 2015 年1月號
程式人雜誌 -- 2015 年1月號
 
使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統
 
部落格小玩意
部落格小玩意部落格小玩意
部落格小玩意
 
Javascript 培训第一节 分享·学习javascript过程
Javascript 培训第一节 分享·学习javascript过程Javascript 培训第一节 分享·学习javascript过程
Javascript 培训第一节 分享·学习javascript过程
 
Javascript template & react js 初探
Javascript template & react js 初探Javascript template & react js 初探
Javascript template & react js 初探
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
 
大型网站架构演变
大型网站架构演变大型网站架构演变
大型网站架构演变
 
當Scrum遇到Pattern
當Scrum遇到Pattern當Scrum遇到Pattern
當Scrum遇到Pattern
 
利用Javascript 與 html5開發線上遊戲_0基本概念
利用Javascript 與 html5開發線上遊戲_0基本概念利用Javascript 與 html5開發線上遊戲_0基本概念
利用Javascript 與 html5開發線上遊戲_0基本概念
 

Javascript template

  • 1. 基于 JS 的模板引擎实现思路 偶是来打酱油的…… 貘 2011-06-21
  • 2. 打酱油的来龙去脉 上上期主题:麦霸唐, JQuery Template 好玩,自己写了个 Template(就叫打酱油Template好了) 杭州主题:杜欢(风之石),JavaScript 模板引擎 - easyTemplate 的应用场景及设计实现 SINA 围脖前端在用 easyTemplate 跟杜欢水了下,一时兴起两地同说模板主题 easyTemplate 说明地址http://www.w3cgroup.com/article.asp?id=300 偶对自己的八卦行为表示有点无奈 〒﹃〒〣
  • 3. 例行公事的说下啥要用模板 方便呗 避免来回拼字符串呗 其他各种高级理由 理由都懂的,不多扯了 麦霸唐老师说:各种改!!尼玛伤不起啊!!!-
  • 4. 这个打酱油模板实现了啥 基本语法: ${data.xxx} 引入json数据,引用的数据对象命名为 data 支持一些简单语法标记:${expression}{{if (expression)}} {{else if (expression)}} {{else}} {{/if}}{{for (expression)}} {{/for}}{{switch}}{{case}}{{/case}}{{/switch}} 支持语法标签嵌套错误校验 缓存转为JS源码的模板语句
  • 5. 模板与数据是均从 easyTemplate 无耻抄来的 偶们不谈效率问题~~ 演示~~
  • 7. 前期思路 JSP 与 Servlet 以第一次执行JSP时,将 JSP 标记解析,生成具体 Servlet Class文件 Servlet 文件内是纯纯的 JAVA <%...%> 标签被解释为 JAVA 代码段 <%=...%>标签被解释为表达式输出 数据变化,JSP文件不再被解析,只运行已编译的Servlet Class 看演示图
  • 8. <% String message = "message string."; %> <div><%=messagge%></div> JSP public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; ... String message = "message string." out.write(""); out.write("<div>"); out.print(message); out.write("</div>"); ... } Servlet
  • 9. 原理不变 实现变化 JSP 标记可映射为 JSTemplate 语法标记 Servlet 可映射为将语法标记与内容解析为原生JS程序段源码 Servlet 的执行可以映射为将JS程序源码执行 eval 或 new Function <%...%> 可映射为模板语法标签 {{...}} <%=...%>可映射为模板输出标签 ${...} 当然,你也可以整自己的标签啦 数据变化后不再重新生成Servlet可以映射为缓存JS源码 看例子
  • 10. <div>Template</div> {{if (data.length > 0)}} <div>${data.length}</div> {{/if}} Template var sHtml = []; sHtml .push('<div>Template</div>'); if (data.length > 0) { sHtml.push(' <div>'); sHtml.push(data.length); sHtml.push('</div>'); } return sHtml.join(''); JavaScript
  • 11. 实现靠正则 这篇是打酱油的,不细说了,你懂的 用了一些简单的正则 var startSyntaxRegExp = /^*([a-z]+)*(.*)/; var closeSyntaxRegExp = /^*[][a-z]+*$/; var trimRegExp = /(^+)|(+$)/; var quotationRegExp = /(["'])/g; var newLineRegExp = /(|)/g; var expressionRegExp = /{([^{}]*)}/g; var syntaxTokenRegExp = /[{]{2}|[}]{2}/; var slashRegExp = //g; * 你自己实现时可以写个复杂的正则一次性匹配出模板语法元素等,这样或许效率会更高一些。
  • 13. 缓存模板 都存起来备用 如果输入模板一致,就不再转换模板到JS代码 执行 JS 代码码,省去模板语法解析转换时间。 模板字符串和JS代码找个闭包放就好了 templateStringCache <div>Template</div> {{if (data.length > 0)}} <div>${data.length}</div> {{/if}} JavaScriptStringCache var sHtml = []; sHtml .push('<div>Template</div>'); if (data.length > 0) { sHtml.push(' <div>'); sHtml.push(data.length); sHtml.push('<div>'); } return sHtml.join('');