webpack 是什么
webpack 是一个打包工具,将浏览器无法识别的 Commonjs 等模块化语法( module.exports、require 等)转化成能在浏览器运行。
实现的方式:
实现了一个 __webpack_require__
方法,该方法根据 modulesId
(模块路径及名称组合成),从 modules
对象 ( key 是 moduleId ,value 是 源文件内容经过转化成的函数) 中取模块并执行,并将结果存在installModules中。
通过递归从modules中获取执行结果,实现require的效果。
打包的过程
根据 webpack.config.js
找到 entry
入口文件
实现 compiler 类,该类做了以下事情:
- 从入口开始解析、修改文件,得到 modules(依赖关系)
- 生成目标 js 文件。
解析文件得到 modules
- 解析当前文件,转化当前文件得到转化后的源码(webpack中为转化了模块引入方法的可执行函数),并得到当前文件的依赖项
dependencies
- 保存转化后的源码和由文件名及文件路径合成的文件ID
- 根据
dependencies
递归执行过程 1
过程 1 中,用到了babel:
- 使用
babylon
解析源码得到 AST - 通过
@babel/traverse
遍历并访问 AST ,修改 AST 对象(require
->__webpack_require__
),require 路径改成相对于根目录的路径moduleName
, 保存引入的modulename
到dependencies
- 使用
@babel/generator
将修改后的 AST 对象逆生成源码 - 返回源码和
dependencies