【问题标题】:Is it possible to unrequire a module in Javascript?是否可以在 Javascript 中取消对模块的要求?
【发布时间】:2018-12-26 21:28:27
【问题描述】:

我正在使用 Browserify 来要求一个 JS 文件,例如 require('./typescript/build/crossing-puzzle-setup' 。但是,考虑到会有许多不同类型的谜题,我想知道,如果我不再需要一个模块,是否可以“取消要求”它?

【问题讨论】:

  • 加载所有模块的后果是什么?现代浏览器在正常情况下会使用大量内存,因此除非您导入数十兆字节的 JavaScript 代码,否则这不太可能成为问题。

标签: javascript browserify require


【解决方案1】:

卸载一个模块没有什么意义,因为代码只占用了非常少量的 RAM,而且由于引擎无法预测 require("some module") 不会再次被调用,所以无法卸载它,所以它不能卸载该模块的存储数据。

【讨论】:

  • 如果不再引用它,为什么它不会被 GC 处理?
  • @tadman 我无法与 browserify 对话,但 Node 实现缓存了所有 require() 返回。
  • @Brad 这是关于 Node.js 的一个好点,但我不确定这在新的模块感知浏览器中如何发挥作用。
  • @tadman 如果他们使用的是 Browserify,那么他们将使用 Browserify 加载器,是吗?
  • @tadman 你怎么能预测require("puzzle") 不会再次被调用?因为如果发生这种情况,节点必须返回完全相同的导出内容
【解决方案2】:

如果您确实加载了太多代码以至于需要强制浏览器卸载它,您可以强制页面刷新,然后加载页面的先前状态。但是,用户会在刷新期间看到浏览器的“页面加载”指示器。

function startReload() {
  // Save all the state you need into a string. An example object:
  const importantAppState = {currentPuzzle: 'level1', username: 'roy'};
  localStorage.setItem('stateBeforeReload', JSON.stringify(importantAppState));

  window.location.reload();
}

// Run this function whenever your page loads:
function onLoad() {
  const previousState = localStorage.setItem('stateBeforeReload');
  if (previousState !== null) {
    // you should re-initialize your app from the state here,
    // dynamically calling `require` on only the files you need

    localStorage.removeItem('stateBeforeReload');
  }
}

【讨论】:

    【解决方案3】:

    对于那些正在寻找 nodeJS 解决方案的人:

    require('../myLib');
    delete require.cache[require.resolve('../myLib')];
    

    不确定上述是否清除了 100% 链接到模块的内存。为此,一种安全的方式似乎是使用这个节点模块:node-disrequire

    【讨论】:

      猜你喜欢
      • 2021-10-19
      • 2015-05-10
      • 1970-01-01
      • 2020-11-06
      • 2016-11-18
      • 2021-01-12
      • 2012-05-27
      相关资源
      最近更新 更多