重新加载/重新初始化/刷新 CommonJS 模块

Reloading / reinitializing / refreshing CommonJS modules

我了解 CommonJS 模块只能加载一次。假设我们有一个基于哈希导航的单页应用程序,当我们导航到以前加载的页面时,代码不会重新运行,因为它已经加载过一次,这正是我们想要的。

如何让模块的内容重新加载,就好像它还没有初始化一样?例如,如果我在本地存储中有一些数据发生变化,我如何 运行 更新此数据的函数 and/or 在先前加载的模块中更新此数据的最佳方法是什么?

与其直接导出模块的内容,不如将其包装在一个函数中,然后在每次需要该内容时调用该函数。我将此模式用于模块可能需要的任何类型的初始化。这是一个简单(而且愚蠢)的例子:

// this module will always add 1 to n
module.exports = function(n) {
  return 1 + n;
}

对比:

module.exports = function(n1) {
  // now we wrapped the module and can set the number
  return function(n2) {
    return n1 + n2;
  }
};

var myModule = require('that-module')(5);
myModule(3); // 8

另一个包含变化数据的例子:

// ./foo
module.exports = {
  foo: Date.now()
};

// ./bar
module.exports = function() {
  return {
    foo: Date.now()
  };
};

// index.js
var foo = require('./foo');
var bar = require('./bar');

setInterval(function() {
  console.log(foo.foo, bar().foo);  
}, 500);