将多个MJML文件渲染为一个MJML文件/字符串

时间:2018-10-24 15:44:48

标签: node.js mjml

我正在将一些旧版电子邮件模板转换为mjml(使用mjml 4.2版)。我正在使用Azure Function(NodeJs)使用把手将内容动态添加到模板中,并将最终的html email返回给我,效果很好。我将模板的各个部分分为不同的文件(页眉,页脚,简介等),并使用mj-include将其包括在内。

目前这就是我正在做的事情。

  • 我首先阅读了主mjml文件。

    var mjmlData = fs.readFileSync(filePath,'utf8');

  • 然后运行mjml2html来渲染模板

    var htmlTemplateObject = mjml2html(mjmlData,{filePath:filePath});

  • 然后我运行把手以注入动态内容

    handlebars.compile(htmlTemplateObject.html)(req.body.data)

在使用把手动态注入数据之前,我必须先运行mjml2html,否则把手将不会选择mj-include随附文件中的内容。因此,例如,如果我在动态内容中使用p标签,则样式将不会内联,因为在运行{之前,我已经将mjml模板转换为html {1}}。

在运行handlebars之前,我是否有办法将完整的mjml(包括使用mj-include包含的文件内容)渲染成字符串?

任何帮助,例如mjml2html都会使它成为一个完美的解决方案。

2 个答案:

答案 0 :(得分:1)

我浏览了mjml github存储库,以了解其工作方式,如MJML CLI需要以某种方式组合mj-include元素中的文件,然后再将其转换为{{1 }}。我找到了包含文件的代码,并在html中生成了MJML文档。

我要做的就是导入它并将其用作

mjml-core/lib/includeExternal

然后,我运行把手将动态内容注入模板,并最终运行let mjmlTemplate = mjmlInclude(mjmlBaseTemplate, {filePath: mjmlBaseTemplateFilePath}) 以获取最终的html文件。这样做会将我的样式注入动态内容的mjml2html(mjmlTemplate)mj-style标签中。

答案 1 :(得分:0)

我不认为答案是我的,但它是对上述内容的更新。我在 MJML 团队的 MJML Slack 上看到了这一点。适用于 MJML 4.10.1 的源代码。

<块引用>

嗨! 您可以在这里使用 mjml 解析器,因为我们在 mjml-core 中使用它 https://github.com/mjmlio/mjml/blob/master/packages/mjml-core/src/index.js#L128-L135 并将 json 转换回 xml(我们也有一个内部助手) https://github.com/mjmlio/mjml/blob/master/packages/mjml-core/src/helpers/jsonToXML.js )

不要忘记首先需要完整的 mjml 包来加载注册每个标准组件