Web模板技术的总结与探索
- By
- hax (贺师俊)
- 最后更新时间
-
啥是模板(Template)?
- 文本内插(interpolation) + 编程语言混合(从而支持表达式和逻辑结构) + 特别的优化?
啥是模板(Template)?
- 字符串替换?
- 字符串替换 + 支持简单逻辑?
- 文本内插(interpolation) + 编程语言混合(从而支持表达式和逻辑结构) + 特别的优化?
- 匹配规则 + 查询语言和表达式 + 输出指令?
- 特定编程语言的库?
- DSL?
- ……
一图胜千言
一图胜千言
定义
- Presentation Specifications —— 呈现的规格
- 所谓 presentation spec,即确定如何将(后端的)数据转化为(前端的)信息
历史上……
- 拼字符串
- 反转 => HTML内嵌变量和脚本(例子:PHP)
历史上……
- 拼字符串
- 反转 => HTML内嵌变量和脚本
- Helper(例子:CakePHP)
历史上……
- 拼字符串
- 反转 => HTML内嵌变量和脚本
- Helper
- 自定义标签(JSP TagLib)
历史上……
- 拼字符串
- 反转 => HTML内嵌变量和脚本
- Helper
- 自定义标签
- 组件化(ASP.NET WebForm 和 JSF)
历史上……
- 拼字符串
- 反转 => HTML内嵌变量和脚本
- Helper
- 自定义标签
- 组件化
- 返璞“归真”
各种问题……
- 要改一些展现内容,花了很长时间才找到修改的地方
- 要改进一些结构和样式,不敢动手,因为视图的可测试性不足
- 重复或相似的代码相当多,由于缺乏称手的工具而难以重构
- 稍复杂的需求变化,工程师荡漾在一堆标签和php/jsp/js逻辑交织的代码里
- 由于一些小的非本质性的变动,要改变许多原有的代码
这些问题背后的原因?
- 表现层代码散布各处 —— 各个层面的代码都在输出html甚至style
- Controller大包大揽 —— routing、页面布局、组装、应用逻辑……
- 视图单元同时承担两个职责 —— 页面单元和复用单元,导致视图单元变得太零碎
- 前端代码缺乏抽象层 —— 虽有抽象层尝试,但是不够好,很容易产生“抽象泄露”(传统编程的抽象方法不适应前端)
模板解决什么问题?
- 批量生成页面,或动态生成页面
- 分离前后端关注点
- 执行表现层逻辑,更精确的说,执行 presentation spec
模板引擎在不同维度上的分类
- 前端 or 后端 or 前后端通吃?
- 支持任意复杂逻辑和表达式 or 受限的逻辑和简单表达式(辅以特别机制如filter) or Logicless?
模板引擎在不同维度上的分类
- 前端 or 后端 or 前后端通吃?
- 支持任意复杂逻辑和表达式 or 受限的逻辑和简单表达式(辅以特别机制如filter) or Logicless?
- 基于字符串的模板 or DOM-aware的模板
如何选择模板引擎?
- 前端 or 后端 or 前后端通吃?
- 支持任意复杂逻辑和表达式 or 受限的逻辑和简单表达式(辅以特别机制如filter) or Logicless?
- 基于字符串的模板 or DOM-aware的模板
- 语言、平台、框架
- 性能
如何选择模板引擎?
- 语法友好
- 页面结构的组织(布局)
- 常用单元的复用(组件)
如何选择模板引擎?
- 语法友好
- 页面结构的组织(布局)
- 常用单元的复用(组件)
- 最佳实践的约束
如何选择模板引擎?
- 语法友好
- 页面结构的组织(布局)
- 常用单元的复用(组件)
- 最佳实践的约束
- 安全性
如何选择模板引擎?
- 语法友好
- 页面结构的组织(布局)
- 常用单元的复用(组件)
- 最佳实践的约束
- 安全性
- 与整体架构的匹配
未来趋势
- 前后端一致
- Full stack
- UI 绑定
- 声明式
未来趋势
- 前后端一致
- Full stack
- UI 绑定
- 声明式
- HTML5
未来趋势
- 前后端一致
- Full stack
- UI 绑定
- 声明式
- HTML5
- 更强的最佳实践约束和工具集成
总结
- 模板是 presentation spec
- 模板解决的问题是:分离前后端关注点
总结
- 模板是 presentation spec
- 模板解决的问题是:分离前后端关注点
- 模板最重要的三个分类维度:前端/后端;逻辑复杂度的控制;DOM-aware
总结
- 模板是 presentation spec
- 模板解决的问题是:分离前后端关注点
- 模板最重要的三个分类维度:前端/后端;逻辑复杂度的控制;DOM-aware
- 如何选择模板:外部条件、功能性、最佳实践的约束
总结
- 模板是 presentation spec
- 模板解决的问题是:分离前后端关注点
- 模板最重要的三个分类维度:前端/后端;逻辑复杂度的控制;DOM-aware
- 如何选择模板:外部条件、功能性、最佳实践的约束
- 未来趋势:……
未来趋势
- 前后端一致
- Full stack
- UI 绑定
- 声明式
- HTML5
- 更强的最佳实践约束和工具集成
未来趋势
- 前后端一致
- Full stack
- UI 绑定
- 声明式
- HTML5
- 更强的最佳实践约束和工具集成
- 前端主导
总结
- 模板是 presentation spec
- 模板解决的问题是:分离前后端关注点
- 模板最重要的三个分类维度:前端/后端;逻辑复杂度的控制;DOM-aware
- 如何选择模板:外部条件、功能性、最佳实践的约束
- 未来趋势:You Decide
感谢
- 感谢在模板和许多技术问题上与我一起交流探讨的:jindw、Winter、GZhang、司徒正美等。
- 本分享也源自于研发Jedi模板引擎,在这里特别感谢以下同事在开发和design review上的帮助:大绵羊、晓良、Sofish、林子、佳辰和飞哥,也要特别感谢百姓网CEO健硕和CTO晓良带领的整个技术团队给予我的信任和极大的自由度。
- 本分享的标题“致我们终将会用的模板”来自一丝同学的创意。“Web标准翻译与贡献”群的朋友也提议了许多有趣的名字:
模板金刚、那些年我们一起干过的模板、当模板遇见html、模板沉思录、可摸的洗衣板……在此一并表示感谢。