当前位置: 首页 > 网络应用技术

在 - 深入了解WebPack的HMR机制(详细说明)中

时间:2023-03-06 19:39:57 网络应用技术

  当我第一次研究时,当我接触时,开发被IT提供的热负载功能深深吸引。我很好奇如何更新应用程序以更新我们通过刷新方法修改的代码的应用程序。同时,我们可以维护应用程序的某些状态,这在我们的日常开发中非常有用。莱特,我知道Zhejiang功能提供的插头模块提供的能力。本文将带您探索它如何实现。

  为了我们不熟悉或根本没有联系,通过提出问题,我们自己解决这些问题可以帮助我们提高自己的能力。这是一个长大的好机会。

  一开始,我们提出的问题的粒径相对较厚,而且没关系。通过我们的步骤探索,我们将遇到一些细节的细节,并整理出此细节。深层理解。

  上图描述了一个完整的过程,让我们看看它的工作原理。

  让我们通过一个简单的示例来解释它。lem的显示其中一些细节,以最熟悉的每个人为例。

  让我们初始化一个基本项目,相关目录和核心配置如下:

  配置如下:

  配置如下:

  文档中的每个人都很好,也就是说,正常的开始入口,我不会在这里详细介绍。

  当我们修改它时,

  通过调用将包装的文件放入内存中。

  核心代码如下:

  配置此配置项目时,包装后的文件将写入相应的文件夹中。但是当没有配置时,存储的文件在哪里?在这里我们参考一个依赖。从这个名字看,我们可能可以猜测他在做什么。

  核心代码如下:

  如果目前还不是替换,以便将包装的文件存储在已构建的文件系统中,从而加快了读取的访问。

  添加插件,统计汇编和包装进度,然后通过与服务器通信将包装的每个状态推向客户端。这次,您需要知道包装状态,请在中间收听事件监狱,然后在包装后致电推送浏览器。

  核心代码如下:

  当我首先对此逻辑进行整理时,我有点好奇该部分的处理代码如何受到打击?

  核心代码如下:

  // webpack-dev-server/lib/server.js

  updateCompiler(this.com.compiler,this.options)

  // webpack-dev-server/lib/utils/updateCompiler.js

  Adderries(WebPackConfig,选项);选项;

  compilers.foreach(编译器)=> {

  // ...

  constialplugin = new webpack.provideplugin({{{{{

  __webpack_dev_server_client__:getsocketClientPath(options),

  });

  supplyplugin.apply(编译器);

  });处理消息将根据不同的方式处理消息。当您收到时间到达时的值时,将调用当前消息。如下所示:

  在此功能中,它主要是通过触发事件并将最新内容传递为参数。如果没有配置,则将在宏任务中执行页面刷新操作。

  核心代码如下:

  在最后一步中,我们发送了一个事件,以依赖于我们花费的事件。在消费的恢复功能中,该方法主要调用。

  该对象通过插件中的代码注入。

  核心代码如下:

  该方法将调用该方法中的两种方法。前者通过上一步中传递的启动请求服务器获得了文件更新列表,如图所示。后者根据文件列表启动相应的最新代码块,并继续后续代码UpdateLogic。

  获取更新文件列表的方法

  获取更新的新模块代码。

  :::提示我一直在这里有一个问题,我一段时间没有想法,我没有普遍的问题,也就是说,为什么我应该通过上述方式进行更新。从技术的角度来看,推开服务器,更新后的代码块,但是您为什么不这样做?阅读了其他说明后,模块解元(仅负责传输消息)以更新代码模块。这样,协议不是协议。还使用了该协议,可以很好地解除模块的功能。:::::

  在上面的请求中,我们看到它称为此方法。那些包装的人可以再次看到它。这主要称为。下一个呼叫将不会详细介绍。请查看核心方法。到该方法实现的大量代码,我们可以跟踪的状态更改已被整理到更新的逻辑。

  在第二个周期中,在过时的模块中找到模块,以及已使用的模块。这些模块通过这种方法本身传递。对于组件,该部分的代码在中间注入,核心密码如下:

  分析此模块时,将通过该方法添加以下代码。意识到不刷新页面以更新组件的核心逻辑由本库提供。

  为了支持此处更热门的新事物,其核心实现逻辑是,在组件的生命周期的钩子函数中,插入了保留组件上下文的对象的函数。然后将组件方法调用以重新租赁。

  作者:JayConsiscient