module.exports会在哪里导出您的函数,以及在我们仍然使用该函数时有什么用途要求将代码导入您的模块

时间:2018-10-22 17:17:34

标签: javascript node.js

我已经在node.js中编写了以下代码

notes.js

console.log('notes app is running');

app.js

const notes = require('./notes.js');

console.log(notes);

当我导入代码并运行app.js时,输出显示为notes app is running

现在我更新了notes.js的代码

console.log('notes app is running');
addNote = () =>{
 console.log('addNote');
 return  'New note';
} ;

现在我想在代码中使用以下箭头功能,以便更新

app.js

const notes = require('./notes.js');
     var res = notes.addNote();
    console.log(res);
    console.log(notes);

现在是引发我错误

notes.addNote is not a function

1)我知道我应该使用module.exports.addNote

2)但是我想知道为什么我们可以不使用module.exports语句而看到在notes.js中编写的日志。为什么我们不能使用require语句并存储总代码并像我们对类的实例那样从该变量中调用函数

3)更为珍贵的是module.export在何处导出您的代码(我的意思是将directrey导出到哪)

4)如果有任何问题,请纠正我

2 个答案:

答案 0 :(得分:3)

(#1和#4不需要答案,因此我将其保留。)

  

2)但是我想知道为什么我们可以不使用module.exports语句而看到在notes.js中编写的日志。

使用Node.js的模块样式(这是CommonJS的一种样式),在第一次require d时加载并执行一个模块。您的console.log在模块的代码中,因此,当您require(第一次)使用该代码时,该代码就会运行。

  

为什么我们不能像使用类实例那样使用require语句并存储总代码并从该变量中调用函数

如果您要这样做,可以:

exports = {
    // code here as object properties
    addNote: () => {
        console.log('addNote');
        return  'New note';
    }
};

const mod = require("./notes.js");
mode.addNote();
  

3)更为珍贵的是module.export在何处导出您的代码(我的意思是将directrey导出到哪)

到内存中的module cache

答案 1 :(得分:1)

在内部,节点缓存所有模块。为此,它从入口点文件(例如您的app.js文件)开始,然后递归搜索所有 require 语句(或导入)。

当节点解析模块时,将执行文件顶层的任何代码-例如console.log行

console.log('notes app is running');

但是,请注意,此时文件中的任何内容都没有暴露给您的代码库的任何其他部分。而是,节点采用通过module.exports导出的任何值,并将其添加到内部缓存中。该高速缓存被键入到require语句中显示的文件路径上(转换为绝对路径),因此,例如,以下require语句:

const module1 = require('../module1.js');
const module2 = require('../module2.js');

将导致如下所示的缓存条目:

<path_to>/../module1.js = ... contents of module1.exports
<path_to>/../module2.js = ... contents of module2.exports

每当您再次需要这些模块之一时,将获得模块的缓存版本,而不会重新解析文件。对于您的示例,这意味着无论您需要多少次notes.js文件,它都只会打印console.log(“ notes应用正在运行”);声明一次。

由于节点隔离加载模块的方式,因此只能访问通过module.exports导出的元素。这意味着您无法访问文件中定义但未导出的任何功能。

因此,直接解决您的问题:

  • 我知道我应该使用module.exports.addNote
    • 是的。不过,您也不能为module.exports分配一个新对象,例如module.exports = {addNote};
  • 但是我想知道为什么我们不使用module.exports语句就能看到在notes.js中编写的日志。为什么我们不能使用require语句并存储总代码并像我们对类的实例那样从该变量中调用函数
    • 因为节点在生成缓存时会解析所有必需的文件
  • 更珍贵的是module.export在哪里导出您的代码(我指的是directrey)
    • 它们不存储在目录中,而是根据module.exports的文件名和内容缓存在内存中
  • 如果有任何问题,请纠正我
    • 猜测这个不需要答案