Webpack基本概念及核心流程

一文带你了解webpack 那些你必须知道的webpack知识点 阅读详情

什么是Webpack

Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 Webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。

在下图中可以看出,Webpack 将左侧错综复杂的各自不同类型文件的模板依赖关系,包括 .js、.hbs、.cjs、.sass、.jpg、.png 等类型文件,打包成 .js、.css、.jpg、.png 4 种类型的静态资源。

简单来说,Webpack 就是一个静态资源打包工具,负责将项目中依赖的各个模块,打包成一个或多个文件。

在这里插入图片描述

它的主要功能包括:

1)模块打包

将项目中的所有模块(JavaScript、CSS、图片等)当作一个整体,通过依赖关系将它们打包成一个或多个静态资源文件

2)依赖管理

Webpack 可以分析模块之间的依赖关系,根据配置的入口文件找出所有依赖的模块,并将其整合到打包结果中

3)文件转换

Webpack 本身只能处理 JavaScript 模块,但通过加载器(Loader)的使用,可以将其他类型的文件(如CSS、LESS、图片等)转换为有效的模块,使其能够被打包到最终的结果中

4)代码拆分

Webpack 支持将代码拆分成多个模块,按需加载,实现按需加载和提升应用性能

5)插件系统

Webpack 提供了丰富的插件系统,可以通过插件实现各种功能的扩展,例如压缩代码、自动生成 HTML 文件等

基本概念

dependency graph(依赖图)

依赖图指的就是各个模块之间的依赖关系,例如模块 A 导入了模块 B,则在依赖图中,模块 A 会指向模块 B,如上文引入过的图:

在这里插入图片描述

构建依赖图的主要步骤如下:

1)解析入口文件

从配置文件中指定的入口文件(如index.js)开始解析,入口文件是打包的起点

2)查找依赖

Webpack 会解析入口文件中的代码,查找所有通过import、require或其他方式引入的模块,例如以下代码,Webpack 会找到vue和./styles.css这两个依赖

import Vue from 'vue';
import './styles.css';

3)递归解析

对于每个找到的依赖,Webpack 会继续递归解析其内部的依赖。例如./styles.css文件中可能又引入了其他 CSS 文件或图片资源,Webpack 会继续解析这些资源

4)构建图结构

在解析过程中,Webpack 会将每个文件作为图中的一个节点,并根据依赖关系建立边,最终形成一个完整的依赖图

entry(入口)

入口是指依赖关系图的开始,从入口开始寻找依赖,打包构建。Webpack 允许一个或多个入口配置,配置示例如下:

module.exports = {
  entry: 'index.js',
};

在这里插入图片描述

output(输出)

输出则是用于配置 Webpack 构建打包的出口,如打包的位置、文件名等,配置示例如下:

module.exports = {
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'my-first-webpack.bundle.js',
  },
};

在这里插入图片描述

loader(加载器)

Webpack 自带 JavaScript 和 JSON 文件的打包构建能力,无需格外配置。而其他类型的文件,如 CSS、TypeScript,则需要安装 loader 来进行处理,它让 Webpack 能够去处理其他类型的文件,并将它们转换为有效模块。配置示例如下:

module.exports = {
  module: {
    rules: [{ test: /.txt$/, use: 'raw-loader' }],
  },
};

在这里插入图片描述

plugin(插件)

插件则是用于扩展 Webpack 的能力,常见的插件有:

mode(模式)

Webpack5 提供了模式选择,包括开发模式、生产模式、空模式,并对不同模式做了对应的内置优化,可通过配置模式让项目性能更优,配置示例如下:

module.exports = {
  mode: 'development',
};

resolve(解析)

resolve 用于控制模块的解析规则,通过配置 resolve,Webpack 可以更高效地解析模块路径,找到正确的文件,并处理不同类型的模块。常见的配置项如下:

  • alias:为模块路径设置别名,简化模块引入
  • extensions:用于指定在解析模块时自动尝试的文件扩展名,在引入模块时可不带后缀
  • modules:指定 Webpack 在解析模块时应该查找的目录,默认情况下会查找 node_modules 目录
  • symlinks:控制是否解析符号链接,禁用可提升编译速度

配置示例如下:

module.exports = {
    resolve: {
        extensions: ['.js', '.jsx', '.ts', '.tsx', '.json', '.d.ts'],
        alias: {
            '@': path.resolve(__dirname, 'src'),
            'components': path.resolve(__dirname, 'src/components')
        }
        modules: [path.resolve(__dirname, 'src'), 'node_modules'], // 先查找 src 目录,再查找 node_modules
        symlinks: false,
      }
}

optimization(优化)

optimization 用于自定义 Webpack 的内置优化配置,一般用于生产模式提升性能,常用配置项如下:

  • minimize:是否需要压缩 bundle
  • minimizer:配置压缩工具,如 TerserPlugin、OptimizeCSSAssetsPlugin
  • splitChunks:拆分 bundle
  • runtimeChunk:是否需要将所有生成 chunk 之间共享的运行时文件拆分出来

配置示例如下:

module.exports = {
  optimization: {
    minimizer: [
      // 在 webpack@5 中,你可以使用 `...` 语法来扩展现有的 minimizer(即 `terser-webpack-plugin`),将下一行取消注释
      // `...`,
      new CssMinimizerPlugin(),
    ],
    splitChunks: {
      // include all types of chunks
      chunks: 'all',
      // 重复打包问题
      cacheGroups:{
        vendors:{ //node_modules里的代码
          test: /[\/]node_modules[\/]/,
          chunks: "all",
          name: 'vendors', //chunks name
          priority: 10, //优先级
          enforce: true 
        }
      }
    },
  },
}

核心流程

Webpack 核心功能:将各种类型的资源,包括图片、css、js 等,转译、组合、拼接、生成 JS 格式的 bundler 文件,这个过程核心完成了内容转换 + 资源合并两种功能,实现上包含三个阶段:初始化阶段、构建阶段、生成阶段,单次构建过程自上而下按顺序执行。

初始化阶段

1)初始化参数:从配置文件、 配置对象、Shell 参数中读取,与默认配置结合得出最终的参数

2)创建编译器对象:用上一步得到的参数创建 Compiler 对象

3)初始化编译环境:包括注入内置插件、注册各种模块工厂、初始化 RuleSet 集合、加载配置的插件等

4)开始编译:执行compiler对象的run方法

5)确定入口:根据配置中的entry找出所有的入口文件,调用compilition.addEntry将入口文件转换为 dependence 对象

构建阶段

构建阶段从entry开始递归解析资源与资源的依赖,在compilation对象内逐步构建出module集合以及module之间的依赖关系,核心流程:

在这里插入图片描述

从上图看出,构建阶段从入口文件开始:

  • 调用handleModuleCreate ,根据文件类型构建module子类

  • 调用 loader-runner 仓库的runLoaders转译module内容,通常是从各类资源类型转译为 JS 文本

  • 调用 acorn 将 JS 文本解析为 AST

  • 遍历 AST,触发各种钩子

    • 监听exportImportSpecifier钩子,解读 JS 文本对应的资源依赖
    • 调用module对象的addDependency将依赖对象加入到 module 依赖列表中
  • AST 遍历完毕后,调用module.handleParseResult处理模块依赖

  • 对于module新增的依赖,调用handleModuleCreate,控制流回到第一步

  • 所有依赖都解析完毕后,构建阶段结束

这个过程中数据流:module => ast => dependences => module ,先转 AST 再从 AST 找依赖,这就要求loaders处理完的最后结果必须是可以被 acorn 处理的标准 JavaScript 语法。比如说对于图片,需要从图像二进制转换成 base64 格式或 url 格式。

compilation按这个流程递归处理,逐步解析出每个模块的内容以及module依赖关系,后续就可以根据这些内容打包输出。

生成阶段

基础流程

构建阶段围绕module展开,生成阶段则围绕chunks展开。经过构建阶段之后,Webpack 得到足够的模块内容与模块关系信息,接下来开始生成最终资源了。代码层面就是开始执行compilation.seal函数:

// 取自 webpack/lib/compiler.js 
compile(callback) {
    const params = this.newCompilationParams();
    this.hooks.beforeCompile.callAsync(params, err => {
      // ...
      const compilation = this.newCompilation(params);
      this.hooks.make.callAsync(compilation, err => {
        // ...
        this.hooks.finishMake.callAsync(compilation, err => {
          // ...
          process.nextTick(() => {
            compilation.finish(err => {
              **compilation.seal**(err => {...});
            });
          });
        });
      });
    });
  }

seal函数主要完成从 module 到 chunks 的转化,核心流程:

在这里插入图片描述

简单梳理一下:

  • 构建本次编译的ChunkGraph对象
  • 遍历compilation.modules集合,将 module 按 entry/动态引入 的规则分配给不同的 Chunk 对象
  • compilation.modules集合遍历完毕后,得到完整的chunks集合对象,调用createXxxAssets方法
  • createXxxAssets遍历module/chunk ,调用compilation.emitAssets方法将assets信息记录到compilation.assets对象中
  • 触发seal回调,控制流回到compiler对象

这一步的关键逻辑是将module按规则组织成chunks ,Webpack 内置的 chunk 封装规则比较简单:

  • entry 及 entry 触达到的模块,组合成一个chunk
  • 使用动态引入语句引入的模块,各自组合成一个chunk

chunk是输出的基本单位,默认情况下这些chunks与最终输出的资源一一对应,那按上面的规则大致上可以推导出一个entry会对应打包出一个资源,而通过动态引入语句引入的模块,也对应会打包出相应的资源

SplitChunksPlugin的作用

上面提到 Webpack 主流程里面是按entry / 动态引入两种情况组织chunks的,这必然会引发一些不必要的重复打包,而SplitChunksPlugin能将多个模块中重复的代码提取到一个单独的chunk中,这样可以避免在多个文件中重复加载相同的代码,从而减少最终打包文件的体积。

SplitChunksPlugin的拆分过程分为以下几个步骤:

1)模块依赖分析:通过 Webpack 的模块依赖图,识别出被多个chunk共同引用的模块

2)应用拆分规则:根据配置的规则(如minSize、minChunks、chunks等),筛选出符合条件的模块

3)创建新的chunk:将符合条件的模块移动到一个新的 chunk 中,并更新模块依赖关系

4)生成最终的打包文件:根据更新后的依赖关系,生成最终的打包文件

资源形态流转

上面已经把逻辑层面的构造主流程梳理完了,这里结合资源形态流转的角度重新考察整个过程:

在这里插入图片描述

compiler.make阶段:

  • entry文件以dependence对象形式加入compilation的依赖列表,dependence对象记录有entry的类型、路径等信息
  • 根据dependence调用对应的工厂函数创建module对象,之后读入module对应的文件内容,调用loader-runner对内容做转化,转化结果若有其它依赖则继续读入依赖资源,重复此过程直到所有依赖均被转化为 module

compilation.seal阶段:

  • 遍历module集合,根据entry配置及引入资源的方式,将 module 分配到不同的 chunk
  • 遍历chunk集合,调用compilation.emitAsset方法标记chunk的输出规则,即转化为 assets 集合

compiler.emitAssets阶段:

  • 将 assets 写入文件系统
webpack的基本介绍与使用 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。 阅读详情

相关推荐

Webpack

1. webpack 中的插件 1.1.什么是 webpack 概念:webpack 是前端项目工程化的具体解决方案。 主要功能:它提供了友好的前端模块化开发支持,以及代码压缩混淆、处理浏览器端 JavaScript 的兼容性、性能优化等强大的功能。 好处:让程序员把工作的重心放到具体功能的实现上,提高了前端开发效率和项目的可维护性。 注意:目前Vue,React 等前端项目,基本上都是基于webpack 进行工程化开发的。 1.2. 创建列表隔行变色项目 ① 新建项目空白目录,并运行n...

酷爱前端的小陈博客 625

Webpack--入门只看这一篇就够了(图文+代码)

代码分离(code splitting)和懒加载(lazy loading)是Webpack中用于优化资源加载的两种技术。代码分离是将打包生成的代码文件拆分成多个较小的文件,而不是将所有代码打包到一个文件中。这样做的好处是可以提高初始加载速度,并减小每个页面的加载所需的数据量。通过代码分离,只需在需要时加载特定模块,提高了页面的响应速度和用户体验。懒加载是指在需要时才加载某个模块,而不是在初始加载时就将所有代码一次性加载完毕。通过懒加载,可以将页面分成多个模块,并根据需要动态地加载模块。

小庄zzz的博客 3万+

360加固DEX解密与ELF修复技术解析

本文深入解析360加固的DEX解密与ELF修复技术,详细介绍了其多层保护机制、Java层入口分析、Native层加载流程及反调试绕过技巧。通过RC4和zlib解密技术,结合Frida工具实现内存Dump和ELF文件修复,为逆向工程师提供实用解决方案。

weixin_29327525的博客 512

webpack详解

一、什么是webpack 1、官方解释:从本质上来讲,webpack是一个现在的javaScript应用的静态模块化打包工具。(从两点概括这句话即模块和打包) 下面来说一下模块和打包的概念! 2、前端模块化: 前端模块化的一些方案:AMD、CMD、CommonJS、ES6(浏览器不能识别它们,但是webpack可以做它们的底层支撑,方可进行模块化开发) ES6之前,要想进行模块化开发,就必须借助于其他的工具,让我们可以进行模块化开发 并且在通过模块化开发完成了项目后,还需要处理模块化间的各种依赖,并且将

qq_43743402的博客 6万+

TwinCAT3实战:从零搭建倍福PLC的Modbus-TCP Server

本文详细介绍了如何使用TwinCAT3从零搭建倍福PLC的Modbus-TCP Server,包括环境准备、工程配置、参数设置、客户端连接测试及常见问题排查。通过实战步骤和实用技巧,帮助工程师快速掌握倍福PLC与Modbus-TCP的通信实现,提升工业自动化项目的开发效率。

weixin_30797199的博客 174

CSAPP performance lab

CSAPP 深入理解计算机系统的performance Lab

weixin_46091531的博客 1253

webpack看这一篇就够了

能够理解webpack基本概念和作用能够掌握webpack使用步骤能够使用webpack相关配置能够使用webpack开发服务器能够查阅使用webpack中文文档webpack官网现代 javascript 应用程序的 静态模块打包器 (module bundler)为要学的 vue-cli 开发环境做铺垫把很多文件打包整合到一起, 缩小项目体积, 提高加载速度其中功能:less/sass -> cssES6/7/8 -> ES5 处理js兼容支持js模块化处理css兼容性html/css/js -> 压缩

一个前端开发者 6万+

AI Agent ReAct架构设计模型剖析

ReAct通过"思考-行动-观察"循环运作:智能体先进行自然语言推理,再调用外部工具执行行动,观察结果后继续推理直至解决问题。这种架构提高了透明度和准确性,减少幻觉风险,使LLM能主动分解任务并利用外部数据源。实现关键在于精心设计的提示模板,引导LLM按结构化格式响应,而非依赖模型固有能力。

weixin_43939320的博客 1250

【Webpack】基本概念

是一种前端资源构建工具,一个静态模块打包器。 前端所有的资源文件(js/json/css/img/less/…)都会作为模块处理。 根据模块的依赖关系进行静态分析,打包生成对应的静态资源(bundle)。 基本流程: 从入口文件引入(各种包、资源 === 静态模块) => 形成chunk(代码块) => 按不同的资源进行处理(打包)=> 输出bundle 安装依赖方式 npm install --save-dev webpack npm install webpack@4.41.6 -.

qq_40044977的博客 193

ServiceNow Discovery & CMDB Interview Questions and Answers (2025)

【代码】ServiceNow Discovery & CMDB Interview Questions and Answers (2025)

weixin_47584092的博客 910

从底层结构开始学习FPGA(7)----进位链CARRY4

进位链CARRY4在FPGA实现加减法运算时扮演了什么角色?

孤独的单刀 1万+

webpack打包 - webpack篇

webpack 打包流程

阿莹yes的博客 915

ShaderJoy —— 简单又神奇的 “合体” 函数【GLSL】

smin 函数 它实际上有两种常见的实现方式 多项式 指数 多项式 smin 函数图 其对应的代码为 float smin( float a, float b ) { // 多项式 const float k = 0.5; float h = clamp(0.5 + 0.5 * (b - a) / k, 0.0, 1.0); return mix(b, a, h) - k * h * (1.0 - h); } 从上图中我们可以很明显的看出有两处不连...

ShaderJoy 的兴趣技术杂货铺 1858

webpack之核心概念及安装与使用

webpack之核心概念及安装与使用

yuanjinshenglife的专栏 1431

UNet 改进(39):结合残差连接与CBAM注意力机制的unet模型

本文提出了一种改进的UNet架构,通过融合残差连接和CBAM注意力机制来增强医学图像分割性能。该网络保留UNet的U形结构,但将基础模块替换为ResidualBlock和CBAM的组合:残差块通过快捷连接解决梯度消失问题,CBAM模块结合通道和空间注意力机制突出重要特征。整体架构采用编码器-解码器设计,包含5个下采样和上采样阶段,通过跳跃连接融合多尺度特征。实验表明,这种改进显著提升了原始UNet的性能,特别适用于需要精细边界的医学图像分割任务。

2401_82355416的博客 1031

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

webpack 相关

Webpack的理解

weixin_71479122的博客 730

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Webpack面试题整理

文章目录基本概念与配置性能优化 基本概念与配置 什么是loader?什么是plugin loader是模块转换器,使wenbpack拥有加载和解析非js文件的能力,是在module.rules中进行配置 plugin可以扩展webpack的功能,使得webpack更加灵活。可以在构建的过程中通过webpack的api改变输出的结果,在plugins中进行配置 module, chunk, bundle module是开发中的单个模块,我们直接写出来的是 module chunk是指webpac

张小杰 5812

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【面试题】webpack的五大核心、构建流程、性能优化

在确定好输出内容后,根据配置确定输出的路径和文件名,把文件内容写入到文件系统,在以上过程中,webpack 会在特定的时间点广播出特定的事件,插件在监听到感兴趣的事件后会执行特定的逻辑,并且插件可以调用Webpack 提供的 API 改变 Webpack 的运行结果。:从入口文件出发,调用所有配置的Loader 对模块进行翻译,再找出该模块依赖的模块,再递归本步骤直到所有入口依赖的文件都经过了本步骤的处理。:根据配置中的 entry 找出所有的入口文件。这道题基本会问在Webpack性能优化之前。

m0_61049675的博客 769

总结之webpack

详细讲解webpack的的使用和相关api

LYZ0909的博客 747

webpack使用教程

一、webpack的概念webpack是一个前端工具,可以让各个模块进行加载、预处理,再进行打包,它有gulp和grunt的大部分基本功能,它的最大区别就是提供了模块化解决方案,可以把各种资源作为模块来使用和处理。二、安装与相关配置(包括打包文件)注:以下命令在安装node.js后,在其命令行工具中输入命令步骤如下:1、在要用的webpack的文件夹下初始化npm命令:npm init命令执行完后...

dengdongxia的博客 1374

Webpack 基础入门

文章围绕 Webpack 基础入门展开,先介绍 Webpack 是静态模块打包工具,阐述使用它的原因,如代码拆分、模块加载等。接着讲解基础入门步骤,包括安装、创建项目结构、编写及配置代码、执行打包。然后介绍核心功能,如加载器、插件的使用,以及代码拆分与按需加载配置。旨在帮助小白快速了解 Webpack,开启 Web 开发之旅。

懒羊羊我小弟的博客 1199

webpack 基本概念

  今天无意看到电脑上有个 webpack 的小视频,就学了学。虽然杂音很大,讲解员中间也卡了几次,但总归让我对 webpack 有了些简单的了解。   想着还是先把 webpack 的基本概念搞明白点,所以第一篇博客就先总结一下概念吧。 什么是 webpack   根据 webpack 中文网所说可知,webpack 本质上是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency gr

小R.的博客 583

webpack入门

前面的话 现在团队开发基本会采用“模块化 + 新语言 + 新框架”的模式进行开发,webpack成为构建工具的首选。 什么是webpack? webpack 是一个打包模块化JavaScript的工具,在webpack里面一切皆为模块,例如一个js文件、css文件,图片、模板等。webpack将这些相互有依赖的模块,打包成一个供浏览器能使用的静态资源(一个js文件)。 webpack5大特点 ...

小柒的前端之旅 283

Tapable 核心机制与 Webpack 应用详解

Tapable是Webpack插件系统的核心,提供多种钩子类型控制任务流程。本文介绍了Tapable的核心特性,包括同步/异步钩子的使用方式(SyncHook/AsyncParallelHook等),并通过代码示例演示注册和触发机制。重点分析了Tapable的动态编译优化原理,以及其在Webpack中的实际应用(如Compiler/Compilation)。理解Tapable的钩子模型和执行机制是掌握Webpack插件开发的关键。

油墨香^-^的博客 619

Danmo的学习之路(webpack)

一边啃JS和计网的书,一边来学webpack,学习完后就可以学习框架了,实战搞起来,理论补起来

DanmoSAMA的博客~ 652
上一篇: 前端自动化测试:Jest、Puppeteer
下一篇: Vite基本概念及实现原理
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值