4

因此,对于 webpack,HMR 仅在您的模块或模块的父级中有此代码时才有效:

if (module.hot) {
  module.hot.accept()
}

这让我想知道为什么你一开始会拒绝 HMR。使用它是否有性能成本或其他负面影响?

文档在这个问题上不是很清楚。

4

1 回答 1

4

如果您的代码只能使用 HMR

  • 要么是无状态的(如 CSS)要么
  • 提供清理旧状态的准备工作

由于大多数代码不是无状态的,因此需要做一些额外的工作。实现此目的的一种常见方法是用代理替换导出的函数(react-hot-loader以类似的方式工作)。因此,可以在不更新其他依赖项的情况下替换代理背后的实际实现。

例如,想象一下这个(错误的)模块:

function add(a, b) {
    return a - b;
}

export add;

注意到这个错误后,你不能只是动态地换掉这个add函数,因为其他模块持有对它的引用。这就是为什么您需要一个包装导出函数的代理:

function _add(a, b) {
    return a - b;
}

export function add(a, b) {
    return _add(a, b);
};

现在您可以轻松换出_add而无需更新其他模块。这适用于函数,但不适用于其他类型,如导出的对象、数字、字符串。但是,使用ES2015 代理,可以导出在所有类型上像代理一样工作的占位符。

因此,HMR 面临的挑战是您需要用新代码替换旧代码,而不会留下任何奇怪的状态。这仍然很难以通用的方式完成。

于 2016-02-08T15:22:43.343 回答