【问题标题】:nodejs: how to use literals in external require?nodejs:如何在外部需求中使用文字?
【发布时间】:2019-04-02 10:52:41
【问题描述】:

这是我的例子:

var name="Doe";
var template = require('./template.txt');

并且 template.txt 包含:

`hello ${name}`

我收到错误:名称未定义。

有什么想法吗?

【问题讨论】:

标签: node.js


【解决方案1】:

你真的想从.txt文件中获取JS代码并运行它,所以你需要臭名昭著的eval

var name="Doe";
var template = require('fs').readFileSync('./template.txt');
template = template.toString().trim();

console.log(eval(template)) // will output: hello Doe

虽然像这样运行 JS 代码可能很危险,但如果模板是您控制并由您编写的文件,那么我想可以做到。

当然,您可以简单地使用模板引擎,例如 EJSnunjucks

【讨论】:

    【解决方案2】:

    来自Node.js documentation

    模块包装器
    在执行模块的代码之前,Node.js 将 用如下所示的函数包装器包装它:

    (function(exports, require, module, __filename, __dirname) { // Modulecode actually lives in here });

    通过这样做,Node.js 实现了一些 事情:

    • 它将顶级变量(使用 var、const 或 let 定义)保持在范围内 到模块而不是全局对象
    • 它有助于提供一些 实际上特定于模块的全局变量, 如:

      • 实现者可以用来导出的模块和导出对象 来自模块的值。
      • 便利变量 __filename 和 __dirname,包含模块的绝对文件名和目录路径。

    globals:

    在浏览器中,顶级作用域是全局作用域。这意味着 在浏览器中var something 将定义一个新的全局变量。在 Node.js 这是不同的。顶级范围不是全局的 范围; Node.js 模块中的var something 将是本地的 模块。

    因此,当我们在一个模块中定义变量时,程序中的其他模块将无法访问该变量,但您可以在没有var 的情况下声明您的变量,它将被定义为全局变量。

    此线程中的更多信息:Where are vars stored in Nodejs?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 2019-02-18
      • 1970-01-01
      相关资源
      最近更新 更多