你需要一些模板

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 价值 200 美元的免费积分!

前几天,我收到了一位朋友的来信。 他有一些 HTML、CSS 和 JavaScript 代码,但它们的行为并不像他预期的那样。 HTML 中有一些占位符,JavaScript 中有一些数据,他假设这些数据会填充占位符。

对于我们这些有一定 Web 知识的人来说,我们可以看到为什么它没有按他预期的方式工作。 但我认为从他的角度看待问题也很有价值,然后看看解决方案,希望这些解决方案和最初的问题一样简单。

HTML 代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Test</title>
  <link rel="stylesheet" href="test.css">
  <script src="data.js"></script>
</head>
<body>
  <section>
    <div>{company_name}</div>
  </section>
</body>
</html>

JavaScript 代码如下:

var company_data = {
  "{company_name}" : "SOME COMPANY",
};

这段代码没有任何错误。

这段代码完全有效。 它们已正确链接。 它将运行。 它只是什么也不做,除了在屏幕上渲染 {company_name}。 预期它会渲染 SOME COMPANY 到屏幕上,用来自 JavaScript 文件的数据替换 {company_name} 占位符。

让我们用一行代码来解决它。

在这种情况下,要显示正确的公司名称,我们需要在 DOM 中选择该元素,并用我们的数据替换其内容。 我们可以通过在 JavaScript 中添加这额外的一行代码来实现这一点

var company_data = {
  "{company_name}": "SOME COMPANY"
};

document.querySelector("div").innerHTML = company_data["{company_name}"];

这并不特别可重用或具有弹性,但嘿,它也没有过度思考或过度使用工具。

预期是使用模板

我认为我们现在可以看出,他希望发生的事情是,这种模板可以自动发生。 提供一个对象,其键与 HTML 中的键匹配,HTML 中的内容会自动被替换。 但使用原始的 Web 技术无法实现这种效果。

毫不夸张地说,有数百种方法可以处理这种情况。 以下是我的脑海中想到的一些方法。

  • 使用模板语言,例如 HandlebarsMustache
  • 使用静态站点生成器,例如 Eleventy,它默认使用 Liquid
  • 创建 HTML <template> 并编写自己的脚本使用它
  • 创建一个 Web 组件
  • 使用后端语言,或使用像 Nunjucks 这样的语言提前进行处理
  • 使用预处理器,例如 Pug

一般来说,我建议在服务器端或构建过程中进行模板化 — 如果没有必要,为什么要修改 DOM 呢?

但让我们暂时忽略这一建议,以下是如何在客户端使用 Handlebars 进行模板化的示例,这样来自原始邮件的朋友就有一个可行的例子,说明它是如何工作的