前端工程化11-webpack常见插件

1、webpack的插件Plugin

刚才我们也讲解了下,我们对webpack路径的一个处理,处理的话包括别名的配置,模块是如何找到并加载的,总的来说到现在webpack这个配置到现在来说还是相当的麻烦的,但是目前来说我们讲的这些东西都是一些比较基础的一些东西,当你真正理解之后每个配置其实并不复杂,后面的话这个webpack还有更加复杂的配置、还有些优化方面的东西,我们等到讲这个工程化高级的时候在聊对应的一个东西。下边我们就需要了解下webpack的插件,主要是,CleanWebpackPlugin,这个插件的作用是清除原来你打包的文件夹给你生成新的文件夹,另一个东西只要是帮助我们生成一个html的模板,还有一个就是DefinePlugin,这个东西的话是用来给我们定义一些全局变量的,你可以在你的项目里边直接使用在这个里面插入的全局变量。这个东西的话其实还是比较有用的。第五个的话就是开发模式。我们主要是讲解这个开发模式的作用

1.1、认识Webpack插件Plugin

插件和Loader之间的关系,在第一次接触的时候非常容易搞混,前端面试中问的也比较多

Webpack的另一个核心是Plugin,官方有这样一段对Plugin的描述:

​ While loaders are used to transform certain types of modules, plugins can be leveraged to perform a wider range

​ of tasks like bundle optimization, asset management and injection of environment variables.

上面表达的含义翻译过来就是:

​ Loader是用于特定的模块类型进行转换;

​ Plugin可以用于执行更加广泛的任务,比如打包优化、资源管理、环境变量注入等;

image-20240727234151259

以前的话我们经过Loader处理过的CSS,我们的CSS是插入到页面中的Style标签里的,我们可以通过某些插件来把这个CSS抽出来。

1.2、CleanWebpackPlugin插件

前面我们演示的过程中,每次修改了一些配置,重新打包时,都需要手动删除dist文件夹

  • 我们可以借助于一个插件来帮助我们完成,这个插件就是CleanWebpackPlugin;

首先,我们先安装这个插件:

  • npm install clean-webpack-plugin -D

之后在插件中配置:

image-20240727235547840

1.3、HtmlWebpackPlugin插件

另外还有一个不太规范的地方:

  • 我们的HTML文件是编写在根目录下的,而最终打包的dist文件夹中是没有index.html文件的。
  • 在进行项目部署的时,必然也是需要有对应的入口文件index.html;
  • 所以我们也需要对index.html进行打包处理;

对HTML进行打包处理我们可以使用另外一个插件:HtmlWebpackPlugin;

npm install html-webpack-plugin -D

image-20240727235855516

1.4、生成index.html分析

我们会发现,现在自动在dist文件夹中,生成了一个index.html的文件:

  • 该文件中也自动添加了我们打包的bundle.js文件;

image-20240728000102156

这个文件是如何生成的呢?

  • 默认情况下是根据ejs的一个模板来生成的;
  • 在html-webpack-plugin的源码中,有一个default_index.ejs模块;

1.5、自定义HTML模板

如果我们想在自己的模块中加入一些比较特别的内容:

​ 比如添加一个noscript标签,在用户的JavaScript被关闭时,给予响应的提示;

​ 比如在开发vue或者react项目时,我们需要一个可以挂载后续组件的根标签

这个我们需要一个属于自己的index.html模块:

image-20240728000409152

1.6、自定义模板数据填充

上面的代码中,会有一些类似这样的语法<% 变量 %>,这个是EJS模块填充数据的方式。

在配置HtmlWebpackPlugin时,我们可以添加如下配置:

  • **template:**指定我们要使用的模块所在的路径;
  • **title:**在进行htmlWebpackPlugin.options.title读取时,就会读到该信息;

image-20240728000655958

我们把Vue的模版粘贴了一份,但是发现里边有一个变量,我们打包的时候会发现报错。这是因为那个东西是一个全局变量

1.7、DefinePlugin的介绍

但是,这个时候编译还是会报错,因为在我们的模块中还使用到一个BASE_URL的常量

image-20240728001323167

这是因为在编译template模块时,有一个BASE_URL:

  • 但是我们并没有设置过这个常量值,所以会出现没有定义的错误;

这个时候我们可以使用DefinePlugin插件;

1.8、DefinePlugin的使用

DefinePlugin允许在编译时创建配置的全局常量,是一个webpack内置的插件(不需要单独安装):

image-20240728001515939

这个时候,编译template就可以正确的编译了,会读取到BASE_URL的值

1.9、Mode配置

前面我们一直没有讲mode。

Mode配置选项,可以告知webpack使用相应模式的内置优化

  • 默认值是production(什么都不设置的情况下);
  • 可选值有:‘none’ | ‘development’ | ‘production’;

这几个选项有什么样的区别呢?

  • image-20240728001804734

如果你设置成none这种模式,那么将不会使用任务的优化手段,如果你设置成开发模式,他会将process.env.NODE_ENV的值设置为development,并且对我们模块、进行一些分包的操作,如果是production,会应用一些插件进行代码混淆压缩。不同的模式产生的效果是不一样的,

每一种Mode配置代表的选项是比较多的,这个问题我们后期的时候再研究

image-20240728003055915

2.0、webpack默认优化了生成内容的清理

image-20240728003202511

2.1、webpack搭建本地服务器

我们以前在修改完代码时候,我们需要从新进行打包,然后借用VsCode插件从新跑起来我们这个项目,这样的话才能看到最新的效果,每次重复这样的步骤开发效率是非常低的,我们开发中是不采用这种方式的,都是通过webpack搭建本地服务器,陪着webpack热模块替换来实现局部代码的实时更新

目前我们开发的代码,为了运行需要有两个操作:

  • 操作一:npm run build,编译相关的代码;
  • 操作二:通过live server或者直接通过浏览器,打开index.html代码,查看效果;

这个过程经常操作会影响我们的开发效率,我们希望可以做到,当文件发生变化时,可以自动的完成 编译 展示**;**

为了完成自动编译,webpack提供了几种可选的方式:

  • webpack watch mode;
  • webpack-dev-server(常用);
  • webpack-dev-middleware;

2.2、webpack-dev-server

上面的方式可以监听到文件的变化,但是事实上它本身是没有自动刷新浏览器的功能的:

  • 当然,目前我们可以在VSCode中使用live-server来完成这样的功能;
  • 但是,我们希望在不适用live-server的情况下,可以具备live reloading(实时重新加载)的功能;

安装webpack-dev-server

  • npm install webpack-dev-server -D

修改配置文件,启动时加上serve参数:

image-20240728003815189

webpack-dev-server 在编译之后不会写入到任何输出文件,而是将 bundle 文件保留在内存中:

  • 事实上webpack-dev-server使用了一个库叫memfs(memory-fs webpack自己写的)

2.3、认识模块热替换(HMR)

什么是HMR呢?

  • HMR的全称是Hot Module Replacement,翻译为模块热替换
  • 模块热替换是指在 应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个页面;

HMR通过如下几种方式,来提高开发的速度:

  • 不重新加载整个页面,这样可以保留某些应用程序的状态不丢失;
  • 只更新需要变化的内容,节省开发的时间;
  • ==修改了css、js源代码,会立即在浏览器更新,==相当于直接在浏览器的devtools中直接修改样式;

如何使用HMR呢?

  • 默认情况下,webpack-dev-server已经支持HMR,我们只需要开启即可(默认已经开启);
  • 在不开启HMR的情况下,当我们修改了源代码之后,整个页面会自动刷新,使用的是live reloading;

2.4、如何开启开启HMR

修改webpack的配置:

image-20240728004448385

注意:现在的webpack默认就是开启这个东西的

浏览器可以看到如下效果:

image-20240728004505540

但是你会发现,当我们修改了某一个模块的代码时,依然是刷新的整个页面:

  • 这是因为我们需要去指定哪些模块发生更新时,进行HMR;

image-20240728004548414

2.5、框架中的HMR

有一个问题:在开发其他项目时,我们是否需要经常手动去写入 module.hot.accpet相关的API呢?

  • 比如开发Vue、React项目,我们修改了组件,希望进行热更新,这个时候应该如何去操作呢

事实上社区已经针对这些有很成熟的解决方案了:

  • 比如vue开发中,我们使用vue-loader,此loader支持vue组件的HMR,提供开箱即用的体验;
  • 比如react开发中,有React Hot Loader,实时调整react组件(目前React官方已经弃用了,改成使用react-refresh);

2.6、devServcer的 host配置

host设置主机地址:

  • 默认值是localhost;
  • 如果希望其他地方也可以访问,可以设置为 0.0.0.0;

localhost 和 0.0.0.0 的区别:

  • localhost:本质上是一个域名,通常情况下会被解析成127.0.0.1;
  • 127.0.0.1:回环地址(Loop Back Address),表达的意思其实是我们主机自己发出去的包,直接被自己接收
    • 正常的数据库包经常 应用层 - 传输层 - 网络层 - 数据链路层 - 物理层
    • 而回环地址,是在网络层直接就被获取到了,是不会经常数据链路层和物理层的;
    • 比如我们监听 127.0.0.1时,在同一个网段下的主机中,通过ip地址是不能访问的;
  • 0.0.0.0:监听IPV4上所有的地址,再根据端口找到不同的应用程序;
    • 比如我们监听 0.0.0.0时,在同一个网段下的主机中,通过ip地址是可以访问的;

2.7、dev-server的其他属性(port、open、compress)

port设置监听的端口,默认情况下是8080

open是否打开浏览器:

  • 默认值是false,设置为true会打开浏览器;
  • 也可以设置为类似于 Google Chrome等值;

compress是否为静态文件开启gzip compression:

  • 默认值是false,可以设置为true;

image-20240728004939769

2.8、如何区分开发环境

目前我们所有的webpack配置信息都是放到一个配置文件中的:webpack.config.js

  • 当配置越来越多时,这个文件会变得越来越不容易维护;
  • 并且某些配置是在开发环境需要使用的,某些配置是在生成环境需要使用的,当然某些配置是在开发和生成环境都会使用的;
  • 所以,我们最好对配置进行划分方便我们维护和管理

那么,在启动时如何可以区分不同的配置呢?

  • 方案一:编写两个不同的配置文件,开发和生成时,分别加载不同的配置文件即可;
  • 方式二:使用相同的一个入口配置文件,通过设置参数来区分它们;

image-20240728005242106

2.9、区分开发和生成环境配置实战

webpack.comm.conf.js、webpack.dev.conf.js、webpack.prod.conf.js

我们在入口中打包时指定的配置文件为对应的配置文件

但是我们需要在对应环境的配置文件中,引入公共的配置文件,我们需要用到另一个库,在早期Vue2早期的脚手架中就是通过这种方式来实现的,只不过后期他们把这种方式开发到一个service-cli这个库里面。隐藏来对应的webpack配置文件

在最新得webpack5里边新加入了一个属性 --merge这个属性,但是我个人不是很喜欢这种方式,因为他是需要在命令里区修改,这样就造成了我们这个东西太长

我们刚才说得另一个库就是webpack-merge

npm i webpack-merge -D

注意我们在写webpack相应配置的时候用的一直是Common.js的语法,为啥用这个?因为webpack这个东西最终跑在node.node支持的就是Common.js语法

所以在webpack中的配置我用的就是Common.js,那有没有办法用其他的?可以经过一些特殊的配置我们可以采用EsMoudel的规范

image-20240728010316779

2.3、webpack开发环境和生产环境的配置区别

开发环境的需求

​ 模块热更新 (本地开启服务,实时更新)

​ sourceMap (代码映射,方便打包调试)

​ 接口代理  (配置proxyTable解决开发环境中的跨域问题)

​ 代码规范检查 (代码规范检查工具)

生产环境的需求:

​ 提取公共代码

​ 压缩混淆(压缩混淆代码,清除代码空格,注释等信息使其变得难以阅读)

​ 文件压缩/base64编码(压缩代码,减少线上环境文件包的大小)

​ 去除无用的代码

开发环境和生产环境的共同需求:

​ 入口

​ 代码处理(loader处理)

​ 解析配置

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

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

相关文章

前端工程化-vue项目创建

可以使用html、css、javascpript ,以及使用vue、axios等技术搭建前端页面&#xff0c;但效率低、结构乱。 实际前端开发&#xff1a; 前端工程化开发步骤&#xff1a; 一、环境准备 1.安装NodeJS2. 安装vue-cli 二、创建Vue项目 有两种方式创建&#xff0c;一般采用第二种图…

MMCV1.6.0之Runner/Hook/OptimizerHook(反向传播+参数更新)、Fp16OptimizerHook、自定义优化器与config设置

OptimizerHook 这段代码定义了一个名为 OptimizerHook 的类&#xff0c;它是一个用于优化器的自定义操作钩子。该钩子包含了一些用于梯度裁剪和检测异常参数的操作。这对于在深度学习训练过程中优化模型的性能和调试模型非常有用。 类的定义 OptimizerHook 类继承自 Hook&…

documents4j 将word转pdf文件,本地(Windows)测试没问题,部署到服务器(centos)报错

问题 报错如下&#xff1a; 代码 首先要保证你的Java代码没问题&#xff0c;可以参考下面代码 maven依赖 <!--documents4j--> <dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><versi…

解决mysql事件调度器重启服务后自动失效的问题

前段时间为通过mysql事件生成测试数据&#xff0c;今天发现数据在10:57后停止了CREATE EVENT IF NOT EXISTS insert_random_data ON SCHEDULE EVERY 10 SECOND DO INSERT INTO test (createtime, random_number) VALUES (NOW(), FLOOR(RAND() * 100));检查事件状态&#…

C++String类的手撕实现

目录 构造函数 提前准备工作&#xff1a; 有参构造 析构函数 c_str 无参构造&#xff1a; 无参和有参的结合 operater[]的实现 简易版的迭代器 begin end 原因&#xff1a; reserve 思想步骤 获取_capacity 和 _size 测试 push_back 思想步骤 append insert…

平安养老险广西分公司开展7.8公益健步行活动

近日&#xff0c;平安养老保险股份有限公司&#xff08;以下简称“平安养老险”&#xff09;广西分公司在南宁邕江沿岸开展“7.8”公益健步行活动&#xff0c;在分公司班子的号召下&#xff0c;各部门内外勤员工均踊跃参与。 员工们沿途随手捡拾垃圾&#xff0c;传递积极、绿色…

就在刚刚,中国 IMO 奥数遗憾地失去了第一名的宝座,连续五年的统治地位被美国队所终结。

&#x1f431; 个人主页&#xff1a;TechCodeAI启航&#xff0c;公众号&#xff1a;TechCodeAI &#x1f64b;‍♂️ 作者简介&#xff1a;2020参加工作&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab; 优质专…

Vue3开源Tree组件研发:节点勾选支持v-model

自研Tree组件有两个原因&#xff1a;1. 目前开源UI对Tree组件的用户API不太友好&#xff0c;2. 提升Vue3组件自研能力。 目前已实现的功能见上面思维导图。想象Tree组件的一个使用场景&#xff1a;后台管理员通过Tree组件来完成用户角色授权&#xff0c;同时支持对权限进行新增…

Spring中使用到的设计模式及其源码分析

前言 众所周知&#xff0c;Spring框架是一个强大而灵活的开发框架。这不&#xff0c;上次的面试刚问到这些&#xff0c;没防住&#xff01;&#xff01;&#xff01;因此下来总结一下。这篇文章主要介绍Spring中使用到的设计模式&#xff0c;自己做个面试复盘&#xff0c;同时…

Spring Security 原理

Spring Security是一个功能强大且广泛使用的身份验证和授权框架&#xff0c;专为保护Java应用程序的安全性而设计。它提供了一套可配置的安全性规则和机制&#xff0c;用于对应用程序的资源进行访问控制和保护。以下是Spring Security的主要原理&#xff1a; 1. 过滤器链&…

引领安全新风尚:WT2605/WT2003H芯片方案赋能电动汽车,打造智能低速安全报警器"

电动汽车低速报警器(AVAS)方案可采用WT2605或WT2003H方案芯片,可实现当车辆时速低于设定值(如20Km/h),报警器会发出类似发动机加速减速的声音,倒档时装置也会发出倒车警示,在嘈杂的城市环境中帮助提升行人对驶近的电动汽车的感知,降低行人、骑行者和弱势群体面临的风险。 WT26…

十分钟带你入门Go语言(Golang)开发

概述 Go语言是由 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go语言的设计目标是将静态语言的安全性和性能与动态语言的易用性相结合。Go语言在语言层面提供了对协程的支持&#xff0c;特别适合编写高并发的项目。随着使用Go语言…

基于opencv的答题卡识别

文章目录 一、背景需求二、处理步骤图片预处理检测到答题卡轮廓透视变换找每个圆圈的轮廓轮廓排序判断是否答题正确 一、背景需求 传统的手动评分方法耗时且容易出错&#xff0c;自动化评分可以可以显著提高评分过程的速度和准确性、减少人工成本。 答题卡图片处理效果如下&am…

想出国?去外企?建议网工无脑冲思科认证。

近年来&#xff0c;国内职场竞争愈发激烈&#xff0c;内卷现象严重&#xff0c;大部分人都面临着巨大的就业压力&#xff0c;或是找工作无门、或是中年危机悄然来临&#xff0c;时刻担心被职场优化。 在这样的背景下&#xff0c;出国或进入外企工作&#xff0c;成为了许多人寻…

[JavaScript] 动态获取方法参数名

JavaScript&#xff08;简称“JS”&#xff09;是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名&#xff0c;但是它也被用到了很多非浏览器环境中&#xff0c;JavaScript基于原型编程、多范式的动态脚本语言&am…

Optional类的使用 java8(附代码)

&#x1f370; 个人主页:_小白不加班__ &#x1f35e;文章有不合理的地方请各位大佬指正。 &#x1f349;文章不定期持续更新&#xff0c;如果我的文章对你有帮助➡️ 关注&#x1f64f;&#x1f3fb; 点赞&#x1f44d; 收藏⭐️ 文章目录 一、什么是Optional&#xff1f;二、…

科研绘图系列:R语言和弦图 (Chord diagram)

介绍 和弦图(Chord Diagram)是一种用于展示多个实体之间相互关系的数据可视化方法。它通常用于表示网络或系统中不同节点(实体)之间的连接强度或流量。和弦图由一个圆形布局组成,每个节点在圆周上占据一个扇形区域,节点之间的连接通过圆内的线条(和弦)来表示。 特点:…

数据结构第七讲:栈和队列OJ题

数据结构第七讲&#xff1a;栈和队列OJ题 1.有效的括号2.用队列实现栈3.用栈实现队列4.设计循环队列 1.有效的括号 链接: OJ题目链接 typedef char StackDataType;typedef struct Stack {StackDataType* arr;//使用一个指针来指向开辟的数组int capacity;//保存数组的空间大…

springboot爱宠屋宠物商店管理系统-计算机毕业设计源码52726

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…

【机器学习】正规方程的简单介绍以及如何使用Scikit-Learn实现基于正规方程的闭式解线性回归

引言 Scikit-learn 是一个开源的机器学习库&#xff0c;它支持 Python 编程语言。它提供了多种机器学习算法的实现&#xff0c;并用于数据挖掘和数据分析 文章目录 引言一、正规方程的定义二、正规方程的原理三、使用 Scikit-Learn 实现基于正规方程的闭式解线性回归3.1 工具3.…