1. Hot Module Replacement(模块热替换)
如果已经通过HotModuleReplacementPlugin
启用了模块热替换(Hot Module Replacement),则它的接口将被暴露在module.hot
属性
下面。通常,用户先要检查这个接口是否可访问,然后再开始使用它。举个例子,你可以这样accept
一个更新的模块:
if (module.hot) {
module.hot.accept('./library.js', function() {
// 使用更新过的 library 模块执行某些操作...
})
}
支持以下方法……
1.1. module.hot
1.1.1. accept
接受(accept)给定依赖模块
的更新,并触发一个回调函数
来对这些更新做出响应。
module.hot.accept(
dependencies, // 可以是一个字符串或字符串数组
callback // 用于在模块更新后触发的函数
)
1.1.2. decline
拒绝给定依赖模块
的更新,使用'decline'
方法强制更新失败。
module.hot.decline(
dependencies // 可以是一个字符串或字符串数组
)
1.1.3. dispose(或addDisposeHandler)
添加一个处理函数,在当前模块代码被替换时执行。此函数应该用于移除你声明或创建的任何持久资源。如果要将状态传入到更新过的模块,请添加给定data
参数。更新后,此对象在更新之后可通过module.hot.data
调用。
module.hot.dispose(data => {
// 清理并将 data 传递到更新后的模块……
})
1.1.4. removeDisposeHandler
删除由dispose
或addDisposeHandler
添加的回调函数。
module.hot.removeDisposeHandler(callback)
1.1.5. status
取得模块热替换进程的当前状态。
module.hot.status() // 返回以下字符串之一……
Status(状态) | 描述 |
---|---|
idle | 该进程正在等待调用check函数 |
check | 该进程正在检查以更新 |
prepare | 该进程正在准备更新 |
ready | 更新已准备好并可用 |
dispose | 该进程正在调用被替换模块的dispose处理函数 |
apply | 该进程正在调用accept处理函数,并重新执行自我接受(self-accept)的模块 |
abort | 更新已中止,但系统仍处于之前的状态 |
fail | 更新已抛出异常,系统状态已破坏 |
1.1.6. check
测试所有加载的模块以进行更新,如果有更新,则应用它们。
module.hot.check(autoApply).then(outdatedModules => {
// 超时的模块……
}).catch(error => {
// 捕获错误
});
autoApply
参数可以是布尔值,也可以是options
,当被调用时可以传递给apply
方法。
1.1.7. apply
继续更新进程(只要module.hot.status() === 'ready'
)。
module.hot.apply(options).then(outdatedModules => {
// 超时的模块……
}).catch(error => {
// 捕获错误
});
可选的options
对象可以包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
ignoreUnaccepted |
boolean | 忽略对未接受模块的更改。 |
`ignoreDeclined` | boolean | 忽略对模块的更改。 |
ignoreErrored | boolean | 忽略错误,在接收处理程序、错误处理程序和在重新执行模块时抛出错误。 |
onDeclined | function(info) | declined模块提示器 |
onUnaccepted | function(info) | Unaccepted模块提示器 |
onAccepted | function(info) | accepted模块提示器 |
onDisposed | function(info) | disposed模块提示器 |
onErrored | function(info) | 错误提示器 |
函数中的info
参数是包含下列一部分属性的对象:
{
type: "self-declined" | "declined" |
"unaccepted" | "accepted" |
"disposed" | "accept-errored" |
"self-accept-errored" | "self-accept-error-handler-errored",
moduleId: 4, // 模块的问题。
dependencyId: 3, // 对于error: 模块id拥有accept处理程序。
chain: [1, 2, 3, 4], // 对于 declined/accepted/unaccepted: 从何处传播更新的链。
parentId: 5, // 对于 declined: declining 父类的模块id
outdatedModules: [1, 2, 3, 4], // 对于 accepted: 已经过时的模块将会被处理掉
outdatedDependencies: { // 对于 accepted: 接收将处理更新的处理程序的位置
5: [4]
},
error: new Error(...), // 对于 errors: Pro出错误 error
originalError: new Error(...) // 对于 self-accept-error-handler-errored:
//在错误处理程序试图处理它之前,模块抛出错误。
}
1.1.8. addStatusHandler
注册一个函数来监听status
的变化。
module.hot.addStatusHandler(status => {
// 响应当前状态……
})
1.1.9. removeStatusHandler
移除一个注册的状态处理函数。
module.hot.removeStatusHandler(callback)