使用 MarkoJS 从字符串而不是文件呈现
Rendering from strings instead of files with MarkoJS
我将 markojs 用于我的电子邮件模板,但现在我们正在将这些模板移动到我们的数据库中以在线编辑它们。
我们仍然需要使用 marko 来保持完整的 HTML 结构和变量行为。
我找到了 2 种获取模板作为字符串的方法,例如 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
有两个用途:
- 作为节点
require
缓存的键。如果您多次请求编译相同的文件名,您将获得原始编译。这可能意味着您需要在编辑模板时清除 require 缓存:delete require.cache[templatePath];
- 发现自定义 Marko 标签。如果您有电子邮件模板要使用的自定义 tags/components,则应确保
templatePath
allows those tags to be discovered. 指定的路径
我将 markojs 用于我的电子邮件模板,但现在我们正在将这些模板移动到我们的数据库中以在线编辑它们。 我们仍然需要使用 marko 来保持完整的 HTML 结构和变量行为。
我找到了 2 种获取模板作为字符串的方法,例如 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
有两个用途:
- 作为节点
require
缓存的键。如果您多次请求编译相同的文件名,您将获得原始编译。这可能意味着您需要在编辑模板时清除 require 缓存:delete require.cache[templatePath];
- 发现自定义 Marko 标签。如果您有电子邮件模板要使用的自定义 tags/components,则应确保
templatePath
allows those tags to be discovered. 指定的路径