重构后端模板文件的一种实践

后端的动态模板

Java后端通常会使用ftl(freemarker template language)模板文件来动态返回前端页面。这个工作,通常还可以用jspphp文件来实现。但这些动态模板的实现,通常是在已有的html文件上对特定的、需要做动态处理的部分做改写。这对小项目来讲没什么不对。可如果你的页面数量足够多,维护它们将成为一件异常困难的事情。

Nodejs大前端技术

在目前的大前端技术栈下,Nodejs的各种框架让前端开发变得规矩不少:传统前端的html+css+js的技术栈的最大问题在于其模块化、组织能力像是一个教学语言,应有的语句控制和代码复用的技术,都显得苍白无力。

就html的编写来讲,几乎不存在一种类似函数的复用方式,能够简化重复的UI component的生成。你只能不断地去写一些重复的、杂乱的代码。整体上来讲,这不仅难以做后期的维护,也无法轻易地看懂其间的代码逻辑。

一句话来讲,这些代码非常类似于机器代码或者汇编代码。没有高级语言的精准控制和抽象层去对代码做宏观把控。

Pugjs是一个很好的html预处理项目。它的基本想法是:

不要去直接编写“底层”的html代码,而是用自己定义的一套语法去编写pug文件。通过这个pug文件去生成出html代码。

特别地,在它的语法中,你不必再写一大堆的尖括号和与前后呼应的tag。如同Python,仅仅依靠代码的对齐方式,就可以自动识别相应的作用域范围。例如

<div>
    <ul>
        <li> First tip </li>
        <li> Second tip </li>
        <li> Third tip </li>
    </ul></div>

这样语义简单、语法繁琐的一堆代码,在pug下可以简化为

div
    ul
        li First tip
        li Second tip
        li Third tip

  

但这还不是最诱人的技术,因为这无非是加入了一些语法糖。最为诱人的是pug提供的函数,它能够定义一个函数去生成某个组件。

例如,如果你需要定义一组table,每个table仅仅是表头或者其中一部分的数据不一样,你该如何处理?传统的方式当然是复制粘贴一堆模板代码,然后一个个地去修改里面的数据。

pug的处理方式就要好太多,完全符合将数据和代码分离的思想。定义函数:

mixin leftbox-gen(dataObj)
        table.table
            thead
                tr
                    th(scope="col") #{dataObj.title}
            tbody
                each area in dataObj.areas
                    tr
                        td
                            .box-title #{area.name}
                            ul
                                each subarea in area.subareas
                                    li
                                        a(id=subarea.id, href=subarea.url) #{subarea.name}

  

这样就可以根据通过定义json格式的dataObj去引用函数:

+leftbox-gen(cs_leftbox_data)

  

你通过不同的json数据,就能够生成不同的table出来。这就实现了代码的模块化和以及数据和业务代码的分离。要做出新的table component,你只需要改变数据就可以了。

这样的实现方式在别的高级语言中是很常见的,但是在传统的前端代码中,这常常难以见到。原因就在于,html代码更像是没有抽象层的机器代码,只是一大堆的实际操作,而缺少抽象层的高效管理。

前端预处理和后端动态模板的结合

pug这样优秀的工具,如果能够用来管理后端的ftl模板当然会相当合适。优秀的语法糖、代码模块化、数据和业务逻辑的分离,实在是相当诱人的选择。

但这样的理念真要实施在生产代码中,特别是用来重构已有的legacy code时,就不大容易了。

例如,pug只能生成html代码,且生成出来的位置通常是在一个统一的地方。可ftl代码却分散在各个不同Java工程的不同目录之下。这两者很难统一到一起。

或许一个直接的想法是,不如直接把所有的ftl都放到一个地方,这样就不用把模板语言分散到各个不同项目的不同文件夹里,而难以维护。

但这种方案带来的一个麻烦是,如果真的把后端的ftl文件挪动了位置,那么后端代码的接口部分就不得不做修改。而这样的接口部分其数量并不少。既要做出大量的修改,还要保证它们的正确性,并不是一件轻松的事情。

经过大量的思考和尝试得出的一个解决方案是:

使用Pugjs生成出统一的ftl文件,放在同一个公共资源文件夹下。让每一个具体项目下的ftl文件中,直接include这个公共资源文件夹中ftl内容。

这种做法的一个精妙之处是:它将ftl文件当作函数接口来使用。后端Java代码调用ftl文件可以看作是函数调用。而函数实现并不需要直接放在这个ftl文件里,而是可以放在别的地方做引用。这就把实现和调用部分,通过一个单独的文件分离开了。

这里虽然处理的是后端模板文件和前端的一个结合,但其思想可以利用在别的地方。如果一个模板文件具备了include功能,便可以把模板文件本身当作接口,从而将实现与定义分离。

近期回顾

为什么程序员需要知道互联网行业发展史
是大家突然变low了吗?
至暗时刻

如果你喜欢我的文章或分享,请长按下面的二维码关注我的微信公众号,谢谢!

更多信息交流和观点分享,可加入知识星球:

原文地址:https://www.cnblogs.com/kid551/p/9744640.html

时间: 2024-10-12 05:54:38

重构后端模板文件的一种实践的相关文章

Linux开源模块移植概述暨交叉编译跨平台移植总结--摘自《嵌入式Linux驱动模板精讲与项目实践》

本文摘自<嵌入式Linux驱动模板精讲与项目实践>一书中的"开发与调试技巧". Linux的强大威力就在于有很多开源项目可以使用,通常很多需求可以通过寻找相关的开源模块做为快速解决方案.要把这些开源模块应用到嵌入式中,其中一个关键点就是要使用交叉编译工具对开源项目进行交叉编译. 根据具体情况,下载的开源项目在组织上有很多情况,在此对各种情况进行归类介绍. 1. 下载的开源软件包找不到Makefile 对于这种开源包通常是采用configure的方式组织的,那么第一步就是使用

PHP模板引擎的原理与实践

0x00 模板引擎的原理 模板引擎就是在模板文件中使用一系列提前约定好的标签代替原生PHP代码,通过访问一个PHP的入口文件,会有一个PHP编译文件根据约定替换模板内标签以及标签内变量,最终将模板文件编译成一个PHP文件,然后展示到浏览器中. 模板文件 前端开发者将前端代码中的所有数据替换成与服务端开发者约定好的标签及变量名. PHP入口文件 服务端开发者将前端代码中所需要的变量注入到前端. PHP编译文件 该文件中是模板引擎中的核心,在这里我们定义了 标签 语句 等,通过读取模板文件,使用正则

Item 44:将参数无关代码重构到模板外去

Item 44: Factor parameter-independent code out of templates. 模板是个好东西,你可以在实现类型安全的同时少写很多代码.但模板提供的是编译期的多态, 即使你的代码看起来非常简洁短小,生成的二进制文件也可能包含大量的冗余代码. 因为模板每次实例化都会生成一个完整的副本,所以其中与模板参数无关的部分会造成代码膨胀(code bloat). 把模板中参数无关的代码重构到模板外便可以有效地控制模板产生的代码膨胀. 另外代码膨胀也可以由类型模板参数

细说后端模板渲染、客户端渲染、node 中间层、服务器端渲染(ssr)

细说后端模板渲染.客户端渲染.node 中间层.服务器端渲染(ssr) 前端与后端渲染方式的发展大致经历了这样几个阶段:后端模板渲染.客户端渲染.node 中间层.服务器端渲染(ssr). 1. 后端模板渲染 前端与后端最初的渲染方式是后端模板渲染,就是由后端使用模板引擎渲染好 html 后,返回给前端,前端再用 js 去操作 dom 或者渲染其他动态的部分. 这个过程大致分成以下几个步骤: 前端请求一个地址 url 后端接收到这个请求,然后根据请求信息,从数据库或者其他地方获取相应的数据 使用

Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目下建立文件MANIFEST.MF,内容如下: Manifest-Version: 1.0 Class-Path: lib/commons-codec.jar lib/commons-httpclient-3.1.jar lib/commons-logging-1.1.jar lib/log4j-1.

Android Sdudio 模板文件的新建。

?今天在新建一个Activity的时候, 随手就创建了一个空的activity,而且, AS 还会给你自动生成xml文件, 跟一些activity里默认的代码. ?到这里, 我就把AS的安装目录给翻了个遍~~~~终于找到这个模板文件的位置了...模板路径:plugins\android\lib\templates   可以看到,下面有很多文件夹  ? 我们点开activities文件夹.  ? 可以看到,我们在AS中新建activity时的模板名字,在这里都能找到-- 然后随便打开一个,往里看

YAML 模板文件语法

YAML 模板文件语法 默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建. 其它大部分指令都跟 docker run 中的类似. 如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中再次设置. image 指定为镜像名称或镜像 ID.如

DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版及制作Visual Studio C#项目模板文件详解

关于 DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版---------------------------------------------------------基于 官方原版的安装包 + http://www.cnblogs.com/tracky 提供的补丁DLL制作而成.安装之后,直接就可以用了.省心省事.不必再单独的打一次补丁包了.本安装包和补丁包一样都删除了官方自带

DEDECMS模板文件命名规则

DEDECMS提供的模板文件命名规则,也算是一种规范吧,希望能给大家提供参考.模板保存位置模板目录:{cmspath} /templets/样式名称(英文,默认为default,其中system为系统底层模板,plus为插件使用的模板)/具体功能模板文件}模板文件命名规范① index_识别ID.htm:表示板块(栏目封面)模板:② list_识别ID.htm:表示栏目列表模板:③ article_识别ID.htm:表示内容查看页(文档模板,包括专题查看页):④ search.htm:搜索结果列