网上看过很多关于 webpack HMR 的介绍,对整个流程已经有了一个大致的了解,但是有几个地方一直没有搞清楚,比如下面这个代码:
1 | // const.js |
第一个问题是,module
(或者 import.meta
)是个啥东西,JS 中好像没有 module
或 import.meta
这个对象呀。
第二个问题是,accept
回调函数中的 name
是怎么更新为新的值的,看代码他引用的还是文件顶部的那个 name
呀。
为了搞清楚这个问题,我们还是来调试一下吧。
我们先在回调函数中打个断点,启动 webpack dev server,然后修改 const.js
中的 name
,则浏览器会停在断点处:
这样还是看不出什么,我们需要看一下原始的代码:
我们在 app.***.js
中搜索 index.js":
,找到这个模块的代码拷贝出来看看:
1 | ;(module, __webpack_exports__, __webpack_require__) => { |
这样,问题的答案就很显然了。
第一个问题:module
是个啥东西?
答:是 webpack 运行时插入的一个对象,用来表示一个模块。webpack 在打包的时候,会将每个模块的代码都会被放到一个函数中,函数参数是 module, exports, require
,在加载这个模块的时候会传入这几个参数,然后执行该函数。这个跟 Node.js 中的模块机制是类似的。
第二个问题:accept
回调函数中的 name
是怎么更新为新的值的?
答:从打包后的结果来看,主要原因在于 webpack 在回调函数中添加了重新引入 const.js
模块的代码,从而使得导出的对象得到了更新。