NodeJS - 如何从其他文件中导入函数并像之前已有这些函数一样使用?

6

假设我有一个名为 server.js 的文件:

//server.js
    var net = require('net');
    var server = net.createServer(function (socket){
    socket.on('data',function(data){
        console.log("Received: "+data);
    });
});

还有一个名为functions.js的文件:

//functions.js
module.exports = {
  test: function () {
    // do something
  },
  other: function () {
    // do something
  }
};

我知道我可以像这样做:

var functions = require('./functions');
functions.test();

但我真的希望能够直接使用该函数,就像这样:
require('./functions');
test();

有什么建议吗?

3个回答

10

虽然你可以将它们加载到全局变量中,但另一种可能更明智的方法是将该方法分配给变量test

var test = require('./functions').test;
var functions = require('./functions');
var test2 = functions.test;

* = 我说“明智”是因为触及全局范围可能会产生一些意外结果,降低了通用可读性(嘿,这个test变量从哪里来的?我没有在代码中看到它被定义。),最坏的情况是,你可能会遇到名称冲突,甚至覆盖你在global范围内需要的某些东西。并不是说将某些东西加载到全局范围内不是一个好主意,甚至非常有用,但通常情况下,为了可读性,最好将事物局限于本地作用域。

有关在浏览器中触及全局范围的文章


1
哦,我感觉自己好蠢啊。当然我可以用 var test = functions.test 这种语法...不知怎么的,我竟然忘记了这种写法!谢谢你。 - MagisterMundus
1
如此明显...我为什么认为函数需要在全局范围内可用,这对我来说是个谜。:) - Robert Rossmann
@RobertRossmann 有时候确实会让事情变得更容易,特别是当你在一个大型项目中的每个文件中都使用同一个函数的时候 :) 尽管如你所提到的,这种做法并不被鼓励,而且真的会损害整体可读性。 - Brandon Anzaldi
有没有办法自动为所有函数执行此操作? - john k

3

好的,您可以将函数放入global变量中,这样它们就可以在代码的任何地方访问,但是这通常不鼓励使用,而是推荐使用您已经在代码示例中概述的首选用法。

如果您坚持将变量放在全局范围内,可以执行以下操作:

// function.js
global.test = function test () {/* ... */}
// ...

// Somewhere else...
require('./functions')
test()

为了至少部分改进这一点,您可以实现这样一个机制:只有当需要的模块导入时,function.js文件才将函数真正导出,并且各个函数只被分配给global范围。这样,您可以至少正确地测试这些函数。
更新: 您没有说明是否希望在整个应用程序中都可以使用该函数,还是只在当前作用域(即您require它们的地方)中使用-如果您只需要在当前作用域中使用它们,则最好避免使用global变量,而是将这些函数分配给变量。
var functions = require('./functions')
  , test = functions.test
  , other = functions.other

// Use as necessary
test()

0

试试这个:

require('./functions')();
test();

无法工作,请解释一下。 - john k

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