javascript - NodeJS : can you pass a variable to 'require' ?

标签 javascript node.js

编辑: 需要明确的是,下面的代码已被简化以专注于当前的问题。我确实知道 window 在 Node.js 中并不“存在”。该代码实际上与 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();

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

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 引入的代码不在上面的 tt2 函数中。

虽然您可以在执行require之前创建全局windowdocument属性:

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

...这在两个层面上都是一件坏事™:

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

  2. 全局变量,你知道,很讨厌。这是技术术语。

相反,让 chart.js 公开一个初始化函数。然后您就明白了,使用所需的依赖项调用它,就一切就绪了。

<小时/>

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

关于javascript - NodeJS : can you pass a variable to 'require' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38377332/

相关文章:

javascript - 原型(prototype)与函数定义

javascript - 删除在另一个 <li> 中具有相同值的 <li>

node.js - 如何捕获 getaddrinfo ENOTFOUND

node.js - 是否可以通过安装在 Heroku 上的不和谐机器人来播放音乐/声音?

node.js - 您是否建议对 Azure 应用服务上托管的应用程序使用 Bunyan 或 Morgan 等记录器

node.js - 监听数据库变化的最佳方式是什么?

javascript - Draft js 保存和渲染或显示内容

javascript - 使光标悬停区域变大

javascript - 错误: $injector:modulerr Module Error/Angular service

javascript - 如果父 div 没有显示子项,则显示某个不同的子 div