前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >webpack 最简静态资源打包及运行时分析

webpack 最简静态资源打包及运行时分析

作者头像
山月
发布2022-11-02 16:44:15
9600
发布2022-11-02 16:44:15
举报
文章被收录于专栏:服务器运维笔记

使用 webpack 对最简单的静态资源打包,观察其配置与运行时代码。

我们使用 webpack 打包两个文件,index.jssum.js,并通过脚本文件 build.js 进行打包。

源码见 node-examples:webpack/cjs1

以下是 index.js 文件内容:

代码语言:javascript
复制
const sum = require('./sum')

console.log(sum(3, 8))

以下是 sum.js 文件内容:

代码语言:javascript
复制
module.exports = (...args) => args.reduce((x, y) => x + y, 0)

同时编写脚本文件 build.js 用以打包。

代码语言:javascript
复制
webpack({
  entry: './index.js',
  mode: 'none',
  output: {
    iife: false,
    pathinfo: 'verbose'
  }
})

1. webpack 运行时代码

在前端,经常会听到一个词:打包器,而 webpack 是其中影响力最大的打包器。

如以上示例,index.jssum.js 两个文件将被打包成 dist/main.js 一个文件。

dist/main.js 的骨架代码包含了一些 webpack 如何将多个模块集合在一起的代码,被称为运行时代码。

main.js 文件内容见 main.js2,总共 55 行。

为了更好地理解运行时代码,可在 vscode/chrome 中对其文件进行调试,可参考在 VS Code 中如何调试 Node.js3。

代码语言:javascript
复制
/******/ var __webpack_modules__ = ([
/* 0 */,
/* 1 */
/*!****************!*\
  !*** ./sum.js ***!
  \****************/
/*! unknown exports (runtime-defined) */
/*! runtime requirements: module */
/*! CommonJS bailout: module.exports is used directly at 1:0-14 */
/***/ ((module) => {

module.exports = (...args) => args.reduce((x, y) => x + y, 0)

/***/ })
/******/ ]);
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/ 
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/  // Check if module is in cache
/******/  var cachedModule = __webpack_module_cache__[moduleId];
/******/  if (cachedModule !== undefined) {
/******/   return cachedModule.exports;
/******/  }
/******/  // Create a new module (and put it into the cache)
/******/  var module = __webpack_module_cache__[moduleId] = {
/******/   // no module.id needed
/******/   // no module.loaded needed
/******/   exports: {}
/******/  };
/******/ 
/******/  // Execute the module function
/******/  __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 
/******/  // Return the exports of the module
/******/  return module.exports;
/******/ }
/******/ 
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
(() => {
/*!******************!*\
  !*** ./index.js ***!
  \******************/
/*! unknown exports (runtime-defined) */
/*! runtime requirements: __webpack_require__ */
const sum = __webpack_require__(/*! ./sum */ 1)

sum(3, 8)

})();

2. 运行时代码分析

webpack 的 runtime,也就是 webpack 最后生成的代码,做了以下三件事:

  1. __webpack_modules__: 维护一个所有模块的数组。将入口模块解析为 AST,根据 AST 深度优先搜索所有的模块,并构建出这个模块数组。每个模块都由一个包裹函数 (module, module.exports, __webpack_require__) 对模块进行包裹构成。
  2. __webpack_require__(moduleId): 手动实现加载一个模块。对已加载过的模块进行缓存,对未加载过的模块,执行 id 定位到 __webpack_modules__ 中的包裹函数,执行并返回 module.exports,并缓存。
  3. __webpack_require__(0): 运行第一个模块,即运行入口模块。

Q:你了解 Node.js 中的 module wrapper 吗?

另外,当涉及到多个 chunk 的打包方式中,比如 code spliting,webpack 中会有 jsonp 加载 chunk 的运行时代码。

webpack runtime 做进一步精简,代码如下。

代码语言:javascript
复制
const __webpack_modules__ = [() => {}]
const __webpack_require__ = id => {
  const module = { exports: {} }
  const m = __webpack_modules__[id](module, __webpack_require__)
  return module.exports
}

__webpack_require__(0)

3. 作业

  1. webpack 运行时代码进行调试与理解
  2. webpack 的模块加载器是如何实现的
  3. webpack 的运行时代码做了那些事情
  4. 如何根据入口文件搜索出所有需要打包的模块
  5. 如何模拟实现运行时代码的生成

参考资料

[1]

node-examples:webpack/cjs:https://github.com/shfshanyue/node-examples/tree/master/engineering/webpack/cjs

[2]

main.js:https://github.com/shfshanyue/node-examples/blob/master/engineering/webpack/cjs/example/main.js

[3]

在 VS Code 中如何调试 Node.js:https://shanyue.tech/node/vscode-debug.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈成长之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. webpack 运行时代码
  • 2. 运行时代码分析
  • 3. 作业
  • 参考资料
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,助力维护团队卓越代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档