再谈前端HTML模板技术

这篇文章介绍的内容是关于再谈前端HTML模板技术,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

在web2.0之前,写jsp的时候虽然有es和JSTL,但是还是坚持jsp。后面在外包公司为了快速交货,还是用了php Smart技术。

web2.0后,前端模板技术风行。

代表有如下三大类:

String-based模板技术(基于字符串的parse和compile过程)

DOM-based模板技术(基于Dom的link或compile过程)

Living template (基于字符串的parse 和 基于dom的compile过程)

 String-based templating

这是一种基于字符串的模板技术,以字符串和数据为输入,通过用正则表达式将占位符替换为所需数据的方式,构建出完整的 HTML 字符串。

String-based templating基本原理.png

字符串模板引擎主要依赖一下这几个dom API:createElement,appendChild,innerHTML。

在这些api中,innerHTML有最佳的可读性与实用性,成为事实上的主要标准,虽然其他API可能在性能上更胜一筹,但原生js的字符串生成方案中,最常用的还是innerHTML。

字符串模板引擎.png

基于字符串的模板引擎最大的功劳就是把你从大量的夹带逻辑的字符串拼接中解放出来了,由于它的完全基于字符串的特性,它拥有一些无可替代的优势。

It is essentially a way to address the need to populate an HTML view with data in a better way than having to write a big, ugly string concatenation expression.

快速的初始化时间: 很多angular的簇拥者在奚落String-based templating似乎遗漏了这一点。

同构性: 完全的dom-independent,即可作为用服务器端和浏览器端(客官先不要急着搬phantomjs哈).

更强大的语法支持:因为它们都是不是自建DSL就是基于JavaScript语法,Parser的灵活性与受限于HTML的Dom-based模板技术不可同日而语

由于基于字符串的模板方法依赖于innerHTML的渲染,所以会带来以下问题。

安全问题:使用innerHTML 构建 DOM具有安全隐患,用于渲染的动态数据可能存在安全漏洞,如果没有经过特定的转义处理,就有可能造成 XSS攻击或者 CSRF攻击。

因为innerHTML具有安全隐患.,例如:再谈前端HTML模板技术,我知道像你这样优秀的程序员不会写出这样的代码,但当html片段不完全由你来控制时(比如从远程服务器中),这会成为一个可能引爆的*。

性能问题:使用innerHTML 替换 DOM效率较低,即使仅替换 DOM 的一个属性或文本内容,也必须通过innerHTML 替换整个 DOM,从而导致浏览器的重排和重绘。

开发效率问题:由于是通过正则表达式匹配后在特定函数中拼接字符串,所以容易造成重复计算,而且完全移除现有的 DOM,再重新渲染一遍,挂载在 DOM 上的事件和状态都将不复存

有可能会创建出意料之外的节点:由于html的parser非常的“友好”, 以至于它接受并不规范的写法,从而创建出意料之外的结构,而开发者得不到错误提示。

代表:

mustache及其衍生handlebar等: 弱逻辑

Dust.js: 强逻辑 (推荐)

doT.js: 超级快

DOM-based模板技术

这是一种基于 DOM 节点的模板技术,通过innerHTML获取初始 DOM 结构,再通过 DOM API层级从原始 DOM 属性中提取事件、指令、表达式和过滤器等信息,编译成 LivingDOM,从而完成数据 Model和 View 的双向绑定。 AngularJS就是 DOM-based模板技术的代表。

192J32146-3.png

Dom-based的模板技术事实上并没有完整的parse的过程(先抛开表达式不说),如果你需要从一段字符串创建出一个view,你必然通过innerHTML来获得初始Dom结构. 然后引擎会利用Dom API(attributes,getAttribute,firstChild… etc)层级的从这个原始Dom的属性中提取指令、事件等信息,继而完成数据与View的绑定,使其”活动化”。

所以Dom-based的模板技术更像是一个数据与dom之间的“链接”和*“改写”*过程。

注意,dom-based的模板技术不一定要使用innerHTML,比如所有模板都是写在入口页面中时, 但是此时parse过程仍然是浏览器所为。

DOM-based模板技术比String-based模板技术更加灵活,功能也更加强大,达到了一定意义上的数据驱动。

是活动的: 完成compile之后,data与View仍然保持联系,即你可以不依赖与手动操作Dom API来更新View

是运行时高效的: 可以实现局部更新

指令等强大的附属物帮助我们用声明式的方式开发APP

但其存在以下问题:

信息冗余:信息承载于属性中,这个其实是不必要和冗余的。

由于 DOM-based模板技术通过innerHTML 获取 DOM 编译节点,信息承载于属性中,造成了不必要的冗余,同时也会影响阅读,提升开发难度。一种解决办法就是通过读取属性后再进行删除处理,诸如removeAttribute的方式移除它们,其实这个不一定必要,而且其实并无解决它们Dom强依赖的特性,还会影响性能,降低用户体验。

初始节点获取问题:通过innerHTML获取初始节点,没有独立的语法解析器或词法解析器,与 HTML是强依赖关系。初次进入 DOM 的内容是模板,渲染需要时间,所以会造成内容闪动——FOUC(Flash of unstyled content)这个无需多说了,只怪它初次进入dom的内容并不是最终想要的内容。

没有独立的Parser,必须通过innerHTML(或首屏)获取初始节点,即它的语法是强依赖与HTML,这也导致它有潜在的安全问题

代表:

AngularJS: 都28000star了还需多说么

Knockout: 在此领域内,对Web前端而言是鼻祖级的

Livingtemplate技术

Livingtemplate技术与String-based、DOM-based模板技术的最大区别是不依赖innerHTML来渲染和提取所需信息。其主要思想是:首先,结合数据绑定技术,使用成熟的词法解析和语法解析

技术,将输入的字符串解析成抽象语法树AST,而不是仅仅通过简单的正则表达式匹配特定语法,再进行字符串拼接;其次,通过对 AST进行编译,创建具有数据动态绑定功能的 Living DOM,从而避免使用innerHTML,解决了浏览器的元素闪动问题,提高了应用的安全性,其原理如图1所示。

Screen Shot 2018-04-19 at 18.38.17.png

从图1可知,输入的字符串通过词法解析器Lexer,生成对应的词法块。词法块通过语法解析器 Parser,构建抽 象 语 法 树 AST。然 后 将 AST编译成具有动态数据绑定功能的LivingDOM,从而实现 View 和 Model的双向绑定。

与Dom-based 模板技术利用Dom节点承载信息所不同的是,它的中间产物AST 承载了所有Compile过程中需要的信息(语句, 指令, 属性…等等). 

我们可以发现Living templating几乎同时拥有String-based和Dom-based模板技术的优点

利用一个如字符串模板的自定义DSL来描述结构来达到了语法上的灵活性,并在Parse后承载信息(AST)。而在Compile阶段,利用AST和Dom API来完成View的组装,在组装过程中,我们同样可以引入Dom-based模板技术的诸如Directive等优良的种子。

living template’s 近亲 —— React

React当然也可以称之为一种模板解决方案,它同样也巧妙规避了innerHTML,不过却使用的是截然不同的策略:react使用一种virtual dom的技术,它也同样基于脏检查,不过与众不同的是,它的脏检查发生在view层面,即发生在virtual dom上,从而可以以较小的开销来实现局部更新。

轻量级, 在Dom中进行读写操作是低效的.

可重用的.

可序列化, 你可以在本地或服务器端预处理这个过程。

安全, 因为安全不需要innerHTML帮我们生成初始Dom

代表:

htmlbar: 运行在handlebar之后的二次编译

ractivejs: 独立

Regularjs独立

此文还需进一步整理,以及自定义模板引擎思考方向与工程实践内容补充。这方面需要下的功夫还是需要蛮多的,敬请期待。

本文转载自原创文章:https://www.zhoulujun.cn/html/webfront/SGML/htmlBase/2018_0419_8098.html

相关推荐:

一个简单的HTML模板引擎

以上就是再谈前端HTML模板技术的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1546006.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
HTML之head头部的实现
上一篇 2025年12月21日 17:45:08
HTML实现美化上传文件样式
下一篇 2025年12月21日 17:45:30

相关推荐

  • 如何制作抖音点单小程序:全面指南与实用技巧

    引言: 随着移动互联网的飞速发展,抖音已不仅仅是短视频平台,更成为商家连接用户的重要入口。越来越多企业开始关注抖音点单小程序的搭建,以提升服务效率和用户体验。本文将为您系统讲解抖音点单小程序的制作流程,并分享实用技巧与真实案例,助您快速打造专属的小程序,实现流量变现与销售增长。 1. 明确核心需求与…

    2026年9月21日
    200
  • PHP播放HLS视频流的方法_PHP播放HLS视频流方法

    答案:PHP通过权限控制和文件代理实现HLS流安全分发,前端使用HTML5视频标签和hls.js播放。具体描述:HLS将视频切为.ts片段并用.m3u8索引,PHP后端可校验用户权限、防止盗链,动态输出.m3u8或.ts内容;前端通过video标签加载stream.php?id=1,结合hls.js…

    2026年9月20日
    000
  • VSCode有哪些必备的插件?

    EditorConfig for VS Code统一代码风格,2. Prettier自动格式化多语言代码,3. ESLint检查JS/TS错误并集成Prettier,4. GitLens增强Git可视化,5. Path Intellisense补全文件路径,6. 括号高亮提升嵌套识别,7. Auto…

    2026年9月20日
    1000
  • 为什么VSCode的CSS代码提示不全?

    答案:VSCode CSS提示不全通常由配置或环境问题导致。1. 确保文件语言模式为CSS并正确关联扩展名;2. 更新VSCode以支持现代CSS特性,自定义属性需插件辅助;3. 安装IntelliSense、Tailwind或PostCSS等插件增强提示功能;4. 检查settings.json中…

    2026年9月20日
    000
  • 怎么在VSCode里运行HTML文件?

    使用Live Server扩展是VSCode运行HTML文件最简单的方法,安装后右键选择“Open with Live Server”即可在浏览器中自动打开并实时预览网页内容。 在VSCode里运行HTML文件,最简单的方法是借助浏览器打开。VSCode本身不直接运行HTML,但可以快速预览和调试。…

    2026年9月20日
    000
  • qq浏览器怎么导出已保存的账号密码_qq浏览器密码导出教程

    1、通过Windows凭据管理器可查看QQ浏览器保存的密码,进入控制面板的“凭据管理器”→“Web凭据”,点击条目并验证系统密码后显示明文信息。2、在QQ浏览器设置中进入“密码管理”→“已保存的密码”,身份验证后逐条查看账号密码并手动记录。3、利用开发者工具修改登录页密码框属性,将type=&#82…

    2026年9月20日
    100
  • UC浏览器如何给书签文件夹加密_UC浏览器书签文件夹加密方法

    1、UC浏览器可通过隐私锁功能加密书签文件夹,设置图案、密码或指纹验证;2、若无内置加密,可导出书签为HTML文件并用Keepass等加密应用管理;3、还可利用手机隐私空间功能,将UC浏览器迁移至隔离环境实现系统级保护。 如果您希望在使用UC浏览器时保护个人隐私,防止他人随意查看您收藏的重要网页,可…

    2026年9月20日
    200
  • edge浏览器无法打开本地HTML文件或显示空白怎么办_Edge浏览器打开本地HTML文件失败解决方法

    1、检查文件路径并选择Edge打开,确保路径为纯英文;2、在edge://flags中启用“Allow file access from files”;3、使用开发者工具排查资源加载错误;4、通过命令行启动Edge绕过安全限制;5、推荐使用npx live-server搭建本地服务器运行HTML文件…

    2026年9月20日
    000
  • Linux输出文本echo命令应用

    echo命令不仅能输出文本,还可结合变量、转义序列和重定向实现动态内容生成、文件创建与追加、配置修改、管道处理及脚本调试,其行为在Bash、Zsh和Dash等shell中因内置实现不同而存在差异,尤其在转义序列处理上需注意使用-e选项或改用printf以保证一致性。 echo 命令在 Linux 中…

    2026年9月20日
    000
  • 如何为VSCode配置一个自定义的文件编码检测策略?

    VSCode无直接自定义编码检测API,需通过files.encoding设默认编码,files.autoGuessEncoding启自动识别,files.associations按文件类型指定编码,.editorconfig统一项目规范,辅以扩展处理特殊需求,组合实现自定义策略;编码误判主因包括B…

    2026年9月20日
    000
  • 怎样在VSCode中为不同文件类型设置不同的缩进?

    在VSCode中可为不同文件类型设置缩进,通过settings.json按语言ID配置,如Python用4空格、HTML用2空格,保存后自动生效并覆盖全局设置。 在 VSCode 中为不同文件类型设置不同的缩进,可以通过配置语言特定的设置来实现。VSCode 支持按语言 ID 覆盖编辑器的缩进行为,…

    2026年9月20日
    100
  • 修复WordPress wp-settings.php 中致命错误的专业指南

    本文旨在解决WordPress网站中因核心文件损坏导致的wp-settings.php致命错误,特别是“Call to undefined function”问题。通过提供详细的步骤,指导用户安全地替换受损的wp-admin和wp-includes目录,从而恢复网站功能。文章强调了备份的重要性,并提…

    2026年9月20日
    100
  • 你尝试过用VSCode编写非代码类文档(如Markdown)吗?

    答案是推荐使用VSCode编写非代码类文档。它内置Markdown支持,提供语法高亮、实时预览、自动保存,配合插件可实现目录生成、图表插入、图片粘贴等功能,适合技术文档、笔记等结构化写作,结合Git便于版本控制,是兼顾简洁与效率的写作环境。 当然尝试过,而且非常推荐用 VSCode 编写非代码类文档…

    2026年9月20日
    100
  • windows怎么查看系统稳定性历史记录_Windows系统稳定性历史记录查看方法

    通过可靠性监视器可查看Windows系统稳定性评分及蓝屏、程序崩溃等事件详情;2. 使用事件查看器能深入分析系统和应用程序日志中的错误级别条目;3. 借助PowerShell命令可生成HTML格式的系统稳定性报告用于存档或分析。 如果您发现Windows系统运行不稳定,例如频繁出现蓝屏、程序崩溃或自…

    2026年9月20日
    100
  • mysql如何实现用户注册功能

    答案:通过MySQL创建用户表并结合后端逻辑实现注册功能。首先在MySQL中创建包含用户名、密码、邮箱等字段的users表,确保唯一性约束;后端接收%ignore_a_1%提交的注册数据,对密码加密(如SHA256或bcrypt),使用参数化查询将数据安全存入数据库;前端通过表单或AJAX发送注册请…

    2026年9月13日
    200
  • Java如何开发一个简易的打卡签到工具

    答案:基于Spring Boot搭建打卡签到工具,实现用户登录、打卡记录与历史查询。采用Spring Web、JPA与H2数据库构建后端,设计User和Attendance实体,通过控制器处理/checkin、/checkout及/history接口,前端使用HTML表单提交打卡请求,配合Thyme…

    2026年9月13日
    700
  • MySQL GROUP_CONCAT函数实现订单项按日期合并显示

    本教程详细阐述了如何利用MySQL的GROUP_CONCAT函数,将同一日期下的多个订单项合并为一行显示,并以逗号分隔。文章将涵盖从数据库查询优化到PHP数据处理的完整流程,旨在帮助开发者高效地在购物网站等场景中展示分组后的订单信息,提升数据可读性。 在构建在线购物平台时,展示客户订单详情是一个常见…

    2026年9月13日
    100
  • Via浏览器怎么把书签数据同步到另一台手机_Via浏览器书签跨设备同步的方法

    可通过导出HTML文件或使用云存储、第三方工具实现Via浏览器书签跨设备同步,具体操作包括在原设备导出书签、传输文件至新设备并导入,或利用云盘自动同步及复制数据库文件完成迁移。 如果您希望在更换设备或使用多台手机时,继续访问Via浏览器中保存的书签,可以通过手动或借助第三方工具实现数据迁移。以下是将…

    2026年9月12日
    200
  • 如何为VSCode配置自动补全(Auto Complete)?

    VSCode默认启用自动补全,通过LSP提供智能建议,可手动触发或设置自动弹出;2. 安装Pylance、Rust Analyzer等语言扩展提升各语言补全准确性;3. 调整editor.quickSuggestions、延迟时间和参数提示优化体验。 VSCode 的自动补全功能默认已启用,大多数情…

    2026年9月12日
    300
  • edge浏览器网页内容无法复制怎么办_edge浏览器解除网页复制限制技巧

    答案:可通过阅读模式、打印预览、禁用JavaScript、开发者工具或扩展程序解决Edge无法复制问题。具体步骤依次为:启用阅读视图绕过脚本限制;使用打印功能导出PDF提取文字;临时关闭JavaScript解除防护;通过F12工具查看HTML元素直接复制;安装SuperCopy等扩展一键破解复制禁用…

    2026年9月12日
    100

发表回复

登录后才能评论
关注微信