gpt4 book ai didi

javascript - Webpack 中的热模块替换到底是什么?

转载 作者:IT老高 更新时间:2023-10-28 13:15:20 24 4
gpt4 key购买 nike

我读过 few pages关于 Webpack 中的热模块替换。
甚至还有一个 sample app那个uses it .

我已经阅读了所有这些,但仍然不明白。

我可以用它做什么?

  • 它应该只用于开发而不用于生产吗?
  • 是不是像LiveReload一样,但是必须自己管理?
  • WebpackDevServer 是否以某种方式与 LiveReload 集成?

  • 假设我想在将 CSS(一个样式表)和 JS 模块保存到磁盘时更新它们,而无需重新加载页面,也无需使用 LiveReload 等插件。这是热模块更换可以帮助我的东西吗?我需要做什么样的工作,HMR 已经提供了什么?

    最佳答案

    首先,我想指出热模块更换 (HMR) 仍然是一个实验性功能。

    HMR 是一种在正在运行的应用程序中交换模块的方式(以及添加/删除模块)。您基本上可以更新更改的模块而无需重新加载整页。

    文档

    先决条件:

  • 使用插件:https://webpack.js.org/concepts/plugins/
  • 代码拆分:https://webpack.js.org/guides/code-splitting/
  • webpack-dev-server: https://webpack.js.org/configuration/dev-server/

  • 对于 HMR 来说,这不是很多,但这里是链接:
  • 示例:https://webpack.js.org/guides/hot-module-replacement/
  • API:https://webpack.js.org/concepts/hot-module-replacement/

  • 我会将这些答案添加到文档中。

    它是如何工作的?

    从应用程序 View

    应用程序代码要求 HMR 运行时检查更新。 HMR 运行时下载更新(异步)并告诉应用程序代码有可用更新。应用程序代码要求 HMR 运行时应用更新。 HMR 运行时应用更新(同步)。应用程序代码在此过程中可能需要也可能不需要用户交互(由您决定)。

    从编译器(webpack)来看

    除了正常的 Assets 之外,编译器还需要发出“更新”以允许从以前的版本更新到这个版本。 “更新”包含两部分:
  • 更新 list (json)
  • 一个或多个更新块 (js)

  • list 包含新的编译哈希和所有更新块的列表 (2)。

    更新块包含此块中所有更新模块的代码(如果模块被删除,则包含一个标志)。

    编译器还确保模块和块 ID 在这些构建之间保持一致。它使用“记录”json 文件在构建之间存储它们(或将它们存储在内存中)。

    从模块 View

    HMR 是一项可选功能,因此它仅影响包含 HMR 代码的模块。该文档描述了模块中可用的 API。通常,模块开发人员编写在更新此模块的依赖项时调用的处理程序。他们还可以编写一个在此模块更新时调用的处理程序。

    在大多数情况下,并非必须在每个模块中编写 HMR 代码。如果模块没有 HMR 处理程序,则更新会冒泡。这意味着单个处理程序可以处理完整模块树的更新。如果此树中的单个模块被更新,则重新加载整个模块树(仅重新加载,不传输)。

    从 HMR 运行时 View (技术)

    为模块系统运行时发出附加代码以跟踪模块 parentschildren .

    在管理方面,运行时支持两种方法: checkapply .

    一个 check向更新 list 发出 HTTP 请求。当此请求失败时,没有可用的更新。否则,将更新块的列表与当前加载的块列表进行比较。对于每个加载的块,下载相应的更新块。所有模块更新都作为更新存储在运行时中。运行时切换到 ready状态,意味着更新已下载并准备好应用。

    对于处于就绪状态的每个新块请求,也会下载更新块。
    apply方法将所有更新的模块标记为无效。对于每个无效模块,模块中都需要有一个更新处理程序,或者每个父模块中都需要有更新处理程序。否则无效的冒泡并将所有 parent 也标记为无效。这个过程一直持续到不再出现“冒泡”为止。如果它冒泡到入口点,则该过程失败。

    现在所有无效模块都被处理(处理处理程序)并卸载。然后更新当前散列并调用所有“接受”处理程序。运行时切换回 idle状态,一切照常进行。

    generated update chunks

    我可以用它做什么?

    您可以在开发中使用它作为 LiveReload 的替代品。实际上 webpack-dev-server 支持热模式,在尝试重新加载整个页面之前尝试使用 HMR 进行更新。您只需要添加 webpack/hot/dev-server入口点并使用 --hot 调用开发服务器.

    您还可以在生产中将其用作更新机制。在这里,您需要编写自己的管理代码,将 HMR 与您的应用程序集成。

    一些加载器已经生成了可热更新的模块。例如 style-loader可以交换样式表。你不需要做任何特别的事情。

    Suppose I want to update my CSS (one stylesheet) and JS modules when I save them to disk, without reloading the page and without using plugins such as LiveReload. Is this something Hot Module Replacement can help me with?



    是的

    What kind of work do I need to do, and what does HMR already provide?



    这是一个小例子: https://webpack.js.org/guides/hot-module-replacement/

    模块只有在您“接受”它时才能更新。所以你需要 module.hot.accept parent 或 parent 的 parent 中的模块......例如Router 是一个好地方,或者一个 subview 。

    如果只想与 webpack-dev-server 一起使用,只需添加 webpack/hot/dev-server作为切入点。否则你需要一些调用 check 的 HMR 管理代码和 apply .

    意见:是什么让它如此酷?
  • 它是 LiveReload,但适用于每种模块类型。
  • 您可以在生产中使用它。
  • 更新尊重您的代码拆分,并且只下载应用程序使用部分的更新。
  • 您可以将其用于应用程序的一部分,并且不会影响其他模块
  • 如果 HMR 被禁用,编译器将删除所有 HMR 代码(将其包装在 if(module.hot) 中)。

  • 注意事项
  • 它是实验性的,没有经过很好的测试。
  • 期待一些错误。
  • 理论上可用于生产,但将其用于严肃的事情可能还为时过早。
  • 需要在编译之间跟踪模块 ID,因此您需要存储它们 ( records )。
  • 优化器在第一次编译后不能再优化模块 ID。对包大小有一点影响。
  • HMR 运行时代码增加了包的大小。
  • 对于生产用途,需要额外的测试来测试 HMR 处理程序。这可能非常困难。
  • 关于javascript - Webpack 中的热模块替换到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24581873/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com