EJS模板代码转Dot引擎语法求助:JS函数与正则适配问题
解决Dot引擎中替代EJS表达式的方案
我来帮你搞定Dot引擎里的这些语法问题!Dot和EJS在模板表达式的处理逻辑上确实存在一些差异,下面针对你遇到的三个场景逐一给出可行的替代方案:
1. 获取日期年份(替代getFullYear())
如果在Dot中直接调用blog.created_at.getFullYear()无效,大概率是因为created_at不是一个原生Date对象(比如后端传递的是字符串格式的日期)。你可以通过两种方式解决:
方案一:后端预处理推荐
在渲染模板前,在后端代码中提前计算好年份并挂载到blog对象上:// 后端示例Node.js代码 blog.year = new Date(blog.created_at).getFullYear();然后模板里直接使用:
{%= blog.year %}方案二:模板内转换
如果必须在模板中处理,先将日期字符串转为Date实例再调用方法:{%= new Date(blog.created_at).getFullYear() %}
2. 正则替换空格(替代replace(new RegExp(" ", "g"), "-"))
Dot支持直接使用正则字面量,相比new RegExp写法更简洁且不易出错,直接替换成:
{%= blog.short_name.replace(/ /g, "-") %}
如果因为特殊场景必须使用构造函数,注意转义模板中的双引号:
{%= blog.short_name.replace(new RegExp(" ", "g"), "-") %}
不过更推荐正则字面量的写法,符合JavaScript常规用法。
3. 匹配图片src属性(替代match(...))
Dot中match方法的逻辑和JS一致,但要注意匹配失败会返回null,直接取[1]会导致模板渲染崩溃。所以需要添加兜底逻辑:
{%= (blog.content.match(/<img[^>]+src="([^">]+)/) || [])[1] || '' %}
解释一下:
(匹配结果 || []):如果匹配失败返回null,就用空数组兜底避免报错[1] || '':如果数组没有索引1的元素(比如匹配到但分组为空),就用空字符串替代
另外,如果你的blog.content是未转义的原始HTML(不是<这种转义后的),需要把正则里的<改成<,>改成>。
额外建议
Dot引擎更推荐尽量在后端预处理数据,减少模板中的复杂逻辑——这样不仅能避免跨模板引擎的语法差异问题,还能让模板结构更清晰,更容易维护。
内容的提问来源于stack exchange,提问作者MikZuit
相关产品推荐
相关产品推荐

