使用MarkoJS从字符串而不是文件渲染

问题描述

我将markojs用于我的电子邮件模板,但是现在我们将这些模板移到数据库中以进行在线编辑。 我们仍然需要使用marko来保持完整的HTML结构和变量行为。

我已经找到了两种方法获取模板,如renderSync()这样的字符串,但是它需要模板在compile()之前或与文件一起存在,但是我不知道如何使其与变量处理。

解决方法

您可以使用Marko的load方法来编译模板并获取模板实例,然后可以渲染该模板实例以获取最终的HTML:

const template = require("marko").load(templatePath,templateSource,compilerOptions);
const html = template.renderSync(data);

您可能不需要传递任何custom compilerOptions并且可以省略最后一个参数。

即使您的模板在磁盘上不存在,您仍然需要将templatePath传递给带有伪.marko文件的真实目录。例如,您可以这样做:

const templatePath = path.join(__dirname,`${database.id}.marko`);

templatePath有两个用途:

  1. 用作节点require缓存的键。如果您请求多次编译同一文件名,则将获得原始编译。这可能意味着您在编辑模板时需要清除require缓存:delete require.cache[templatePath];
  2. 发现自定义Marko标签。如果您有电子邮件模板要使用的自定义标签/组件,则应确保使用templatePath allows those tags to be discovered指定的路径。