Webpack构建工具

构建工具系列

  • Gulp构建工具
  • Grunt构建工具
  • Webpack构建工具
  • Vite构建工具

Webpack构建工具

  • 构建工具系列
  • 前言
  • 一、安装
  • 打包
  • 配置webpack
  • 安装样式加载器
  • devtool
      • webpack devtool 配置详解
      • 常见 devtool 值及适用场景
      • 选择建议
      • 性能影响
      • 注意事项
  • module
    • 处理流程
    • module.rules
    • module.use
    • module.type

跟着B站视频30 分钟掌握 Webpack写的
代码:项目地址

前言

Webpack 是一个现代 JavaScript 应用的静态模块打包工具。它将项目中的各类资源(如 JavaScript、CSS、图片等)视为模块,通过依赖关系分析生成优化后的静态资源。

一、安装

  1. 通过 npm 安装相关插件:
    mkdir pkdemo
    cd pkdemo
    npm init -y
    npm i webpack webpack-cli -D
    npm i html-webpack-plugin -D
    npm i babel-loader @babel/core @babel/preset-env -D
    npm i terser-webpack-plugin -D
    npm i webpack-dev-server -D
    npm i webpack-bundle-analyzer -D
    code .
    
  1. npm init -y 是一个快速初始化 Node.js 项目的命令,它跳过交互式问答环节,直接生成默认的 package.json 文件。 -y 或 --yes 参数表示使用默认配置,无需手动输入信息。默认值包括项目名(基于当前目录)、版本号(1.0.0)、描述等字段。
  2. webpack 是模块打包工具,用于处理 JavaScript 和其他静态资源
  3. webpack-cli 是 Webpack 的命令行工具,提供命令行交互和配置支持。
  4. –save-dev(或 -D 简写)表示将安装的包记录在 devDependencies 中,即这些包仅在开发阶段需要,不会包含在生产环境中。
  5. html-webpack-plugin一个常用的插件,用于简化 HTML 文件的创建和管理。它能够自动生成 HTML 文件,并自动注入打包后的 JavaScript 和 CSS 资源。
  6. babel-loader将现代 JavaScript 代码(如 ES6+、TypeScript 或 JSX)转换为向后兼容的版本,确保代码能在旧版浏览器或环境中运行。babel-loader 依赖于 Babel 核心工具链(@babel/core)和配置的预设(presets)或插件(plugins)来完成转译任务。
  7. @babel/core负责解析源代码、应用插件或预设的转换规则,并生成目标代码,是整个 Babel 生态系统的引擎
  8. @babel/preset-env 是一个智能预设,根据目标浏览器或环境自动确定需要的 Babel 插件和 polyfill。它通过分析项目的 browserslist 配置或手动指定的目标环境,仅转换必要的语法特性,避免不必要的代码转换。例如:
    - 如果目标环境支持箭头函数,@babel/preset-env 会跳过箭头函数的转换。
    - 如果目标环境缺乏 Promise,它会自动引入相关 polyfill(需配合 core-js 使用)。
  9. terser-webpack-plugin用于通过 Terser 工具压缩 JavaScript 代码
  10. webpack-dev-server一个基于 Express 的本地开发服务器,专为 webpack 项目提供实时重新加载(Live Reloading)和模块热替换(HMR)功能。它通过内存编译文件,避免写入磁盘,从而提升开发效率。配置完成,初次打包后将自动打开浏览器并加载页面,且更改代码后将自动更新页面
  11. webpack-bundle-analyzer 是一个可视化工具,用于分析 Webpack 构建生成的 bundle 文件。它帮助开发者理解打包后的文件结构、大小及其依赖关系,从而优化性能。配置后打包得时候会自动显示一个可视化页面,从里面可以看到各文件大小
    可视化分析 bundle 组成
    通过交互式树状图或矩形图展示 bundle 中每个模块的大小及其占比,直观呈现哪些模块占用了最多空间。开发者可以快速定位体积过大的模块。
    识别冗余或重复依赖
    工具会高亮显示重复或未被使用的依赖项,帮助开发者发现代码分割或 Tree Shaking 未优化的部分,减少不必要的代码打包。
    优化代码分割策略
    分析结果可用于调整 Webpack 的 SplitChunks 配置,合理拆分公共代码或第三方库,避免单个 bundle 过大影响加载速度。
    对比不同构建版本
    支持与历史构建结果对比,观察优化前后的 bundle 变化,验证配置调整是否有效。例如检查是否成功压缩了特定依赖的体积。
    辅助长期性能监控
    整合到持续集成流程中,定期生成分析报告,监控项目体积的增长趋势,防止因新增依赖导致性能退化。
  12. code . 打开VScodde

在这里插入图片描述

打包

在项目根目录新建一个index.html文件。输入英文状态下的!或者输入html:5并回车即可自动创建一个HTML模板。
新建src\index.js
在插件市场安装Live Server,可帮我们运行html页面,在html页面右键选择open in the Liver Server即可(安装目的:查看html页面编写是否有问题)。

在这里插入图片描述
运行打包指令:

npx webpack

在根目录出现一个dist文件夹即打包成功。
在这里插入图片描述

配置webpack

在项目根目录新建webpack.config.js文件,并在其中进行信息配置。

// 导入path插件
const path = require('path');
//导入静态页面生成插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
//导入压缩插件
const TerserPlugin = require('terser-webpack-plugin');
//导入打包分析插件
const BundleWebpackPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;    
/* 
* model.exports:nodejs模块导出对象 
* mode 开发模式或生产模式 
* entry 用于指定打包的入口文件。webpack会从这些入口文件开始,构建内部依赖图,并打包所有依赖模块
* output 用于指定打包后的文件输出位置、文件名格式以及其他相关设置  
* module指的是项目中可被分割的最小功能单位。每个文件(如JavaScript、CSS、图片等)都被视为一个module.
* webpack通过分析这些module之间的依赖关系,构建依赖图(Dependency Graph),最终打包成浏览器可识别的静态资源
*/
module.exports = {mode: 'development', // 模式, development或production//设置此属性是为了方便查看打包后得源代码devtool: 'inline-source-map', // 开发环境下使用source-map,生产环境下使用hidden-source-map,eval-source-mapentry: "./src/index.js",//入口文件output: {//输出文件path: path.resolve(__dirname ,'dist'), // 指定输出文件的目录,必须为绝对路径// filename: "bundle.js"// 定义输出文件的名称。可以使用[name]、[hash]等占位符动态生成文件名filename: "[name].[contenthash].js"// [name]会被替换为入口文件的名称,[contenthash]会根据内容生成一个唯一的哈希值,确保文件名在内容变化时也会变化,从而实现缓存优化},optimization: {minimize:true,//是否压缩minimizer:[new TerserPlugin()]//使用TerserPlugin压缩},/* 插件 * plugins:[new HtmlWebpackPlugin() ]可自动生成html,可不传参*/plugins:[// 自动生成html文件new HtmlWebpackPlugin({title: 'webpack打包测试',// 定义生成的html文件的标题filename: 'testIndex.html',// 定义生成的html文件的名称// template: 'src/index.html'// 定义html模板文件路径}),// 打包分析插件new BundleWebpackPlugin({})],module:{        rules: [//匹配css的规则{//用于匹配以 .css 结尾的字符串,且匹配时不区分大小写test: /\.css$/i,//\.转义'.' ,$匹配字符串的结尾,i 修饰符表示不区分大小写的匹配/**用于指定处理特定文件类型时使用的 loader。*它是一个数组,可以包含多个 loader,webpack 会从右到左(或从下到上)依次应用这些 loader。*/use: ['style-loader', 'css-loader']// 使用的loader,Loader 从右向左执行,例如 use: ['style-loader', 'css-loader'] 中先执行 css-loader。},//匹配图片的规则{test:/\.(png|jpg|jpeg|png|gif|svg)$/i,type: 'asset/resource', // 使用资源模块处理图片文件,将文件直接输出到输出目录并返回最终的 URL},//匹配js的规则{ test: /\.js$/, // 匹配所有以 .js 结尾的文件exclude: /node_modules/, // 排除 node_modules 目录下的文件use: {loader: 'babel-loader', // 使用 babel-loader 处理 JavaScript 文件options: {presets: ['@babel/preset-env'] // 使用 @babel/preset-env 预设}}}]},// 开发环境下使用 webpack-dev-server 开启热更新,还需要再去package.json中配置相关命令:scripts中添加“"start": "webpack serve --open"”devServer:{// 静态资源目录static: "./dist"},resolve:{alias: {// 设置别名,方便在代码中引用'@': path.resolve(__dirname, 'src'),'@utils': path.resolve(__dirname, 'src/utils'),'@assets': path.resolve(__dirname, 'src/assets')},}// EntryOptionPlugin
}

安装样式加载器

在Webpack或Vite等构建工具中配置样式加载器后方可编译样式文件。

npm i style-loader css-loader -D

devtool

devtool 是 webpack 配置中用于控制生成 source map 方式的选项,主要用于调试代码。source map 可以映射编译后的代码回源文件,方便定位问题。

webpack devtool 配置详解

devtool 是 webpack 配置中用于控制生成 source map 方式的选项,主要用于调试代码。source map 可以映射编译后的代码回源文件,方便定位问题。

常见 devtool 值及适用场景

eval

  • 使用 eval 包裹模块代码,生成速度最快
  • 只能映射到转换后的代码,无法映射到源文件
  • 适用于开发环境快速构建
module.exports = {devtool: 'eval'
}

eval-source-map

  • 每个模块使用 eval 执行
  • 生成完整的 source map 并作为 DataUrl 嵌入
  • 构建速度较慢但质量高
  • 适用于开发环境需要精确源映射

cheap-eval-source-map

  • 类似 eval-source-map 但只映射行号
  • 不映射列信息,构建速度更快
  • 适用于开发环境折中方案

cheap-module-eval-source-map

  • 类似 cheap-eval-source-map
  • 但会映射 loader 转换前的源代码
  • 推荐用于开发环境

source-map

  • 生成完整独立的 source map 文件
  • 质量最高但构建速度最慢
  • 适用于生产环境调试
module.exports = {devtool: 'source-map'
}

hidden-source-map

  • 生成 source map 但不添加引用注释
  • 需要手动处理 source map 文件
  • 适用于生产环境但不想暴露源文件

nosources-source-map

  • 生成 source map 但不包含源代码
  • 只能看到错误堆栈但无法查看代码
  • 适用于生产环境部分保护源代码

选择建议

开发环境推荐:

  • eval-source-mapcheap-module-eval-source-map

生产环境推荐:

  • source-maphidden-source-map

性能考虑:

  • eval 的选项构建更快
  • module 的选项能映射 loader 前代码
  • cheap 的选项忽略列映射

性能影响

不同 devtool 设置对构建和重建速度有显著影响。质量越高的 source map 生成时间越长。开发环境下需要在质量和速度间取得平衡。

// 开发环境推荐配置
module.exports = {devtool: 'cheap-module-eval-source-map',// 其他配置...
}// 生产环境推荐配置
module.exports = {devtool: 'source-map',// 其他配置...
}

注意事项

  • 生产环境如需 source map 应考虑安全性
  • 某些设置可能导致源文件暴露
  • 大型项目应测试不同设置的构建速度
  • 现代浏览器开发工具已很好支持各种 source map

module

在webpack中,module指的是项目中可被分割的最小功能单位。每个文件(如JavaScript、CSS、图片等)都被视为一个module,webpack通过分析这些module之间的依赖关系,构建依赖图(Dependency Graph),最终打包成浏览器可识别的静态资源。

module的类型
webpack支持多种类型的module,常见的有:

  • JavaScript模块:通过import或require导入的JS文件。
  • CSS模块:通过css-loader处理的样式文件。
  • 图片/字体资源:通过file-loader或url-loader处理的静态资源。
  • 第三方库:如lodash、jQuery等通过npm安装的依赖。

处理流程

module的处理流程

  • 解析路径:webpack根据配置的resolve规则解析模块路径。
  • 匹配规则:通过test正则匹配文件类型,调用对应的loader处理。
  • 依赖分析:处理过程中发现新的依赖(如import语句),递归处理。
  • 打包输出:最终将所有module合并为bundle文件。

module.rules

module.exports = {module: {rules: [{test: /\.js$/,use: 'babel-loader',exclude: /node_modules/},{test: /\.css$/,use: ['style-loader', 'css-loader']}]}
};

module.use

用于指定处理特定文件类型时使用的 loader。它是一个数组,可以包含多个 loader,webpack 会从右到左(或从下到上)依次应用这些 loader。
常见loader的作用

  • babel-loader:将ES6+代码转换为ES5。
  • css-loader:解析CSS文件中的@import和url()。
  • style-loader:将CSS注入到DOM中。
  • file-loader:将文件输出到指定目录并返回URL。

注意事项

  1. loader 的执行顺序是从右到左(或从下到上),第一个 loader 会将结果传递给下一个 loader
  2. 对于需要选项的 loader,建议使用对象形式配置
  3. 复杂的 loader 链可以拆分成多个规则
  4. 在生产环境中,可能需要使用 MiniCssExtractPlugin.loader 替代 style-loader

module.type

module.type 用于定义模块的处理方式。

  • asset/resource:专门用于处理文件资源(如图片、字体等),它会将文件直接输出到输出目录并返回最终的 URL。适用于需要直接引用文件路径而非文件内容的场景,例如:
    • 图片文件(.png, .jpg, .svg)
    • 字体文件(.woff, .ttf)
    • 其他静态资源
  • asset/inline:将文件内容作为 Data URL 嵌入(适用于小文件)。
  • asset/source:将文件内容作为字符串返回(适用于文本文件)。
  • asset:自动选择 resource 或 inline(默认阈值 8KB)。

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

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

相关文章

重学前端002 --响应式网页设计 CSS

文章目录 css 样式特殊说明 根据在这里 Freecodecamp 实践,调整顺序后做的总结。 css 样式 body {background-color: red; # 跟background-image 不同时使用background-image: url(https://cdn.freecodecamp.org/curriculum/css-cafe/beans.jpg);font-family: san…

RabbitMQ简单消息监听和确认

如何监听RabbitMQ队列 简单代码实现RabbitMQ消息监听 需要的依赖 <!--rabbitmq--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId><version>x.x.x</version>&l…

Docker学习笔记:Docker网络

本文是自己的学习笔记 1、Linux中的namespace1.1、创建namespace1.2、两个namespace互相通信2、Docker中的namespace2.1 容器中的默认Bridge3、容器的三种网络模式1、Linux中的namespace Docker中使用了虚拟网络技术&#xff0c;让各个容器的网络隔离。好像每个容器从网卡到端…

用自定义注解解决excel动态表头导出的问题

导入的excel有固定表头动态表头如何解决 自定义注解&#xff1a; import java.lang.annotation.*;/*** 自定义注解&#xff0c;用于动态生成excel表头*/ Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface FieldLabel {// 字段中文String label(…

Android-EDLA 解决 GtsMediaRouterTestCases 存在 fail

问题描述&#xff1a;[原因]R10套件新增模块&#xff0c;getRemoteDevice获取远程蓝牙设备时&#xff0c;蓝牙MAC为空 [对策]实际蓝牙MAC非空;测试时绕过处理 1.release/ebsw_skg/skg/frameworks/base/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManage…

双涡轮增压器结构设计cad【5张】+设计说明书

摘要 随着汽车制造商和消费者对动力性能的要求不断增加&#xff0c;发动机需要在更宽的转速范围内提供更大的功率和扭矩。双涡轮增压器可以帮助实现这一目标&#xff0c;通过在不同转速下调整涡轮的工作状态来提供更平顺的动力输出。单一涡轮增压器可能存在涡轮滞后和增压延迟…

大数据轻量化流批一体架构探索实践(一)

最近学习了解到一种轻量化&#xff0c;维护门槛较低的流批一体化的架构方式&#xff0c;虽然目前还是不太成熟&#xff0c;自己也在探索学习中。 dolphinschedulerdinkystarrocksflinkzookeper 后面我会逐步发一下这个整体架构的特点&#xff0c;以及各个组件作用&#xff0c;和…

【2025/07/04】GitHub 今日热门项目

GitHub 今日热门项目 &#x1f680; 每日精选优质开源项目 | 发现优质开源项目&#xff0c;跟上技术发展趋势 &#x1f4cb; 报告概览 &#x1f4ca; 统计项&#x1f4c8; 数值&#x1f4dd; 说明&#x1f4c5; 报告日期2025-07-04 (周五)GitHub Trending 每日快照&#x1f55…

HarmonyOS学习记录3

HarmonyOS学习记录3 本文为个人学习记录&#xff0c;仅供参考&#xff0c;如有错误请指出。本文主要记录ArkTS基础语法&#xff0c;仅记录了部分我觉得与其他语言不太类似的地方&#xff0c;具体规范请参考官方文档。 参考官方文档&#xff1a;https://developer.huawei.com/co…

HKS201-M24 大师版 8K60Hz USB 3.0 适用于 2 台 PC 1台显示器 无缝切换 KVM 切换器

HKS201-M24 8K60Hz HDMI 2.1 2x1 KVM 切换器&#xff0c;适用于 2 台 PC&#xff0c;带 EDID 仿真、千兆 LAN、双充电和 USB 3.2 Gen 1 HKS201-M24 产品概述 TESmart 重新定义智能工作空间&#xff0c;无缝双PC控制。 真正的 8K60Hz 亮度&#xff0c;具有 EDID 稳定性和超快速…

stm32f103vct6的DAC口的输出电压达不到3.3V

问题&#xff1a;调试时发现自己设置的DAC在最大时达不到3.3V&#xff0c;总结了原因&#xff0c;记录下。 原因&#xff1a;使用时&#xff0c;注意有没有其他负载&#xff0c;有的话最好给负载独立供电&#xff0c;不要只用STM32f103的板凑活着供电&#xff0c;我的就是这个…

java8 Collectors.mapping 使用 例子 学习

java8 Collectors.mapping 使用 例子 学习 Map<String, List<String>> colorApple appleList.stream().collect(Collectors.groupingBy(Apple::getColor, Collectors.mapping(Apple::getVariety, toList()))); colorApple.forEach((k, v) -> {System.out.prin…

动态规划-P1216 [IOI 1994] 数字三角形 Number Triangles

P1216 [IOI 1994] 数字三角形 Number Triangles 题目来源-洛谷题库 思路 如果用贪心只是找当前的到达该点的路径最大值&#xff0c;可能结果无法做到最优最值问题试着看能否将大问题分解成若干个小问题 走到a[i] [j ]这个点的最值来源于上一步a[i-1 ] [j]和a[i-1] [j-1]的最…

25年Java后端社招技术场景题!

一、电商领域高频场景题1. 百万级QPS秒杀系统设计场景需求&#xff1a;设计一个支持百万级QPS的秒杀系统&#xff0c;要求解决超卖问题&#xff0c;保证系统高可用。技术方案&#xff1a;分层削峰&#xff1a;前端页面静态化按钮防重复点击Redis集群&#xff1a;采用Lua脚本实现…

牛客:HJ16 购物单【01背包】【华为机考】

学习要点 深入理解回溯深入理解01背包问题 题目链接 购物单_牛客题霸_牛客网 题目描述 解法1&#xff1a;回溯 其实此题非常符合取子集的逻辑&#xff0c;但是时间复杂度太高。通过11/14。想写出来这个回溯过程&#xff0c;不容易。 #include <iostream> #include &l…

[学习记录]Unity毛发渲染[URP]-Fin基础版

鳍片法是一种在多边形表面垂直添加许多多边形&#xff0c;并在其上粘贴毛发纹理以营造毛茸茸的感觉的技术。这就像种植许多鳍&#xff08;就像鱼身上的鳍一样&#xff09;。本期我将在Unity6中实现一下基础的Fin毛发&#xff0c;并不涉及光照着色。后面我会出一篇加上着色效果的…

指针篇(7)- 指针运算笔试题(阿里巴巴)

目录 一、指针运算笔试题解析3.1 题目1&#xff1a;3.2 题目2&#xff1a;3.3 指针3&#xff1a;3.4 题目4&#xff1a;3.5 题目5&#xff1a;3.6 题目6&#xff1a;3.7 题目7&#xff1a; 总结 一、指针运算笔试题解析 3.1 题目1&#xff1a; #include<stdio.h> int m…

homebrew的一些常用方法

前言 因本人工作换到mac电脑&#xff0c;对包管理器homebrew的需求增加&#xff0c;因此将一些常用命令做如下记录&#xff0c;本博客主要用作记录用。 官网 macOS&#xff08;或 Linux&#xff09;缺失的软件包的管理器 — Homebrew 常用命令 如果脚本因网络问题无法下载…

【Python面试题】Python面试之基础知识常见面试题3-汇总篇(精选30个)

目录专栏导读前言1. 字典的内存管理机制是什么&#xff1f;2. 列表的内存管理机制是什么&#xff1f;3. 元组和列表的区别4. 字符串插值的方法5. 闭包、装饰器的原理闭包&#xff08;Closure&#xff09;装饰器&#xff08;Decorator&#xff09;6. map、filter的区别7. range(…

【免费.NET方案】CSV到PDF与DataTable的快速转换

CSV作为轻量级数据载体&#xff0c;在数据传输中占比超过70%。但其原生格式存在三大痛点&#xff1a; 可视化缺陷&#xff1a;无法直接生成可打印的报表结构限制&#xff1a;缺乏数据类型定义和关系约束安全风险&#xff1a;易被意外修改导致数据失真 因此&#xff0c;我们常…