【问题标题】:Template Literals from external file来自外部文件的模板文字
【发布时间】:2017-08-10 10:09:02
【问题描述】:

我想将一些变量传递到我拥有的 html 文件中,然后通过电子邮件发送它们。其中大部分与问题无关,因此我将举一个基本示例。

基本模板文字的工作方式如下:

myLink = "google.com"
myID = "testID"
template = `Please visit ${myLink}/${myID} and let them know that ${myID} sent you.`

这会使模板返回:

请访问 google.com/testID 并告知他们是 testID 发送给您的。

我现在已将模板代码复制到外部文件中,并使用fs.readFileSync 将文件读入变量。问题是它实际上并没有在读取文件后评估${myLink}${myID} 值。有没有办法做到这一点?如果模板文字无法做到这一点,请您指出正确的方向吗?

【问题讨论】:

  • 模板文字是 JS 代码。如果您只是在读取文件,那么这将是作为文本读取,而不是作为要运行的代码。你可以在字符串上做一个基于正则表达式的.replace()

标签: javascript


【解决方案1】:

我知道 eval 不太受欢迎,但这似乎是您问题的唯一解决方案。

eval("`"+str+"`");

【讨论】:

  • 投票给我。不管喜不喜欢。这是执行 OP 要求的唯一方法。
  • 是的,eval 在极少数情况下完全没问题。这就是它的用途。不过,我可能会建议在 str 中转义反引号。
  • 如果您不想使用下划线或类似引擎,此解决方案对 HTML 模板具有优势。该文件不包含的不是大的 JavaScript 文字,而是通常的 HTML 标记。编辑器会很好地突出语法。
  • 很高兴看到这个更详细一点。一方面,我看不到变量是如何传递的,我不确定这实际上是在回答 OP 的问题。
  • @benomatis eval 会尝试使用调用时定义的变量来评估模板字符串。因此,如果字符串看起来像"test ${blah} test",而您只是调用eval,您将收到错误“ReferenceError: blah is not defined”。如果您随后将blah 定义为let blah = "asd",则调用eval 将起作用并返回字符串"test asd test"
【解决方案2】:

你不想读取文件,首先将它作为字符串读取,其次有更好的方法来处理 JS 模块。

您想要的是将寺庙字符串作为函数从一个文件导出,然后将其导入另一个文件。

文件 1:

module.exports = (myLink, myID) => `Please visit ${myLink}/${myID} and let them know that ${myID} sent you.`

文件 2:

const createString = require('./file1');
console.log(createString('google.com', 'testID'));

【讨论】:

  • 有用,但不是问题的答案
  • @ThomasW 它怎么不回答这个问题?我的回答解决了 OP 以唯一可行的方式从外部文件导入字符串文字的问题
猜你喜欢
  • 2013-06-08
  • 2020-06-02
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多