NestJS 里开发 MJML 模板邮件
工作要求,需要在项目里写 MJML 模板邮件。差不多就是在服务端内写好所有的邮件模板,到时候发送的时候选哪个发送哪个。
在 NestJS 框架下写模板邮件有这些问题:
- 如何让框架知道哪些模板文件存在?
- 如何检查 MJML 语法?
- 如何验证占位符是否存在?
- 如何看到真实邮件内容差异?
- 如何让程序检查每个占位符是否正确?
MJML 变量类型验证
我的方案是,写一个 service 可以自动提取 MJML 模板里的变量,然后与一个手动写好的 TypeScript 类型定义进行对比验证。
提取逻辑很简单,用正则就好。
麻烦一点的是模板类型定义,需要自己手动写。
我会建议这么做:
- 定义邮件系统中所有可能用到的每一个占位符,并且强制规定命名规范
- 为每一个字段都定义一个数据类型、是否必需以及描述
- 将这些占位符组合成多个可复用的模板组,例如 footer 模板组
- 写一个检查器,要可以检查所有的 MJML 占位符、根据提取出来的变量与已经定位好的占位符进行比对,然后指出问题所在
这么做之后,就可以在发出有问题的邮件之前报错。
MJML Lint 工具
Lint 真的很好用,所以我想要在 MJML 里也写这么一个 Lint 工具。
MJML 热加载
我遇到了一个坑。
我使用了 chokidar 来监听文件系统变化。
结果问题在于,chokidar 在 Node.JS 进程启动时进行初始化时,容易出错并且导致 Node.JS 进程直接崩溃。