NodeJS:您可以将变量传递给'要求'?

时间:2016-07-14 14:47:01

标签: javascript node.js

编辑: 要清楚,下面的代码已经过简化,专注于手头的问题。我知道window没有"存在"在节点中。实际上,此代码与jsdom一起用于离线渲染(因此window在我的上下文中可用)。

我需要require一个必须有权访问两个变量才能加载的模块:windowdocument。 我是Node的新手,我可能错过了一些关于变量的东西。范围。我认为内部函数可以访问外部函数的参数。所以这里是我使用的机制(我知道这个代码没有那么多意义,但我尝试从实际代码中提取"想法")

var t = function(window, document){
  var Chart = require('chart.js');
}

var t2 = function(){
  var window = {};
  var document = {};
  t(window, document);
}

t2();

但它不起作用。加载window时,documentchart.js未定义。 我需要将windowdocument声明为全局变量才能使其正常工作:

window = null;
document = null;

var t = function(window, document){
  var Chart = require('chart.js');
}

var t2 = function(){
  t(window, document);
}

t2();

但它可能很糟糕。

这是如何完成的?#34;正确"?请注意,我无法修改chart.js模块本身。

1 个答案:

答案 0 :(得分:2)

  

你可以将变量传递给'require'吗?

没有

  

我是Node的新手,我可能错过了有关变量范围的内容。我认为内部函数可以访问外部函数的参数。

var t = function(window, document){
  var Chart = require('chart.js');
}

var t2 = function(){
  var window = {};
  var document = {};
  t(window, document);
}

t2();

确实如此,但您通过上面的tt2函数中的所带来的代码

在执行window之前, 可以创建全局documentrequire属性:

global.window = /*...*/;
global.document = /*...*/;

......这将是两个级别的Bad Thing™:

  1. 您的require电话不一定是加载chart.js模块的电话。

  2. 你知道,全球是icky。这是技术术语。

  3. 相反,让chart.js公开初始化函数。然后你得到它,用所需的依赖关系调用它,你就完全了。

    注意:NodeJS没有UI。如果您正在尝试进行某种离线渲染,您可能需要一个完整的无头浏览器,如PhantomJS或类似的,而不是NodeJS。