当前位置: 首页 > Web前端 > HTML5

高性能JavaScript模板引擎原理解析

时间:2023-04-05 16:57:21 HTML5

随着web的发展,前端应用越来越复杂,基于后端的JavaScript(Node.js)也开始崭露头角。JavaScript被寄予了更大的期望。MVC的思想也开始流行起来。javascript模板引擎作为数据与接口分离中最重要的部分,越来越受到开发者的关注。它在开源社区中更受欢迎。广泛应用于推特、淘宝、新浪微博、腾讯QQ空间、腾讯微博等,在网站上都能看到。本文将用最简单的示例代码来描述现有javascript模板引擎的原理,包括新一代javascript模板引擎artTemplate的特性实现原理,欢迎一起讨论。artTemplate介绍artTemplate是新一代的javascript模板引擎,它采用预编译的方式在性能上进行了质的飞跃,并充分利用了javascript引擎的特性,使其在前端和后端的性能都非常出色.在chrome下的渲染效率测试中,分别是知名引擎Mustache和microtmpl的25倍和32倍。除了性能优势外,调试功能也值得一提。模板调试器可以精确定位导致渲染错误的模板语句,解决了编写模板过程中无法调试的痛苦,让开发更高效,避免了因为单一的原因导致整个应用崩溃模板错误。artTemplate所有这些都在1.7kb(gzip)中!javascript模板引擎的基本原理虽然每个引擎在模板语法、语法解析、变量赋值、字符串拼接等方面的实现方式不同,但关键的渲染原理仍然是动态执行javascript字符串。关于javascript字符串的动态执行,本文以一个模板代码为例:这是一个很简单的模板写法,其中""是closeTag(逻辑语句结束标签),如果openTag后面跟"=",内容的变量将被输出。html语句和变量输出语句直接输出,解析出来的字符串类似:语法解析完成后,一般返回渲染方法:渲染测试:在上面的render方法中,模板变量赋值使用了with语句,而字符串的拼接使用了数组push的方式来提高IE6、7下的性能,jQuery作者john开发的微模板引擎tmpl就是这种方式的典型代表。参见:http://ejohn.org/blog/javascript-micro-templating/从原理上可以看出,传统的javascript模板引擎需要解决两个问题:1.性能:模板引擎依赖Function构造函数渲染时实现。Function和eval、setTimeout、setInterval一样,提供了一种使用text访问javascript解析引擎的方法,但是这种方式执行javascript的性能很低。2.调试:由于是动态执行字符串,如果遇到错误,调试器无法捕获错误源头,使得模板BUG调试异常痛苦。在没有容错的引擎中,部分模板的数据异常甚至会导致整个应用崩溃。随着模板数量的增加,维护成本将急剧增加。这次给大家推荐一个免费的学习圈,总结了移动应用网站开发,css,html,webpack,vuenodeangular,面试资源。获取信息???对web开发技术感兴趣的同学:???加入???,无论小白还是大牛,我都欢迎你,还有大牛整理的一套高效的学习路线和教程。你免费分享,每天更新视频素材。ArtTemplate的高效秘诀一、预编译在上述模板引擎的实现原理中,由于模板变量需要赋值,所以每次渲染都需要动态编译javascript字符串来完成变量赋值。而artTemplate的编译赋值过程是在渲染之前完成的,称为“预编译”。artTemplate模板编译器会根据一些简单的规则提取所有模板变量,并在渲染函数的头部声明它们。这个函数类似:这个自动生成的函数就像一个手写的javascript函数。在相同的执行次数下,无论是CPU还是内存占用都有了明显的降低,性能接近极限。值得一提的是,artTemplate的很多特性都是基于预编译实现的,比如沙盒规范和自定义语法。2、更快的字符串加法很多人误以为数组push法拼接字符串比+=更快,要知道这只是在IE6-8浏览器下。实测表明,在现代浏览器中使用+=比数组push方式更快,而在v8引擎中,使用+=比数组拼接快4.7倍。所以artTemplate根据javascript引擎的特点,采用了两种不同的字符串拼接方式。artTemplate调试方式原理前端模板引擎不像后端模板引擎。它是动态解析的,所以调试器无法定位到错误行号,而artTemplate巧妙地让模板调试器准确定位到导致渲染错误的模板语句。例如:artTemplate支持两种类型的错误捕获,一种是渲染错误(RenderError)和编译错误(SyntaxError)。1.渲染错误渲染错误一般是由模板数据错误或变量错误引起的。渲染时,只有遇到错误才会进入调试模式重新编译模板,不会影响模板正常执行效率。模板编译器根据模板的换行符记录行号,编译后的功能类似:执行时遇到错误,立即抛出模板行号对应的异常,模板调试器检查根据行号将模板对应的语句打印到控制台。2.编译错误编译错误一般是模板语法错误,比如嵌套不合格、语法未知等,由于artTemplate没有进行完整的词法分析,所以无法确定错误源的位置。只能输出错误信息的原文和源代码,供开发者判断。