工作要求,需要在项目里写 MJML 模板邮件。差不多就是在服务端内写好所有的邮件模板,到时候发送的时候选哪个发送哪个。

在 NestJS 框架下写模板邮件有这些问题:

  1. 如何让框架知道哪些模板文件存在?
  2. 如何检查 MJML 语法?
  3. 如何验证占位符是否存在?
  4. 如何看到真实邮件内容差异?
  5. 如何让程序检查每个占位符是否正确?

MJML 变量类型验证

我的方案是,写一个 service 可以自动提取 MJML 模板里的变量,然后与一个手动写好的 TypeScript 类型定义进行对比验证。

提取逻辑很简单,用正则就好。

麻烦一点的是模板类型定义,需要自己手动写。

我会建议这么做:

  1. 定义邮件系统中所有可能用到的每一个占位符,并且强制规定命名规范
  2. 为每一个字段都定义一个数据类型、是否必需以及描述
  3. 将这些占位符组合成多个可复用的模板组,例如 footer 模板组
  4. 写一个检查器,要可以检查所有的 MJML 占位符、根据提取出来的变量与已经定位好的占位符进行比对,然后指出问题所在

这么做之后,就可以在发出有问题的邮件之前报错。

MJML Lint 工具

Lint 真的很好用,所以我想要在 MJML 里也写这么一个 Lint 工具。

MJML 热加载

我遇到了一个坑。

我使用了 chokidar 来监听文件系统变化。

结果问题在于,chokidar 在 Node.JS 进程启动时进行初始化时,容易出错并且导致 Node.JS 进程直接崩溃。