Javascript NodeJS:能否将变量传递给';需要';?

Javascript NodeJS:能否将变量传递给';需要';?,javascript,node.js,Javascript,Node.js,编辑:为了清楚起见,下面的代码已经简化,以关注当前的问题。我知道窗口在节点中不“存在”。该代码实际上与jsdom一起用于脱机渲染(因此window在我的上下文中可用) 我需要要求一个模块,该模块必须能够访问两个变量才能加载:窗口和文档。 我是新来的节点,我可能缺少一些关于变量范围的东西。我认为内部函数可以访问外部函数的参数。下面是我使用的机制(我知道这段代码没有这么大意义,但我试图从实际代码中提取“想法”): 但它不起作用window和document未定义。 我需要将窗口和文档声明为全局,以使

编辑:为了清楚起见,下面的代码已经简化,以关注当前的问题。我知道
窗口
在节点中不“存在”。该代码实际上与
jsdom
一起用于脱机渲染(因此
window
在我的上下文中可用)

我需要
要求
一个模块,该模块必须能够访问两个变量才能加载:
窗口
文档
。 我是新来的节点,我可能缺少一些关于变量范围的东西。我认为内部函数可以访问外部函数的参数。下面是我使用的机制(我知道这段代码没有这么大意义,但我试图从实际代码中提取“想法”):

但它不起作用<加载
chart.js
时,code>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模块本身

能否将变量传递给“require”

没有

我是新来的节点,我可能缺少一些关于变量范围的东西。我认为内部函数可以访问外部函数的参数

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

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

t2();
确实如此,但是您通过require引入的代码不在上面的
t
t2
函数中

在执行
要求之前,您可以创建全局
窗口
文档
属性:

global.window = /*...*/;
global.document = /*...*/;
…那将是一件坏事™ 在两个层面上:

  • 您的
    require
    调用不一定是加载
    chart.js
    模块的调用

  • 你知道,全球人都很讨厌。这是专业术语

  • 改为,让
    chart.js
    公开一个初始化函数。然后你得到它,用所需的依赖项调用它,你就一切就绪了


    注意:NodeJS没有用户界面。如果您试图进行某种离线渲染,则可能需要一个完整的无头浏览器,如PhantomJS或类似浏览器,而不是NodeJ

    能否将变量传递给“require”

    没有

    我是新来的节点,我可能缺少一些关于变量范围的东西。我认为内部函数可以访问外部函数的参数

    var t = function(window, document){
      var Chart = require('chart.js');
    }
    
    var t2 = function(){
      var window = {};
      var document = {};
      t(window, document);
    }
    
    t2();
    
    确实如此,但是您通过require引入的代码不在上面的
    t
    t2
    函数中

    在执行
    要求之前,您可以创建全局
    窗口
    文档
    属性:

    global.window = /*...*/;
    global.document = /*...*/;
    
    …那将是一件坏事™ 在两个层面上:

  • 您的
    require
    调用不一定是加载
    chart.js
    模块的调用

  • 你知道,全球人都很讨厌。这是专业术语

  • 改为,让
    chart.js
    公开一个初始化函数。然后你得到它,用所需的依赖项调用它,你就一切就绪了




    注意:NodeJS没有用户界面。如果您尝试进行某种脱机渲染,则可能需要一个完整的无头浏览器,如PhantomJS或类似浏览器,而不是NodeJ。

    如果您使用捆绑程序而不进行服务器端渲染,则不需要显式传递
    窗口
    或其任何属性,它们在执行代码时将全局可用(在浏览器中,而不是在节点中)您需要在NodeJS中使用
    window
    ?您确定NodeJS中需要窗口和文档吗?我想我简化了我的示例太多。我这样做是因为我想专注于问题本身(将变量传递给需要的对象)在实际的代码中,
    chart.js
    jsdom
    一起使用来进行一些离线渲染。因此我确实需要
    窗口,可以通过
    jsdom
    获得。你的问题更多的是将变量传递给回调,而不是commonjs。我认为如果你使用的是捆绑程序,而不是服务器端渲染,你不需要exp合法传递
    窗口
    或其任何属性,它们将在执行代码时全局可用(在浏览器中,而不是在节点中)你需要在NodeJS中使用
    window
    ?你确定nodejstanks的家伙们需要窗口和文档吗?我想我简化了我的例子太多了。我这么做是因为我想专注于问题本身(传递变量以满足需要)。在实际代码中,
    chart.js
    jsdom
    一起使用来进行一些脱机渲染。因此我确实需要
    窗口
    ,它可以通过
    jsdom
    获得。你的问题更多的是将变量传递给回调,而不是commonjs。我想谢谢T.J!
    chart.js
    不是我的库。因此(我的意思是我不想“碰”它),我如何使它公开一个初始化函数?关于你的第二点:我使用的是jsdom。它似乎工作得很好,而且它有优势(我认为)从Node vs PhantomJS中设置和使用更简单。@PJC:我不认为你可以。相当确定你想通过jsdom加载
    chart.js
    ,而不是通过NodeJS的
    require
    。好的,是的。这就是我正在做的,它工作很好。我只是担心我不得不公开这两个“全局”变量,但我认为我实际上可以将它们保存在一个模块中,该模块本身将处理所有这些问题(加载jsdom、chart.js等)。@PJC:Yup。如果使用
    var
    (问题中没有链接它们,这是一个非常糟糕的做法),它们的作用域仅限于您的模块,因此不会创建全局。感谢T.J.!
    chart.js
    不是我的库。因此(我的意思是我不想“触摸”它),我如何使它公开初始化函数?关于第二点:我正在使用jsdom。它似乎运行良好,并且具有优势(我认为)从节点和PhantomJS中设置和使用起来更简单。@PJC:我认为你不能。你确定要加载吗<