webpack5:基本概念整理

写在前头:这篇文章只是我个人在学习过程中对webpack文档的简单总结,更多详细信息请在官网阅读。

一、webpack是什么

webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。当 webpack 处理应用程序时,它会在内部从一个或多个入口点构建一个 依赖图(dependency graph),然后将你项目中所需的每一个模块组合成一个或多个 bundles,它们均为静态资源,用于展示你的内容。

静态打包工具:主要是指那些能够将多个JavaScript模块以及其他类型的静态资源(如CSS、图片、字体等)进行处理、转换、合并和优化,最终输出适合浏览器加载和执行的静态资源文件的工具。

​二、为什么要使用webpack

1.在没有打包工具时面临的问题

  1. 手工合并与压缩: 开发者需要手动将多个JavaScript文件合并成一个或几个大的文件,进行压缩,减少文件大小。CSS文件同样需要手动合并并使用CSS压缩工具进行优化。

  2. 依赖管理: 早期并没有成熟的模块化解决方案,大部分项目基于全局命名空间来管理依赖,或者使用如RequireJS这样的库来实现异步模块加载(AMD)。这种方式下,每个模块都需要手动指定其依赖关系,并且无法享受到现代模块化带来的诸多便利。

  3. 资源引用: 图片、字体等静态资源一般直接通过HTML标签进行引用,大量的HTTP请求会降低页面加载速度。为了改善这种情况,开发者可能会手动将小图片合并为雪碧图(CSS Sprite),或者使用CDN加速资源加载。

  4. 工作流复杂: 没有自动化工具的支持,开发流程中的构建、测试、发布等环节相对繁琐,容易出错且耗时较长。

2.webpack做了什么解决问题

  1. 模块化管理

    • Webpack 支持 CommonJS、AMD 和 ES6 模块规范,允许开发者按照模块化的方式组织项目结构,使得代码更具可维护性和可复用性。
    • 它能解析项目中的模块依赖关系,形成一个依赖图谱,确保各个模块按正确顺序加载和执行。
  2. 资源打包

    • Webpack 可以将项目中的所有 JavaScript、CSS、图片、字体等静态资源打包成一个或多个bundle文件,减少HTTP请求的数量,从而加快网页加载速度。
    • 支持代码分割和动态导入,允许异步加载模块,仅在需要时加载相应代码,优化首屏加载速度。
  3. 转换和编译

    • Webpack 通过Loader机制处理非JavaScript资源,如将ES6/7+/TypeScript代码转换为浏览器可识别的语法,将SCSS/Less等预处理器编写的样式转换为CSS,将React/Vue等模板文件转换为JS模块等。
  4. 优化与压缩

    • 提供多种优化策略,如Tree Shaking去除无用代码,UglifyJsPlugin或TerserPlugin压缩代码,SourceMap便于调试,SplitChunksPlugin提取公共代码等。
    • 支持资源指纹(hashing),避免客户端缓存问题。
  5. 插件系统与扩展性

    • Webpack有大量的内置插件和第三方插件,可以进行更高级别的构建定制,如HtmlWebpackPlugin生成HTML文件,CleanWebpackPlugin清理输出目录,CopyWebpackPlugin复制静态资源等。

三、核心概念

1.入口起点(entry points)

Webpack 的入口起点(entry point)是构建依赖图的起始位置。在 Webpack 中,入口起点是指定 Webpack 开始构建应用内部依赖关系图的初始模块。当你定义了一个或多个入口起点后(通常一个HTML文档一个起点),Webpack 会从这些起点出发,递归地解析并追踪所有直接和间接依赖的模块。这一过程最终将形成一个完整的依赖关系图(dependency graph),Webpack 将根据这个依赖图将所有模块打包成一个或多个 bundle 文件,以便在浏览器中高效加载和运行。

例如使用vue-cli搭建的vue项目的src目录下的main.js就是一个单页面应用的打包起点。

2.输出(output)

Webpack 的输出(Output)配置允许您定义编译后的资源(通常是捆绑包/bundle)如何命名、存储以及它们最终在硬盘上的位置。即通过配置打包成你想要的样子。

例如使用vue-cli搭建的vue项目中使用run build打包命令后生成的dist文件夹。

3.加载器(loader)

webpack中,loader的主要作用是对非JavaScript文件进行转换,使webpack能够处理它们。因为webpack默认只能处理JavaScript模块,所以当我们需要打包其他类型的文件(如CSS、图片、TypeScript、SCSS、LESS等)时,就需要使用相应的loader来预处理这些文件。

例如在使用vue-cli搭建的vue项目中的package-lock.json文件中,我们可以看到babel-loader(ES6+转ES5),ts-loader,css-loader等等。

4.plugin(插件)

Webpack 的插件(Plugin)是一种强大的工具,它们允许开发者深入到 Webpack 构建流程的核心,执行编译和打包之外的更多高级任务。Webpack 的构建过程由一系列有序的事件组成,而插件则可以通过监听这些事件并在适当的时机执行相应的操作来扩展和定制构建流程。

例如:HotModuleReplacementPlugin(启动热更新),DllPlugin(拆分 bundles,从而大幅减少构建时间)。

5.模块(Moudules)

在模块化编程中,开发者将程序分解为功能离散的 chunk,并称之为 模块。项目中的每个文件都是一个模块。

6.依赖图

每当一个文件依赖另一个文件时,webpack 都会将文件视为直接存在 依赖关系。这使得 webpack 可以获取非代码资源,如 images 或 web 字体等。并会把它们作为 依赖 提供给应用程序。

Webpack从命令行或配置文件中定义的一个或多个入口点(entry point)开始,递归地分析这些入口点所依赖的其他模块。它会遍历整个项目的文件结构,找到所有相关的依赖项,并将它们组织成一个依赖图。Webpack的依赖图是其实现模块打包和优化的关键机制。

7.模块热替换(hot module replacement)

Webpack的模块热替换(Hot Module Replacement,简称HMR)是webpack提供的一个强大特性,它允许在运行时更新各种模块,而无需进行完全刷新。这极大地提升了开发效率,尤其是在开发复杂的单页面应用(SPA)时。

当源文件发生变化时,webpack会重新构建模块,并与浏览器之间建立一个WebSocket连接。通过这个连接,webpack将新的模块发送到浏览器端,浏览器端接收到新的模块后,通过HMR runtime来替换掉旧的模块。在这个过程中,当前页面的状态会被保留,比如页面的滚动位置、已输入的内容等都不会丢失。

四、总结

webpack通过模块化管理,构建一个模块依赖图,进行代码分割和支持动态导入(import)让模块可以按需加载;将代码进行转换和编译,让浏览器能识别;webpack对代码进行压缩和优化,提升加载速度;提供了模块热替换,为开发提高了效率和使用体验。

参考文档

webpack

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

掌握MySQL,看完这篇文章就够了!

1. MySQL MySQL是一种广泛使用的关系型数据库管理系统(RDBMS),由瑞典的MySQL AB公司开发,目前属于甲骨文公司(Oracle Corporation)。 MySQL使用结构化查询语言(SQL)进行数据库管理…

C语言指针——常量字符串和 变量字符串

常量字符串和 变量字符串 常量字符串和变量字符串是在编程中常见的两种字符串类型,它们有以下区别: 值的不可变性:常量字符串的值是不可变的,一旦被定义,就不能修改。而变量字符串的值是可变的,可以随时修…

Redis进阶(三):主从复制

为了解决单点问题,实现多服务器部署redis,有几种解决方案可以实现:主从复制,主从哨兵还有集群。 何为主从复制 简单来说有三个服务器分别部署了redis-server程序,选中一个服务器当作主节点,其他的就是从节…

【PCL】(二十六)自定义条件的欧几里得聚类分割点云

&#xff08;二十六&#xff09;自定义条件的欧几里得聚类分割点云 以下代码实现自定义条件对点进行欧几里得聚类分割。 conditional_euclidean_clustering.cpp #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/console/time.h>#…

Android Studio编译及调试知识

文章目录 Android Studio编译kotlin项目Android Studio编译Java和kotlin混合项目的过程gradle打印详细错误信息&#xff0c;类似这种工具的使用Android apk 从你的代码到APK打包的过程&#xff0c;APK安装到你的Android手机上的过程&#xff0c;最后安装好的形态&#xff0c;以…

Mint_21.3 drawing-area和goocanvas的FB笔记(五)

FreeBASIC SDL图形功能 SDL - Simple DirectMedia Layer 是完整的跨平台系统&#xff0c;有自己的窗口、直接捕获键盘、鼠标和游戏操纵杆的事件&#xff0c;直接操作音频和CDROM&#xff0c;在其surface上可使用gfx, openGL和direct3D绘图。Window3.0时代&#xff0c;各种应用…

准谐振PWM控制器-能够实现多种保护功能FAN6921MRMY 功率因数控制器

高度集成的FAN6921MRMY将功率因数控制器 (PFC) 和准谐振 PWM 控制器相结合。集成提供了成本高效的设计&#xff0c;可减少外部组件数量。对于 PFC&#xff0c;FAN6921MRMY使用控制导通时间技术提供调节的直流输出电压&#xff0c;执行自然的功率因数校正。FAN6921MRMY使用创新的…

【代码随想录算法训练营Day40】01背包问题一维dp数组;二维dp数组(滚动数组);416.分割等和子集

文章目录 ❇️Day 41 第九章 动态规划 part04✴️今日任务❇️01背包问题 二维背包问题的区别暴力解法动规五部曲 ❇️01背包问题 一维二维转一维&#xff1a;滚动数组动规五部曲 ❇️416. 分割等和子集随想录思路自己的思路二维方法一维方法 自己的代码二维方法一维方法 ❇️D…

Kibana二次开发环境搭建

1 kibana环境搭建 1.1 搭建后端服务 &#xff08;1&#xff09;java环境安装 ElasticSearch运行需要java jdk支持。所以要先安装JAVA环境。由于ElasticSearch 5.x 往后依赖于JDK 1.8的&#xff0c;所以现在我们下载JDK 1.8或者更高版本。下载JDK1.8,下载完成后安装&#xff…

去电脑维修店修电脑需要注意什么呢?装机之家晓龙

每当电脑出现故障时&#xff0c;你无疑会感到非常沮丧。 如果计算机已过了保修期&#xff0c;您将无法享受制造商的免费保修服务。 这意味着您必须自费找到一家电脑维修店。 去电脑维修店并不容易。 大家一定要知道&#xff0c;电脑维修非常困难&#xff0c;尤其是笔记本电脑维…

qtCreator可以全局包含。VSqt中千万不能全局包含,你的控件头文件会自己变成<>括号,编译就报错

qtCreator可以全局包含。 VSqt中千万不能全局包含&#xff0c;你的控件头文件会自己变成&#xff1c;&#xff1e;括号&#xff0c;编译就报错

重建大师6.2版本的建模效果出现下图中模糊的情况,是什么原因?

可能是因为坐标原点设置的不对&#xff0c;图例中的三角网都出现了精度损失的问题。 坐标原点设置的具体操作&#xff1a;提交产品后&#xff0c;在弹出的界面&#xff0c;可以设定坐标原点。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&#xff0…

第七届强网杯-PWN-【warmup】

文章目录 warmup libc 2.35检查IDA逆向maindeldelete_noteadd_noteshow_noteinput_numberread_16atoi __errno_location()相关解释prctl相关 思路高版本off by null利用技巧产生chunk extend泄露libc基地址泄露heap基地址修改放入tcachebin中的chunk的fd为stdout最后add两个chu…

AI大模型助力创意思维,拓展无限可能性

在当今快速发展的科技时代&#xff0c;人工智能大模型正逐渐成为我们生活中不可或缺的一部分。它们拥有强大的计算能力和学习能力&#xff0c;能够帮助我们解决许多复杂的问题&#xff0c;同时也可以为创意思维的拓展提供无限可能性。 人工智能大模型可以通过对海量数据的分析…

docker部署springboot jar包项目

docker部署springboot jar包项目 前提&#xff0c;服务器环境是docker环境&#xff0c;如果服务器没有安装docker&#xff0c;可以先安装docker环境。 各个环境安装docker&#xff1a; Ubuntu上安装Docker&#xff1a; ubuntu离线安装docker: CentOS7离线安装Docker&#xff1…

华为北向网管NCE开发教程(1)闭坑选接口协议

华为北向网管NCE开发教程&#xff08;1&#xff09;闭坑选接口协议 华为北向网管NCE开发教程&#xff08;2&#xff09;REST接口开发 华为北向网管NCE开发教程&#xff08;3&#xff09;CORBA协议开发 本文一是记录自己开发华为北向网管遇到的坑&#xff0c;二是给需要的人&…

Rocky Linux 的安装

1. 为什么用Rocky 因为CentOS不干了&#xff0c;这是CentOS的现状&#xff1a; CentOS Linux 8 在 2021 年底停止更新&#xff1b; CentOS Linux 7 用户较多&#xff0c;这个版本将在 2024 年 6 月 30 日停止支持&#xff1b; 未来社区不会再有 CentOS Linux 的新版本&…

联立方程模型的可识别性的通俗解释

联立方程模型的可识别性&#xff0c;主要的解法是阶条件算法和秩条件算法&#xff0c;数学公式角度的解释就不讲了&#xff0c;参考下面的前人文献。 【计量经济学】联立方程模型-CSDN博客 说一下公式算法背后的通俗原理。 在计量经济模型中&#xff0c;比如 Y23*Xu中&#x…

[java基础揉碎]super关键字

super关键字: 基本介绍 super代表父类的引用&#xff0c;用于访问父类的属性、方法、构造器 super给编程带来的便利/细节 1.调用父类的构造器的好处(分工明确&#xff0c;父类属性由父类初始化&#xff0c;子类的属性由子类初始化) 2.当子类中有和父类中的成员(属性和方法)重…

Springer旗下SCI,16天见刊!稳定检索13年,质量稳定

毕业推荐 SCIE&#xff1a; • 计算机类&#xff0c;6.5-7.0&#xff0c;JCR1区&#xff0c;中科院2区 • 2个月19天录用&#xff0c;6天见刊&#xff0c;36天检索 SCI&EI&#xff08;CCF-C类&#xff09; • 算法类&#xff0c;2.0-3.0&#xff0c;JCR3区&#xff0c…