首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第9章 开发环境调优
9.1 Webpack开发效率插件
9.1.1 webpack-dashboard
9.1.2 webpack-merge
9.1.3 speed-measure-webpack-plugin
9.1.4 size-plugin
9.2 模块热替换
9.2.1 开启HMR
9.2.2 HMR原理
9.2.3 HMR API示例
第10章 Webpack打包机制
10.1 总览
10.2 准备工作
10.3 缓存加载
10.4 模块打包
10.4.1 Compiler
10.4.2 Compilation
10.4.3 Resolver
10.4.4 Module Factory
10.4.5 Parser
10.4.6 模板渲染
10.5 深入Webpack插件
10.5.1 Tapable
10.5.2 插件的协同模式
第11章 实战案例
11.1 React应用
11.1.1 基础配置
11.1.2 JavaScript处理
11.1.3 TypeScript处理
11.1.4 样式处理
11.1.5 静态资源
11.1.6 多页应用公共代码优化
11.1.7 长效缓存
11.2 Vue应用
11.2.1 手动搭建Vue项目
11.2.2 通过@vue/cli搭建项目
第12章 更多JavaScript打包工具
12.1 Rollup
12.1.1 配置
12.1.2 Rollup去除死代码
12.1.3 可选的输出格式
12.1.4 使用Rollup构建JavaScript库
12.2 Parcel
12.2.1 打包速度
12.2.2 零配置
12.3 esbuild
12.3.1 打包速度
当前位置:
首页>>
技术小册>>
Webpack实战:入门、进阶与调优(下)
小册名称:Webpack实战:入门、进阶与调优(下)
### 10.4.1 Compiler:Webpack 的核心引擎深入解析 在 Webpack 的广阔生态系统中,`Compiler` 是其最为核心且基础的概念之一,它作为整个构建流程的驱动引擎,负责协调资源的加载、转换、打包以及输出等各个环节。深入理解 `Compiler` 的工作原理,对于提升 Webpack 的使用效率、解决复杂构建问题以及进行高级配置调优至关重要。本章将深入剖析 `Compiler` 的内部机制,包括其生命周期、钩子系统、插件机制等关键内容。 #### 10.4.1.1 Compiler 概述 Webpack 的 `Compiler` 对象是整个构建过程的中心,它包含了 Webpack 环境所有的配置信息,并管理着从入口文件到输出文件的整个编译过程。每当 Webpack 启动时,都会创建一个 `Compiler` 实例,该实例随后会触发一系列的事件(通过其内置的钩子系统),这些事件允许开发者通过插件的形式介入到构建流程的各个环节中。 #### 10.4.1.2 Compiler 的生命周期 `Compiler` 的生命周期可以大致划分为几个关键阶段:初始化、编译、输出。每个阶段都伴随着一系列的事件(或称为钩子)的触发,这些钩子为插件提供了介入的时机。 - **初始化阶段**:在这一阶段,Webpack 读取配置文件,初始化 `Compiler` 实例,并加载所有配置的插件。此时,`Compiler` 还未开始实际的编译工作,但已经准备好了一切必要的资源。 - **编译阶段**:编译阶段是 `Compiler` 最为繁忙的时期,它负责解析入口文件、递归地构建依赖图、应用各种 loader 对模块进行转换、以及执行插件的编译时逻辑。此阶段涉及多个关键事件,如 `entry-option`(入口文件确定后)、`compile`(编译开始)、`make`(构建模块)、`emit`(生成资源到输出目录前)等。 - **输出阶段**:在编译完成后,`Compiler` 会将处理好的资源输出到指定的目录。此阶段主要触发 `emit` 钩子,允许插件在资源写入磁盘前进行最后的修改或添加额外的资源。 #### 10.4.1.3 Compiler 钩子系统 Webpack 的强大之处在于其灵活的插件系统,而这一切都离不开 `Compiler` 的钩子系统。钩子(Hooks)是 Webpack 提供的一种机制,允许开发者在 `Compiler` 生命周期的特定阶段插入自定义逻辑。Webpack 的钩子分为同步钩子和异步钩子两种,分别通过 `tap`、`tapAsync`、`tapPromise` 等方法注册。 - **同步钩子**:执行到该钩子时,Webpack 会同步地执行所有注册在该钩子上的函数,直到所有函数执行完毕才继续向下执行。 - **异步钩子**:与同步钩子不同,异步钩子允许注册的函数异步执行,这通常用于需要等待某些异步操作完成后再继续构建流程的场景。 Webpack 提供了丰富的钩子供开发者使用,包括但不限于 `compilation`(每次新的编译创建时触发)、`emit`(资源输出到输出目录前)、`done`(编译完成)等。通过合理利用这些钩子,开发者可以几乎完全控制 Webpack 的构建过程。 #### 10.4.1.4 Compiler 与 Compilation 的关系 在 Webpack 的构建过程中,除了 `Compiler` 外,还有一个重要的概念是 `Compilation`。`Compilation` 对象代表了当前的一次编译过程,它包含了当前编译的所有模块信息、依赖关系以及最终的输出资源等。每当 Webpack 开始一次新的编译时,都会创建一个新的 `Compilation` 实例,并关联到当前的 `Compiler` 实例上。 `Compiler` 和 `Compilation` 的关系可以理解为“工厂与产品”的关系:`Compiler` 是构建流程的工厂,负责整体的构建逻辑和流程控制;而 `Compilation` 则是工厂生产出的具体产品,代表了某次具体的编译过程和结果。 #### 10.4.1.5 插件开发基础 理解了 `Compiler` 和其钩子系统后,我们就可以开始尝试编写自己的 Webpack 插件了。Webpack 插件是一个具有 `apply` 方法的 JavaScript 对象,该方法会在插件被添加到 Webpack 实例时调用,并接收一个 `Compiler` 实例作为参数。在 `apply` 方法内部,开发者可以通过监听 `Compiler` 的钩子来插入自定义逻辑。 一个简单的插件示例可能如下所示: ```javascript class MyPlugin { apply(compiler) { compiler.hooks.emit.tapAsync('MyPlugin', (compilation, callback) => { // 在资源输出前执行自定义逻辑 // 例如,可以修改输出文件的内容或添加新的文件 console.log('资源即将输出...'); callback(); // 调用 callback 表示异步操作完成 }); } } module.exports = MyPlugin; ``` 在这个示例中,我们创建了一个名为 `MyPlugin` 的插件,它监听了 `emit` 钩子,在资源输出到输出目录前执行了一些自定义逻辑(这里只是简单地打印了一条日志)。 #### 10.4.1.6 总结 `Compiler` 作为 Webpack 的核心引擎,其内部机制复杂而精妙,通过生命周期、钩子系统和插件机制共同构成了 Webpack 强大的构建能力。深入理解 `Compiler` 的工作原理,不仅能够帮助我们更好地使用 Webpack,还能为我们开发自定义插件、解决复杂构建问题提供坚实的理论基础。希望本章的内容能够为你揭开 Webpack 神秘面纱的一角,让你在 Webpack 的世界里更加游刃有余。
上一篇:
10.4 模块打包
下一篇:
10.4.2 Compilation
该分类下的相关小册推荐:
全解webpack前端开发环境定制
Webpack零基础入门
webpack指南
Webpack实战:入门、进阶与调优(中)
Webpack实战:入门、进阶与调优(上)