webpack-编译原理

devtools/2025/2/5 3:57:06/

webpack__0">webpack 编译过程

文章目录

  • webpack 编译过程
    • 初始化
    • 编译
      • 创建 chunk
      • 构建所有依赖模块
      • 产生 chunk assets
      • 合并 chunk assets
    • 输出
    • 总过程

webpack 的作用是将源代码编译(构建、打包)成最终代码。

在这里插入图片描述

整个过程大致分为三个步骤

  1. 初始化
  2. 编译
  3. 输出

在这里插入图片描述

初始化

此阶段,webpack 会将 CLI 参数配置文件默认配置进行融合,形成一个最终的配置对象。

对配置的处理过程是依托一个第三方库 yargs 完成的。

此阶段相对比较简单,主要是为接下来的编译阶段做必要的准备。

目前,可以简单的理解为,初始化阶段主要用于产生一个最终的配置。

编译

创建 chunk

chunk 是 webpack 在内部构建过程中的一个概念,译为,它表示通过某个入口找到的所有依赖的统称。

根据入口模块(默认为./src/index.js)创建一个 chunk。

在这里插入图片描述

每个 chunk 都有至少两个属性:

  • name:默认为 main。
  • id:唯一编号,开发环境和 name 相同,生产环境是一个数字,从 0 开始。

构建所有依赖模块

在这里插入图片描述

AST在线测试工具:https://astexplorer.net/

简图

在这里插入图片描述

产生 chunk assets

在第二步完成后,chunk 中会产生一个模块列表,列表中包含了模块 id 模块转换后的代码

接下来,webpack 会根据配置为 chunk 生成一个资源列表,即 chunk assets,资源列表可以理解为是生成到最终文件的文件名和文件内容。

在这里插入图片描述

chunk hash 是根据所有 chunk assets 的内容生成的一个 hash 字符串
hash:一种算法,具体有很多分类,特点是将一个任意长度的字符串转换为一个固定长度的字符串,而且可以保证原始内容不变,产生的 hash 字符串就不变

简图

在这里插入图片描述

合并 chunk assets

将多个 chunk 的 assets 合并到一起,并产生一个总的 hash

在这里插入图片描述

输出

此步骤非常简单,webpack 将利用 node 中的 fs 模块(文件处理模块),根据编译产生的总的 assets,生成相应的文件。

在这里插入图片描述

总过程

在这里插入图片描述

在这里插入图片描述

涉及术语

  • module

    模块,分割的代码单元,webpack 中的模块可以是任何内容的文件,不仅限于 JS。

  • chunk

    webpack 内部构建模块的块,一个 chunk 中包含多个模块,这些模块是从入口模块通过依赖分析得来的。

  • bundle

    chunk 构建好模块后会生成 chunk 的资源清单,清单中的每一项就是一个 bundle,可以认为 bundle 就是最终生成的文件。

  • hash

    最终的资源清单所有内容联合生成的 hash 值。

  • chunkhash

    chunk 生成的资源清单内容联合生成的 hash 值。

  • chunkname

    chunk 的名称,如果没有配置则使用 main。

  • id

    通常指 chunk 的唯一编号,如果在开发环境下构建,和 chunkname 相同;如果是生产环境下构建,则使用一个从 0 开始的数字进行编号。
    nk 的名称,如果没有配置则使用 main。

  • id

    通常指 chunk 的唯一编号,如果在开发环境下构建,和 chunkname 相同;如果是生产环境下构建,则使用一个从 0 开始的数字进行编号。


http://www.ppmy.cn/devtools/156167.html

相关文章

宝塔安装完redis 如何访问

1,配置bind和密码 我前面在宝塔中安装完成redis,在我的电脑上访问。发现连接不上去。 2,手动杀死一次redis在重启 #执行一下命令 ps -ef | grep 6379 强制杀死进程 125117 是进程号 #杀死进程 kill -9 125117 3,重启redis 重启…

【Validator】自定义字段、结构体补充及自定义验证,go案例讲解ReportError和errors.As在其中的使用

自定义字段名称的显示 RegisterTagNameFunc,自定义字段名称的显示,以便于从字段标签(tag)中提取更有意义的名称。 代码示例:自定义字段名称 package mainimport ("fmt""reflect""strings&q…

在LINUX上安装英伟达CUDA Toolkit

下载安装包 wget https://developer.download.nvidia.com/compute/cuda/12.8.0/local_installers/cuda-repo-rhel8-12-8-local-12.8.0_570.86.10-1.x86_64.rpm 安装RPM包 sudo rpm -i cuda-repo-rhel8-12-8-local-12.8.0_570.86.10-1.x86_64.rpm sudo dnf clean all sudo dnf…

Git进阶之旅:Git 多人合作

项目克隆: git clone 仓库地址:把远程项目克隆到本地形成一个本地的仓库 克隆下来的仓库和远程仓库的名称一致 注意:git clone 远程仓库地址 远程仓库名:把远程仓库克隆下来,并自定义仓库名 多人协作: …

Flutter使用Flavor实现切换环境和多渠道打包

在Android开发中通常我们使用flavor进行多渠道打包,flutter开发中同样有这种方式,不过需要在原生中配置 具体方案其实flutter官网个了相关示例(https://docs.flutter.dev/deployment/flavors),我这里记录一下自己的操作 Android …

【2】阿里面试题整理

[1]. 说一下Java与C的区别。 Java和C是两种在软件开发领域应用非常广泛的语言,但它们的设计理念和应用场景有所不同。 Java是一种基于JVM的解释型语言,具有跨平台性,使用自动垃圾回收机制,这使得开发者可以更专注于业务逻辑&…

SRS代码目录

代码目录: src/目录下核心代码: core:核心功能模块,包括日志、配置、错误处理等;protocol:实现RTMP、HTTP-FLV、HLS等协议的模块;app:应用层的实现,包括流的发布、播放…

普罗米修斯监控服务搭建位置全解析:权衡与抉择

在数字化时代,监控系统对于企业的稳定运营和业务发展至关重要。普罗米修斯作为一款备受青睐的开源监控和告警工具,其搭建位置的决策绝非小事,它紧密关联着监控系统的性能、可靠性与安全性,如同为整座大厦奠定基石。接下来&#xf…