Javascript 关于Node.js'的混淆;文件需要未导出任何内容的模块时的行为

Javascript 关于Node.js'的混淆;文件需要未导出任何内容的模块时的行为,javascript,node.js,module,Javascript,Node.js,Module,我对Node.js'require()。然而,有些行为对我来说毫无意义 假设我有两个非常简单的单行文件a.js和b.js 在a.js中: require('./b.js'); console.log("testing"); 在b.js中: require('./b.js'); console.log("testing"); 如果我在终端中运行节点a.js,下面是记录的内容: $ node a.js testing. 这意味着,只要需要一个文件/模块,请求文件的内容就会暴露给发出请求的文

我对Node.js'
require()。然而,有些行为对我来说毫无意义

假设我有两个非常简单的单行文件
a.js
b.js

a.js
中:

require('./b.js');
console.log("testing");
b.js
中:

require('./b.js');
console.log("testing");
如果我在终端中运行
节点a.js
,下面是记录的内容:

$ node a.js
testing.
这意味着,只要需要一个文件/模块,请求文件的内容就会暴露给发出请求的文件(,对吗?)


现在我将
a.js
修改为:

require('./b.js');
testFunc(1, 2);
和b.js的链接:

var testFunc = function(a, b) {
    var result = a + b;
    return result;
}
然后再次在终端中运行节点a.js

$ node a.js
/demo/a.js:3
testFunc(1, 2);
^

ReferenceError: testFunc is not defined
......
这是怎么回事?显然,在第一个示例中,通过要求
b.js
a.js
可以访问
b.js
中的内容。但是,在第二个示例中,
b.js
中定义的函数完全不可访问,这一点在
ReferenceError:testFunc未定义
中很明显。这里有什么诀窍


是因为
require()
只运行所需的脚本,而没有将其内容实际公开给请求文件吗?因此,为了使用其他模块的内容,必须使用
module.exports

公开该模块。在第一种情况下,
a.js
不会公开任何内容。在nodejs中,必须将导出的值显式存储到变量中

也就是说,当您需要一个模块时,将执行最高的作用域,以创建将要导出的内容。这就是为什么您会看到正在执行
console.log

如果要从
b.js
导出某些内容,必须执行以下操作:

module.exports = {
  testFunc: testFunc
}
a.js中

var b = require('./b.js')
b.testFunc(1, 2)

换句话说,与许多语言不同,当需要模块时。没有符号附加到全局作用域,因此如果不明确地将
testFunc
定义到模块b
testFunc
,nodejs将永远不会知道什么是
testFunc

您的理解有缺陷

“文件内容向发出请求的文件公开”通常不公开,仅公开
module.exports

节点模块在其自己的作用域内运行,因此模块中的任何代码都无法在其外部访问

您可以看到控制台日志,因为所有控制台消息都指向相同的输出,在本例中为终端

这类似于
console.log()
消息在浏览器中的工作方式。即使下面的代码在
iframe
中运行,并且与主页分开,但是
iframe
和主窗口中的控制台消息都指向开发工具控制台


console.log(“哇”)中可以找到一个很好的答案

当您需要节点JS中的脚本时(在本例中为
b.JS
),除非将其导出,否则它无法实际处理代码——当然,除非您要求脚本执行操作

例如:

a.js

'use strict';

    let b = require('./b.js');

    let result = b.testFunc(1, 4);
    console.log(result);
'use strict';

    module.exports.testFunc = function(a, b) {
        let result = a + b;
        return result;
    }

    console.log(this.testFunc(5,5));
b.js

'use strict';

    let b = require('./b.js');

    let result = b.testFunc(1, 4);
    console.log(result);
'use strict';

    module.exports.testFunc = function(a, b) {
        let result = a + b;
        return result;
    }

    console.log(this.testFunc(5,5));

我不知道这个问题与ES6或express有什么关系。