首页 > 其他分享 >webpack 构建流程

webpack 构建流程

时间:2024-08-18 22:08:16浏览次数:9  
标签:文件 插件 流程 入口 编译 webpack 构建 模块

webpack 可以分为 4 个阶段:

  • 初始化阶段 - webpack
    • 合并配置项
    • 创建Compiler
    • 注册插件
  • 编译阶段 - build
    • 读取入口文件
    • 从入口文件开始编译
    • 调用 loader 对源代码进行转换
    • 借助 babel 解析为 AST 收集依赖模块
    • 递归对依赖模块进行编译操作
  • 生成阶段 - seal
    • 创建 chunk 对象
    • 生成 assets 对象
  • 输出阶段 - emit

初始化阶段

读取和合并配置信息

首先会执行 webpack 函数读取和合并配置信息,配置信息来源主要有两种方式:

  • 第一种是通过 webpack.config.js 做配置,该文件中主要包括:入口文件、输出位置、loader 和 plugin
  • 第二种是通过命令行的形式做配置,比如 --mode=production。命令行的权要高于配置文件。

创建 complier 对象

然后通过 Compiler 构造函数,传入合并的配置项,获得 compiler 实例。

Compiler 构造函数中有 run 方法和 emitAssets 方法。当需要执行编译时就会调用 run 方法。

注册插件

接着注册插件。插件的目的是在合适的时机干预构建过程。

插件可以有两种形式:

  • 可以是函数
  • 也可以是对象,但是对象需要提供一个 apply 方法,并接收 compiler 实例作为参数

注册插件的过程就是遍历配置文件中的 plugins 数组,并依次执行该插件。当插件为函数时:plugin.call(compiler, compiler)。如果插件是一个对象,需要提供 apply 方法:plugin.apply(compiler)。

初始化的阶段完成。

编译阶段

编译工作的起点是调用 compiler.run 方法。run 的主要工作:

  • 发起构建通知,触发 hooks.run 通知相关插件;
  • 创建 compilation 编译对象;
  • 读取 entry 入口文件;
  • 编译 entry 入口文件;

创建 compilation 对象

执行 const compilation = new Compilation(this);创建 compilation 对象。

模块的 build (代码构建)和 seal (代码生成)都是 compilation 对象实现的。

然后执行 compilation.buildI();开始编译模块。

读取 entry 入口文件

构建模块首先从 entry 入口模块开始,此时首要工作是根据配置文件拿到入口模块信息。

编译 entry 入口文件

拿到入口文件后,依次对每个入口进行构建。

构建阶段执行如下操作:

  • 通过 fs 模块读取入口文件的内容;
  • 调用 loader 来转换文件内容;
  • 为模块创建 module 对象,通过 AST解析源代码收集依赖,并改写依赖模块的路径;
  • 如果存在依赖模块,递归进行上述三步操作;

loader 本身是一个 JS 函数,接收模块文件的源代码作为参数,经过加工改造后返回新的代码。

执行 webpack 模块编译逻辑:首先读取文件原始代码,然后调用 loader 进行处理,最后调用 webpack 进行模块编译 为模块创建 module 对象。

  1. 创建 module 对象;
  2. 对 module code 解析为 AST 语法树;
  3. 遍历 AST 去识别 require 模块语法,将模块收集在 module.dependencies 之中,并改写 require 语法为 webpack_require
  4. 将修改后的 AST 转换为源代码;
  5. 若存在依赖模块,深度递归构建依赖模块。

生成阶段

在「编译阶段」会将一个个文件构建成 module 存储在 this.modules 之中。

在「生成阶段」,会根据 entry 创建对应 chunk 并从 this.modules 中查找被 entry 所依赖的 module 集合。

根据 entry 创建 chunk。根据入口文件和依赖模块组装chunks:
首先遍历 this.entries 集合,createChunk 依次执行 createChunk 方法。在 createChunk 方法中创建 chunk 并将 chunk 添加到 this.chunks 集合中。

最后,结合 runtime webpack 模块机制运行代码,经过拼接生成最终的 assets 产物。

根据 chunk 创建 assets。为每一个 chunk 文件代码拼接 runtime 运行时语法。this.assets 的数据结构是一个对象,chunk文件名为 key 和 文件内容为 value。

输出阶段

调用 this.emitAssets 方法开始输出阶段。
首先会调用 Plugin emit 钩子:this.hooks.emit.call()。然后创建输入目录。再将 assets 中的内容写入文件系统中:遍历 this.assets 对象,调用fs.writeFileSync(filePath, assets[filePath])。结束之后触发钩子:this.hooks.done.call()。

结束。

标签:文件,插件,流程,入口,编译,webpack,构建,模块
From: https://www.cnblogs.com/rocenjs/p/18366174

相关文章

  • ansible 流程控制
    目录ansibleif流程控制变量控制结构过滤器注释Jinja2api示例test语句ansiblewhen流程控制简单示例多条件示例ansibleif流程控制大部分的Ansible任务,需要对用户的输入内容或任务的运行结果进行判断,这中间体现了流程控制的作用像ansible的模板文件,以.j2结尾的都是Jinja2......
  • 【数据结构与算法】如何构建最小堆
    最小堆的定义最小堆,作为一种独特且重要的数据结构,它是一种特殊的二叉树。在这种二叉树中,有一个关键的规则:每一个父节点所存储的值,都必然小于或者等于其对应的子节点的值。这一规则确保了根节点总是承载着整个堆中的最小数值。例如,下面这样一个简单的结构就是最小堆:1......
  • Android usb广播 ACTION_USB_DEVICE_ATTACHED流程源码分析
    整体流程图大概意思就是UsbHostManager启动监控线程,monitorUsbHostBus会调用usb_host_run函数(使用inotify来监听USB设备的插拔)不停的读取bus总线,读取到以后,当1、设备插入:发送广播ACTION_USB_DEVICE_ATTACHED2、设备拔出:发送广播ACTION_USB_DEVICE_DETACHED本篇只分析插入......
  • RabbitMQ集群 - 仲裁队列、Raft协议(最详细的选举流程)
    文章目录仲裁队列概述Raft协议概述基本概念选举流程(重点)消息复制仲裁队列的使用MQ管理平台SpringAMQP仲裁队列概述1)RabbitMQ普通队列在一个节点宕机之后,其他节点无法读写宕机节点的队列,为了解决这个问题,引入了仲裁队列.2)仲裁队列通过Raft协议,实现了不同......
  • AvaloniaChat—从源码构建指南
    AvaloniaChat介绍一个使用大型语言模型进行翻译的简单应用。我自己的主要使用场景在看英文文献的过程中,比较喜欢对照着翻译看,因此希望一边是英文一边是中文,虽然某些软件已经自带了翻译功能,但还是喜欢大语言模型的翻译,但每次都要将英文复制粘贴过去还要自己手动添加prompt,还无法......
  • 2024 NVIDIA Summer Camp Day1:构建RAG多模态AI Agent
    下载材料和课件等课程相关资料下载链接:https://pan.baidu.com/s/15Y-gmsfeYCgKF-M3TJZVgg?pwd=fafe提取码:fafe 1.课件链接:https://pan.baidu.com/s/15JTy9CqnesXSlPiwwrUmjA?pwd=1111 提取码:1111 2.phi3量化大模型链接:https://pan.baidu.com/s/10HqxpkJmSyg-Bb......
  • 【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】019 - RK3568 Uboot 完整流程梳理
    【OpenHarmony4.1之U-Boot2024.07源码深度解析】019-RK3568Uboot完整流程梳理一、系统环境初始化:_start入口地址,初始化CPU环境二、系统环境初始化:_main入口,初始化堆栈,初始化gd全局环境变量,初始化CRuntime运行环境,开始执行board_init_f函数三、board_......
  • Ruby模板引擎:构建动态视图的艺术
    标题:Ruby模板引擎:构建动态视图的艺术在RubyonRails的世界里,模板引擎是构建动态网页的基石。它们允许开发者将服务器端的逻辑嵌入到HTML中,实现数据的动态展示。本文将深入探讨Ruby中几种常用的模板引擎,包括ERB、Haml和Slim,分析它们的特色、优缺点,并指导如何在项目中做出选......
  • Android MTP流程
    概要本文的目的是介绍Android系统中MTP的一些相关知识。主要的内容包括:第1部分MTP简介      对Mtp协议进行简单的介绍。第2部分MTP框架      介绍Android系统下MTP的框架。第3部分MTP启动流程      详细分析MTP服务的启动流程,包括Java层,......
  • brpc linux 下编译构建
    brpc在linux下编译构建,比在mac下还要更复杂些,mac下可以走官方说明编译成功,过程中也需要进行一些配置调整。在linux通过bazel最终实现了brpc编译通过。   相关版本centos版本7,bazel版本2.0.0    brpc版本1.0,gflags、protobuf、leveldb......