编辑: 要清楚,下面的代码已经过简化,专注于手头的问题。我知道window
没有"存在"在节点中。实际上,此代码与jsdom
一起用于离线渲染(因此window
在我的上下文中可用)。
我需要require
一个必须有权访问两个变量才能加载的模块:window
和document
。
我是Node的新手,我可能错过了一些关于变量的东西。范围。我认为内部函数可以访问外部函数的参数。所以这里是我使用的机制(我知道这个代码没有那么多意义,但我尝试从实际代码中提取"想法")
var t = function(window, document){
var Chart = require('chart.js');
}
var t2 = function(){
var window = {};
var document = {};
t(window, document);
}
t2();
但它不起作用。加载window
时,document
和chart.js
未定义。
我需要将window
和document
声明为全局变量才能使其正常工作:
window = null;
document = null;
var t = function(window, document){
var Chart = require('chart.js');
}
var t2 = function(){
t(window, document);
}
t2();
但它可能很糟糕。
这是如何完成的?#34;正确"?请注意,我无法修改chart.js模块本身。
答案 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();
确实如此,但您通过上面的t
或t2
函数中的所带来的代码
在执行window
之前, 可以创建全局document
和require
属性:
global.window = /*...*/;
global.document = /*...*/;
......这将是两个级别的Bad Thing™:
您的require
电话不一定是加载chart.js
模块的电话。
你知道,全球是icky。这是技术术语。
相反,让chart.js
公开初始化函数。然后你得到它,用所需的依赖关系调用它,你就完全了。
注意:NodeJS没有UI。如果您正在尝试进行某种离线渲染,您可能需要一个完整的无头浏览器,如PhantomJS或类似的,而不是NodeJS。