Javascript NodeJS:模块共享状态的值

Javascript NodeJS:模块共享状态的值,javascript,node.js,Javascript,Node.js,我正在阅读模块的教程,在学习模块的共享状态时,我遇到了一些疑问: 我编写了以下代码: Sparsh.js var popcorn = require('./popcorn'); popcorn.favPopCorn = 'cheese'; console.log(popcorn.favPopCorn); Ravi.js var popcorn = require('./popcorn'); console.log(popcorn.favPopCorn); app.js require('./

我正在阅读模块的教程,在学习模块的共享状态时,我遇到了一些疑问:

我编写了以下代码:

Sparsh.js

var popcorn = require('./popcorn');
popcorn.favPopCorn = 'cheese';
console.log(popcorn.favPopCorn);
Ravi.js

var popcorn = require('./popcorn');
console.log(popcorn.favPopCorn);
app.js

require('./Ravi');
require('./Sparsh');
require('./Ravi');
爆米花

module.exports = {
    printRate : function() {

        console.log('popcorn rate');
    },
    favPopCorn : ''
};
输出 (空白) 奶酪 (空白)

根据输出,第一个空格相当大,因为我们没有给favPopCorn分配任何值。但是在我在Sparsh.js中将值分配给favPopCorn之后,它应该打印“cheese”,而我们再次使用require(“.\Ravi.js”);因为这是一个共享状态

请帮助

Ravi.js
也是共享的(好吧,“缓存”是一个更好的词),所以它只加载一次(第一次)。第二次,节点知道它已经被加载,并且第二次不加载(/execute)它(它不输出空白,它根本不输出)

常见的解决方法是导出函数:

// Ravi.js
var popcorn = require('./popcorn');

module.exports = function() {
  console.log(popcorn.favPopCorn);
}

// Sparsh.js
var popcorn = require('./popcorn');

module.exports = function() {
  popcorn.favPopCorn = 'cheese';
  console.log(popcorn.favPopCorn);
}

// app.js
require('./Ravi')();
require('./Sparsh')();
require('./Ravi')();
Ravi.js
也是共享的(好吧,“cached”是一个更好的词),所以它只加载一次(第一次)。第二次,节点知道它已经被加载,并且第二次不加载(/execute)它(它不输出空白,它根本不输出)

常见的解决方法是导出函数:

// Ravi.js
var popcorn = require('./popcorn');

module.exports = function() {
  console.log(popcorn.favPopCorn);
}

// Sparsh.js
var popcorn = require('./popcorn');

module.exports = function() {
  popcorn.favPopCorn = 'cheese';
  console.log(popcorn.favPopCorn);
}

// app.js
require('./Ravi')();
require('./Sparsh')();
require('./Ravi')();

这种思考的一种干净模式是在共享模块中创建一个具有
new
的对象:

//popcorn.js

function popcorn(){
    this.printRate = function() {
        console.log('popcorn rate');
    }
    this.favPopCorn = "" 
}

module.exports = new popcorn()

现在,当您在其他模块中获取并设置
favPopCorn
属性时,您将操作一个单例。

这种思考的一种干净模式是在共享模块中创建一个具有
new
的对象:

//popcorn.js

function popcorn(){
    this.printRate = function() {
        console.log('popcorn rate');
    }
    this.favPopCorn = "" 
}

module.exports = new popcorn()

现在,当您在其他模块中获取并设置
favPopCorn
属性时,您将操作一个单例。

每次您需要ravi.js时,variable popcorn都会在ravi.js中重新初始化,因此根据变量范围,输出是正确的,它是一个共享状态,因此当我们在Sparsh.js中更改它时,favPopCorn的值应该反映在Ravi.js中。但是我再次检查了这一点,我们只能使用“require('anymodule')”一次,因此添加require('./Ravi');没有多大意义您必须从变量声明中删除“var”,以便通过将其放入全局来共享变量。每次您需要ravi.js时,variable popcorn都会在ravi.js中重新初始化,因此根据变量范围,输出是正确的。根据教程,它是一个共享状态,因此当我们在Sparsh.js中更改它时,favPopCorn的值应该反映在Ravi.js中。但是我再次检查了这一点,我们只能使用“require('anymodule')”一次,因此添加require('./Ravi');没有多大意义您必须从变量声明中删除“var”才能通过将其放入全局来共享。是的,您是对的,但是您能告诉我应该如何反映修改后的值吗。是的,您是对的,但是您能告诉我应该如何反映修改后的值吗。