我已经在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)如果有任何问题,请纠正我
答案 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导出的元素。这意味着您无法访问文件中定义但未导出的任何功能。
因此,直接解决您的问题: