前端模板与后端模板引擎解析:提升开发效率与可维护性的关键步骤
模板的工作原理可以简单地分为两个步骤:模板解析(翻译)和数据渲染。这两个步骤可以分别部署在前端或后端。如果是在后端执行的话,就是像Smarty、FreeMarker这样的后端模板引擎。如果是在前端执行的话,就是我们要讨论的前端模板。
FreeMarker是一个模板引擎,是一个基于模板生成文本输出的通用工具。它是用纯Java 编写的。该模板使用servlet 提供的数据动态生成HTML。模板语言功能强大且直观,编译速度快,输出接近静态 HTML 页面。速度。后台模板不再赘述。
前端模板提高了前端开发的可维护性(后期很容易改变)和可扩展性(如果想增加功能,很容易增加需求);提高开发效率(程序逻辑更好组织,调试方便);而最重要的一点是:【视图(包括显示渲染逻辑)和程序逻辑的分离】。优点是减轻了服务器的负担,缺点是可能不利于SEO且模板错误难以调试。
目前前端模板主要分为三类:
-基于字符串的模板技术(基于字符串的解析和编译过程)
-基于Dom的模板技术(基于Dom的链接或编译过程)
- Hybrid Living 模板技术(基于字符串的解析和基于 dom 的编译过程)。
1.前端模板的演变
传统的前端开发方式是通过ajax获取数据来进行繁琐的数据渲染。随着前端页面的交互越来越复杂,页面刷新传输和页面变化变得更加频繁,导致页面性能低下。即前端通过ajax等方式从后台获取数据更新后,需要将数据渲染到指定的dom元素中,需要重新进行各种字符串拼接工作或者一系列的元素创建工作。这种方法比较麻烦。而且很费时间。这也存在可读性和可维护性的问题。
基于字符串的模板引擎的最大贡献是将您从大量的字符串连接逻辑中解放出来。由于其完全基于字符串的特性,它具有一些不可替代的优势。以下字符串连接:
在基于Dom的模板技术中,如果需要从字符串创建视图,则必须通过innerHTML获取初始的Dom结构。然后引擎会使用Dom API(attributes、getAttribute、firstChild...等)级别从这个原始的Dom结构中获取原始的Dom结构,从Dom属性中提取指令、事件等信息。基于Dom的模板技术没有完整的解析过程。然后完成数据到View的绑定并使其“活跃”。因此,基于Dom的模板技术更像是数据与DOM之间的“链接”和“重写”过程。编译完成后,数据和View仍然是连接的,即可以不依赖Dom API手动操作来更新View。
基于String和基于Dom的模板技术都或多或少地依赖于innerHTML。它们之间的区别在于,一种主要用于Rendering,另一种用于Parsing以提取信息。 Living Template Engine模板引擎的解析过程类似于基于String的模板技术,编译过程类似于基于Dom的模板技术。
2.基于字符串的模板技术(基于字符串的解析和编译过程)
抽象语法树(Abstract Syntax Tree)又称为AST语法树,是指与源代码语法对应的树结构。也就是说,对于特定编程语言的源代码,通过构造语法树将源代码中的语句映射到树中的每个节点。
实现一个简单的字符串循环模板:
上面的例子很好地说明了基于String的模板技术的原理。它生成 html 结构并通过 innerHTML 将它们直接插入到 DOM 中。
优点:与字符串拼接相比,实现了模板和代码逻辑的分离,不需要大量的字符串拼接。
缺点:渲染后数据与视图完全分离,innerHTML的性能问题,安全问题等。
3.基于Dom的模板技术(基于Dom的链接或编译过程)
首先,通过innerHTML获取初始Dom结构,然后引擎会使用Dom API(attributes、getAttribute、firstChild...等)从原始Dom的属性中提取指令、事件等信息。然后完成数据和View的绑定,使其“活跃”。
Node对象定义了一系列属性和方法来方便遍历整个文档。可以使用parentNode属性和childNodes[]数组在文档树中上下移动;通过遍历childNodes[]数组或者使用firstChild和nextSibling属性进行循环操作,也可以使用lastChild和previousSibling进行反向循环操作,也可以枚举指定的节点。子节点。调用appendChild()、insertBefore()、removeChild()和replaceChild()方法可以更改节点的子节点,从而更改文档树。需要指出的是,childNodes[]的值实际上是一个NodeList对象。因此,您可以通过迭代 childNodes[] 数组的每个元素来枚举给定节点的所有子节点。
JavaScript 中也有很多树结构。例如DOM树、省市地址联动、文件目录等; JSON本身是一个树形结构。通过递归,可以枚举树中的所有节点。
基于Dom的模板技术的实现过程将包含在下面对Living Template Engine的描述中。
4. 活模板引擎
基于String和基于Dom的模板技术都或多或少地依赖于innerHTML。它们之间的区别在于,一种主要用于Rendering,另一种用于Parsing以提取信息。那么为什么不将两者结合起来并完全消除对innerHTML的依赖呢?解析和编译的过程分别类似于基于String的模板技术和基于Dom的模板技术。
首先调用Parser()模块解析字符串并输出AST。该方法模板将包括词法分析、语法分析和构建输出 AST 的模板。然后调用pile(AST)方法进行编译。在该方法中,调用 walkers 来递归遍历 AST。最后输出该组件的Dom并保存。当调用该组件的compile(AST)方法进行编译时,该方法中会调用walkers来递归遍历AST。 AST,最后输出并保存这个组件的Dom。当调用该组件的inject()方法时,就可以将Dom插入到页面中。
1.解析
首先我们使用内置的 DSL 来解析模板字符串并输出 AST。
1)词法分析器也称为扫描器。词法分析是指将文本代码流解析为token,得到的token可以用于后续的词法分析。该模块在Regular顶层模块执行过程中,先调用Lexer词法分析模块对字符串模板进行词法分析,然后再调用Parse模块进行语法分析。词法分析的主要流程如下图所示:
词法分析主要分为两部分,一是Tag类型元素字符串,二是JST字符串。通过在全局保存一个状态,当前解析完成后,会判断字符串开头是否以“开头
文章评论
前端模板技术提高了前端开发的可维护性、可扩展性和开发效率,实现了视图和程序逻辑的分离,从基于字符串的解析到活模引擎的结合使用带来了更高效的渲染性能和安全保障机制的提升空间巨大潜力值得期待进一步探索和研究优化方案以应对日益增长的前端需求挑战和提升用户体验质量的需求目标实现更加高效便捷的开发工作流程同时提高系统性能和稳定性水平提升用户满意度体验效果等价值意义所在
前端模板技术提高了前端开发的可维护性、可扩展性和开发效率,实现了视图和程序逻辑的分离,从基于字符串的解析到Hybrid Living Template技术的结合使用提升了渲染速度和用户体验质量提升的关键在于将两者优势相结合并消除对innerHTML依赖的技术创新和实践优化策略的实施效果显著值得进一步推广和应用在实际项目中以提高整体性能和用户满意度