前端工程化之:webpack1-6(编译过程)

一、webpack编译过程

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

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

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

1.初始化

初始化时我们运行的命令 webpack 为核心包, webpack-cli 提供了 webpack 命令,通过命令启动 webpack  webpack 命令就是在调用核心包里面的功能。

此阶段, webpack 会将 CLI 参数(--mode --config等)、配置文件(webpack.config.js)、默认配置进行融合,形成一个最终的配置对象。

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

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

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

2.编译 

(1)创建 chunk 

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

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

 main chunk  => 入口模块:  ./src/index.js 

 chunk 可以有多个,每个 chunk 都有至少两个属性:

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

(2)构建所有依赖模块 

构建过程入下图: 

 

  1. 模块文件:首先拿到模块文件 ./src/index.js ,根据路径检查这个模块是否已经加载过。
  2. 已记录则结束,未记录则继续:根据右侧模块记录表格中的路径找到模块检查是否记录。
  3. 读取文件内容(node环境可以读取文件):未加载将文件内容读取出来,通过语法分析转换为   AST 抽象语法树。
  4. AST抽象语法树:AST explorer,通过 AST 语法树准确地找到依赖关系,记录依赖,进行树形结构遍历,找到所有依赖.
  5. 保存到 dependencies 中:将所有依赖保存到 dependencies 数组中,记录完整相对路径即模块 id
  6. 替换依赖函数:将有依赖的地方转换为另一种代码格式,例: require("./a") ,转换为__webpack_require("./src/a.js") ,将 require 转换 __webpack__require ,将路径转换为绝对路径即模块 id
  7. 保存转换后的模块代码:将上图中的模块记录表格保存。模块 id 完整绝对路径,转换后的代码为示例中 index.js - 2 代码。

例: index.js - 1 

console.log("index");
require("./a");
require("./b");

 index.js - 2 

console.log("index");
__webpack_require("./src/a.js");
__webpack_require("./src/b.js");

 a.js 

require("./b");
console.log("a");
module.exports = "a";

 b.js 

console.log("b");
module.exports = "b";

转换后的 chunk 中模块记录:

模块id转换后代码
index.js console.log("index");
__webpack_require("./src/a.js");
__webpack_require("./src/b.js");
 a.js __webpack_require("./src/b.js");
console.log("a");
module.exports = "a";
 b.js console.log("b");
module.exports = "b";

示例编译过程: 

  1.  ./src/index.js 未加载。
  2. 内容(字符串): index.js - 1 代码。
  3. --> AST --> 树形结构遍历,找到所有依赖。
  4.  dependencies:["./src/a.js","./src/b.js"]
  5.  index.js - 1 中代码被转换为 index.js - 2
  6. 保存转换后的代码。
  7. 循环依赖,重新加载 ./src/a.js
  8. 重复 1-6 过程。
  9. 根据 a.js 文件中的依赖关系,重新加载 ./src/b.js
  10. 重复 1-6 过程,此时 a.js 文件的依赖关系已分析完毕, chunk 模块记录表格已经记录了所有模块信息。
  11.  index.js 模块按顺序应该加载 b.js 模块,但是由于 b.js 已经加载过了,为已记录状态。所以不需要重新加载 b.js 模块。
  12. 依赖模块构建结束。

(3)产生 chunk assets

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

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

 chunk 中的模块记录:

模块id转换后的代码
./src/index.jsxxxxxxxxxx
./src/a.jsxxxxxxxxxx

 chunk assets

文件名文件内容
./dist/main.jsxxxxxxxxxxxx
./dist/main.js.mapxxxxxxxxxxxx

chunk hash:xxxxxxxxxxxxxxxxxxxxxxx

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

 (4)合并 chunk assets

 将多个 chunk assets 合并到一起,形成一个总的资源列表,并产生一个总的 hash

 

 3.输出

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

 

二、总过程 

如果开启 watch ,每一次文件变化都会重新进行编译。 

涉及术语 

  1.  module :模块,分割的代码单元, webpack 中的模块可以是任何内容的文件,不仅限于 JS
  2.  chunk webpack 内部构建模块的块,一个 chunk 中包含多个模块,这些模块是从入口模块通过依赖分析得来的。
  3.  bundle chunk 构建好模块后会生成 chunk 的资源清单,清单中的每一项就是一个 bundle ,可以认为 bundle 就是最终生成的文件。
  4.  hash :最终的资源清单所有内容联合生成的 hash 值。
  5.  chunkhash chunk 生成的资源清单内容联合生成的 hash 值。
  6.  chunkname chunk 的名称,如果没有配置则使用 main
  7.  id :通常指 chunk 的唯一编号,如果在开发环境下构建,和 chunkname 相同;如果是生产环境下构建,则使用一个从 0 开始的数字进行编号。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/246085.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第八篇 交叉编译华为云Iot SDK到Orangepi3B

本篇主要内容: 一、交叉编译华为云Iot SDK依赖1.宿主机安装交叉编译工具链(1)选择下载交叉编译工具链(2)解压、添加环境变量、重启2.交叉编译依赖库(0) 准备工作(1) 交叉…

水文模型SWMM与LisFlood耦合(pdf文档、软件见资源)

总技术路线图 INP生成图解 文献:面向服务的Web-SWMM构建研究 regardingINP为ArcGIS Pro项目 1.SWMM模型数据准备与参数设置 1.子汇水区 文件位于:beforeGenerateINP/generateSub.py(一级划分) 问题: 水文分析阈值划…

【PyTorch】使用PyTorch创建卷积神经网络并在CIFAR-10数据集上进行分类

前言 在深度学习的世界中,图像分类任务是一个经典的问题,它涉及到识别给定图像中的对象类别。CIFAR-10数据集是一个常用的基准数据集,包含了10个类别的60000张32x32彩色图像。在本博客中,我们将探讨如何使用PyTorch框架创建一个简…

CSS3如何实现从右往左布局的按钮组(固定间距)

可以通过下方CSS实现,下面的CSS表示按钮从右往左布局,且间距为10px: .right-btn {position: relative;float: right;margin-right: 10px; }类似这种: 这种: 注意: 不能使用right:10px代替margin-right:10px&#x…

LINUX基础培训十八之常见服务vsftp介绍

前言、本章学习目标 了解vsftp服务用途掌握配置vsftp服务器掌握vsftp日常使用 一、什么是文件传输协议(VSFTP) vsftpd一红帽企业版linux的默认ftp服务器 不再由xinetd管理 xinetd是一个非独立服务有很多服务要依靠它实现” xinetd是一个daemon程序,所有结尾带d的…

Backtrader 文档学习-Bracket Orders

Backtrader 文档学习-Bracket Orders 1. 概述 组合订单类型是一个非常宽泛的订单类别,只要brokder支持的订单类型都可以, 包括(Market, Limit, Close, Stop, StopLimit, StopTrail, StopTrailLimit, OCO)。 该功能用于回测,交互broker Brac…

银行数据仓库体系实践(3)--数据架构

狭义的数据仓库数据架构用来特指数据分布,广义的数据仓库数据架构还包括数据模型、数据标准和数据治理。即包含相对静态部分如元数据、业务对象数据模型、主数据、共享数据,也包含相对动态部分如数据流转、ETL、整合、访问应用和数据全生命周期管控治理。…

TensorFlow2实战-系列教程2:神经网络分类任务

🧡💛💚TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、Mnist数据集 下载mnist数据集: %matplotlib inline from pathlib imp…

项目实战——Qt实现FFmpeg音视频转码器

文章目录 前言一、移植 FFmpeg 相关文件二、绘制 ui 界面三、实现简单的转码四、功能优化1、控件布局及美化2、缩放界面3、实现拖拽4、解析文件5、开启独立线程6、开启定时器7、最终运行效果 五、附录六、资源自取 前言 本文记录使用 Qt 实现 FFmepg 音视频转码器项目的开发过…

【干货】【常用电子元器件介绍】【电阻】(二)--敏感电阻器

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。   电子电路中除了采用普通电阻器外,还有一些敏感电阻器(如热敏电阻器、压敏电阻器、光敏电阻器等)也被广泛地应用。然而…

【华为 ICT HCIA eNSP 习题汇总】——题目集10

1、以下哪个动态路由协议不能应用在 IPv6 网络中? A、IS-IS B、RIPng C、BGP4 D、OSPFv3 考点:路由技术原理 解析:(A) IS-ISv6 是在 IPv6 环境下,IS-IS 协议进行了相应的扩展和改进,以适应 IPv6…

css中隐藏页面元素的方式(详细讲解)

这里写目录标题 一、前言二、实现方式display:nonevisibility:hiddenopacity:0设置height、width属性为0position:absoluteclip-path小结 三、区别参考文献 一、前言 在平常的样式排版中,我们经常遇到将某个模块隐藏的场景 通过css隐藏元素的方法有很多种&#xf…

vue项目中使用Element多个Form表单同时验证

一、项目需求 在项目中一个页面中需要实现多个Form表单,并在页面提交时需要对多个Form表单进行校验,多个表单都校验成功时才能提交。 二、实现效果 三、多个表单验证 注意项:多个form表单,每个表单上都设置单独的model和ref&am…

matlab对负数开立方根得到虚数的解决方案

问题描述:在matlab中,对负数开立方根,不出意外你将得到虚数。 例如 − 27 3 \sqrt[3]{-27} 3−27 ​,我们知道其实数解是-3,但在matlab中的计算结果如下: 问题原因:matlab中的立方根运算是在…

详细分析Java的树形工具类(含注释)

目录 前言1. 基本框架2. 实战应用 前言 对应的每个子孙属于该父亲,这其实是数据结构的基础知识,那怎么划分怎么归属呢 对应的基本知识推荐如下: 【数据结构】树和二叉树详细分析(全)【数据结构】B树和B树的笔记详细…

vue实现在线Excel表格功能

目录 1.安装x-data-spreadsheet xlsx 2.引入 3.使用 1.安装x-data-spreadsheet xlsx npm i x-data-spreadsheet xlsx2.引入 import zhCN from "x-data-spreadsheet/src/locale/zh-cn"; import Spreadsheet from "x-data-spreadsheet"; import * as X…

Scala基础知识

scala 1、scala简介 ​ scala是运行在JVM上的多范式编程语言,同时支持面向对象和面向函数式编程。 2、scala解释器 要启动scala解释器,只需要以下几步: 按住windows键 r输入scala即可 在scala命令提示窗口中执行:quit,即可退…

mybatis基础知识

title: mybatis的基础知识创建mybatis数据库&#xff0c;创建user表&#xff0c;在里面添加数据 创建空项目&#xff0c;创建maven模块 导入相关的依赖 在pom.xml文件中导入mysql&#xff0c;junit测试&#xff0c;mybatis依赖。 <!--导入mysql依赖--><dependency&g…

四步搞定国赛!快速入门大小模型融合的AI产品开发

前不久&#xff0c;2024中国大学生服务外包创新创业大赛正式启动&#xff01;作为中国高等教育学会“全国普通高校学科竞赛排行榜”竞赛&#xff0c;飞桨赛道已经吸引了超过200位选手报名参赛。 本文旨在助力“A01-基于文心大模型智能阅卷平台设计”赛道选手&#xff0c;更快地…

7.【SpringBoot3】项目部署、属性配置、多环境开发

1. SpringBoot 项目部署 项目完成后&#xff0c;需要部署到服务器上。 SpringBoot 项目需要经过编译打包生成一个 jar 包&#xff08;借助打包插件 spring-boot-maven-plugin&#xff09;&#xff0c;再将该 jar 包发送或拷贝到服务器上&#xff0c;然后就可以通过执行 java …