⚡ 30 秒速记

  • 核心判断:构建工具从入口解析依赖图,经转换和优化生成可在目标运行时加载的模块与资源
  • 原理主线:围绕 「核心机制」、「执行链路」、「边界与实践」 建立输入、状态变化与输出之间的因果关系
  • 文章范围:讲解如何手写一个简易版webpack打包工具,帮助读者深入理解webpack打包原理和实现流程。
  • 边界与代价:静态分析受模块语法、动态依赖和副作用声明限制;拆包过细也会增加请求和运行时成本
  • 工程落地:优化前先测构建阶段、产物组成和缓存命中,再针对解析、转换、压缩或运行时逐层处理

一个小型打包工具的本质,是从入口收集完整依赖图,再生成一套能在浏览器中执行这些模块的运行时代码。 读取 JS 后,可用 AST 找出 import,递归处理依赖,并借助 Babel 把代码转换为 CommonJS。由于浏览器不能直接运行 CommonJS,产物还要提供模块表和自定义 require,用 module.exports 串起导入与导出。遇到 CSS 时,可以把内容转换成创建 style 标签的模块代码。

这篇文章不要按 API 清单来背。先用上面的 Mind Map 建立全局结构,再通过交互 DEMO 观察正常路径和边界路径如何改变状态;阅读正文时重点核对每一步的输入、负责执行的参与者、产生的中间状态以及最终可观察结果。遇到版本敏感结论,要把“历史实现”“当前行为”和“工程兼容策略”分开说明;遇到性能或架构取舍,则用实际指标、失败现象和验证手段支撑判断。

版本校准: 旧文中的 webpack 4JSONP 更新清单或 react-hot-loader 代码用于解释历史链路,不应直接复制到新项目。当前 webpack-dev-server 4+ 默认启用 HMR,严格 ESM 可使用 import.meta.webpackHot;生产环境不得携带 HMR runtime。以 webpack HMR 官方指南 和项目锁定版本为准。

该工具可以实现以下两个功能

  • ES6 转换为 ES5
  • 支持在 JS 文件中 import CSS 文件

通过这个工具的实现,大家可以理解到打包工具的原理到底是什么

实现

因为涉及到 ES6ES5,所以我们首先需要安装一些 Babel 相关的工具

yarn add babylon babel-traverse babel-core babel-preset-env  

接下来我们将这些工具引入文件中

const fs = require('fs')
const path = require('path')
const babylon = require('babylon')
const traverse = require('babel-traverse').default
const { transformFromAst } = require('babel-core')
webapp
公众号
开发者导航
切换夜间模式
点击侧边栏上一篇
点击侧边栏下一篇
折叠侧边栏
收起全部