发布于 2023年4月26日
294 - 《Toy Webpack Runtime》
实现了一个简化版的 Webpack Runtime,以下是笔记和代码。
介绍下 Webpack Runtime。 构建工具通常都会需要搭配一套 Runtime 把构建产物跑起来,这个 Runtime 可以很简单,比如 toy-bundler、Rollup、ESBuild,也可以很复杂,比如 Webpack。之所以复杂,是因为,1)他牵连了很多功能,包括 Code Splitting、HMR、MF、CSS 加载和 HMR 等,2)他需要和编译时搭配使用,比如 webpack 的 publicPath 就来自 node 环境的配置项;3)Webpack 还在 Runtime 里引入的插件机制,通过插件挂载的方式支持 Code Splitting、HMR、MF 等,看起来特别绕,4)换个地方 resovle promise 的编写方式也让逻辑更绕,let l; let p = new Promise(resolve => l = resolve); await p; l(),5)为了让代码更小,有大量简写。
以下是部分简写对照表。
__webpack_require__.imodule execution interceptorhandle({ id: moduleId, module: module, factory: __webpack_modules__[moduleId], require: __webpack_require__ })- 注入 hmr 处理用
__webpack_require__.mmodules(require 前的 factory)__webpack_require__.ccache(require 后的)__webpack_require__.f- .j
- .jsonpHmr
- .remotes
__webpack_require__.e- 调每个
__webpack_require__.f子属性函数,通过__webpack_require__.f[key](chunkId, promises)补充 promises,然后 Promise.all 执行
- 调每个
__webpack_require__.a__webpack_require__.rdefine__esModuleon exports__webpack_require__.o是否有值__webpack_require__.l加载 url 为 script,并绑定 done 函数- url 要拼
__webpack_require__.p(publicPath) 和__webpack_require__.u(chunkId) - 加载之后等
webpackJsonpCallback
- url 要拼
__webpack_require__.u是啥?- 函数,返回 chunkId + .async.js
__webpack_require__.d(exports, definition)define getter functions for harmony exports__webpack_require__.n返回 getDefaultExport 方法__webpack_re