本篇内容和配置基于 webpack v5.52.1 讲解
模块化
打包
依赖生成
工程化
webpack 是一种模块打包工具,可以将各类型的资源,例如图片、CSS、JS 等,转译组合为 JS 格式的 bundle 文件。
图片来源 webpack 官网
webpack 构建的核心任务是完成内容转化和资源合并。主要包含以下 3 个阶段:
从 webpack 项目 webpack.js 文件 webpack 方法出发,可以看到初始化过程如下:
// lib/webpack.js 122 行 部分代码省略处理
const create = () => {
if (!webpackOptionsSchemaCheck(options)) { // 校验参数 getValidateSchema()(webpackOptionsSchema, options); } // 创建 compiler 对象 compiler = createCompiler(webpackOptions);};
// lib/webpack.js 57 行
const createCompiler = (rawOptions) => {
// 统一合并处理参数 const options = getNormalizedWebpackOptions(rawOptions); applyWebpackOptionsBaseDefaults(options); // 实例化 compiler const compiler = new Compiler(options.context); // 把 options 挂载到对象上 compiler.options = options; // NodeEnvironmentPlugin 是对 fs 模块的封装,用来处理文件输入输出等 new NodeEnvironmentPlugin({ infrastructureLogging: options.infrastructureLogging, }).apply(compiler); // 注册用户配置插件 if (Array.isArray(options.plugins)) { for (const plugin of options.plugins) { if (typeof plugin === "function") { plugin.call(compiler, compiler); } else { plugin.apply(compiler); } } } applyWebpackOptionsDefaults(options); // 触发 environment 和 afterEnvironment 上注册的事件 compiler.hooks.environment.call(); compiler.hooks.afterEnvironment.call(); // 注册 webpack 内置插件 new WebpackOptionsApply().process(options, compiler); compiler.hooks.initialize.call(); return compiler;};
Copy
在 webpack 函数执行完之后,就到主要的构建阶段,首先执行 compiler.run(),然后触发一系列钩子函数,执行 compiler.compile()。
// 构建过程涉及流程比较复杂,代码会做省略
// lib/webpack.js 1284行 // 开启编译流程 compiler.run((err, stats) => { compiler.close(err2 => { callback(err || err2, stats); }); });
// lib/compiler.js 1081行 // 开启编译流程 compile(callback) { const params = this.newCompilationParams(); // 创建 Compilation 对象 const Compilation = this.newCompilation(params); }
// lib/Compilation.js 1865行 // 确认入口文件 addEntry() { this._addEntryItem(); }
// lib/Compilation.js 1834行 // 开始创建模块流程,创建模块实例 addModuleTree() { this.handleModuleCreation() }
// lib/Compilation.js 1548行 // 开始创建模块流程,创建模块实例 handleModuleCreation() { this.factorizeModule() }
// lib/Compilation.js 1712行 // 添加到创建模块队列,执行创建模块 factorizeModule(options, callback) { this.factorizeQueue.add(options, callback); }
// lib/Compilation.js 1834行 // 保存需要构建模块 _addModule(module, callback) { this.modules.add(module); }
// lib/Compilation.js 1284行 // 添加模块进模块编译队列,开始编译 buildModule(module, callback) { this.buildQueue.add(module, callback); }
Copy
构建阶段围绕 module 展开,生成阶段则围绕 chunks 展开。经过构建阶段之后,webpack 得到足够的模块内容与模块关系信息,之后通过 Compilation.seal 函数生成最终资源。
执行 Compilation.seal 进行产物的封装。
回到 Compiler 的流程中,执行 onCompiled 回调。
本站文章用于学习交流
新浪微博 | QQ群1:161644793qq | QQ群2:98711210
网站地图 | 网站统计
Copyright 2011 - 2021 paocode.com All Rights Reversed. 浙ICP备19041980号
瞎猫内容中心