编辑: 需要明确的是,下面的代码已被简化以专注于当前的问题。我确实知道 window
在 Node.js 中并不“存在”。该代码实际上与 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();
但是它不起作用。当 chart.js
加载时,window
和 document
未定义。
我需要将 window
和 document
声明为全局变量才能使其工作:
window = null;
document = null;
var t = function(window, document){
var Chart = require('chart.js');
}
var t2 = function(){
t(window, document);
}
t2();
但这可能很糟糕。
这是如何“正确”完成的?请注意,我无法修改 Chart.js 模块本身。
最佳答案
can you pass a variable to 'require'?
没有。
I am new to Node and I am probably missing something regarding variables' scope. I thought an inner function had access to the outer function's parameters.
var t = function(window, document){ var Chart = require('chart.js'); } var t2 = function(){ var window = {}; var document = {}; t(window, document); } t2();
确实如此,但是您通过 require 引入的代码不在上面的 t
或 t2
函数中。
虽然您可以在执行require
之前创建全局window
和document
属性:
global.window = /*...*/;
global.document = /*...*/;
...这在两个层面上都是一件坏事™:
您的
require
调用不一定是加载chart.js
模块的调用。全局变量,你知道,很讨厌。这是技术术语。
相反,让 chart.js
公开一个初始化函数。然后您就明白了,使用所需的依赖项调用它,就一切就绪了。
注意:NodeJS 没有 UI。如果您尝试进行某种离线渲染,您可能需要一个完整的 headless 浏览器,例如 PhantomJS 或类似浏览器,而不是 NodeJS。
关于javascript - NodeJS : can you pass a variable to 'require' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38377332/