Node.js有类似PHP的include吗?这样包含的代码可以访问父文件的变量吗?

6
我希望将我的Node应用程序拆分为几个单独的文件,以使其更加模块化和易于维护。
但是,由于没有像其他语言(如PHP)中直接“包含”当前解析文件的文件的方法,因此我的“模块”或“单独的文件”无法自动访问在“需要”它们的脚本中定义的变量。
我该怎么做?
我在我的单独文件中考虑做这样的事情:
module.exports = function(stuff) {
  //I now have access to 'stuff'.
}

但这有点繁琐。

我相信可能已经有人比我更早解决了这个问题,那么你有什么建议呢?


1
阅读文档:http://nodejs.org/docs/v0.5.5/api/modules.html 在模块内使用 exports 对象可以使特定变量或函数公开,而其他变量则保持私有。这很不错。 - David Sherret
2
我的“模块”或“独立文件”不能自动访问在“require”它们的脚本中定义的变量 - 那不会使你的代码更难维护吗? require.js模块的想法是它们提供功能供其他脚本使用;如果它们想要访问其他模块的公共数据/方法,它们应该自己要求这些模块。 - Paul D. Waite
1
将数据作为参数传递给函数调用,在长期运行中比PHP的默认方法“我是一个模板!让我们在任何地方使用全局变量!”更容易。 - Quentin
@PaulD.Waite 另一种选择是在我的主JS文件中定义所有内容,但这样会使它变得非常庞大。我理解“模块”的概念,但在这种情况下,我不想要一个“模块”,我只是想将我的逻辑分离到不同的文件中。其中许多需要访问我的socket.io sockets变量和sequelize等内容。 - Petter Thowsen
@PetterThowsen:啊,我明白了。我对Node.js的使用还不够熟悉,不知道它的预期方法是什么。 - Paul D. Waite
显示剩余2条评论
1个回答

2

在模块之间共享变量的最简单的方法是将变量分配给全局命名空间对象。在Node中,变量被声明在全局作用域下,类似于在浏览器中全局声明变量,但它们仍然属于特定的模块,并存储在global对象中。

虽然使用全局范围被认为是不良实践,但比其他方法更简单:

foo.js

global.num = 3;
global.str = 'a string';
require('./bar');

bar.js

console.log(num);  // 3
console.log(str);  // a string

这是极其糟糕的做法。对于快速、脏测试或自然单例(例如,我们将日志记录器保留为全局变量),这是可以接受的。正确的方法是使用 module.exportsexports.NAME - Tony
1
那不是问题所要求的,而且我已经在答案中声明了那是一种不好的实践。问题正在寻找一种简单的方法,可以在不将函数分配给“module.exports”的情况下从主脚本传递变量到模块。另外,我不是将值从模块导出到其父级,而是将变量从父级传递到模块。 - hexacyanide
我是在重申你承认的不良实践,这从我的评论中显然不够清楚。但是,虽然它解决了问题,但我们应该宣传不良实践吗? - Tony
1
我认为,提供带有免责声明的信息是可以的。使用一种方法还是不使用,取决于提出问题的人。因此,这个网站允许他们选择自己的答案。 - hexacyanide

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接