初识webpack(二)解析resolve、插件plugins、dev-server
目录
(一)webpack的解析(resolve)
1.resovle.alias
2.resolve.extensions
3.resolve.mainFiles
(二) plugin插件
1.CleanWebpackPlugin
2.HtmlWebpackPlugin
3.DefinePlugin
(三)webpack-dev-server
1.开启本地服务器
2.HMR模块热替换
3.devServer的更多配置项
(一)webpack的解析(resolve)
解析(Resolve) | webpack 中文文档 | webpack中文文档 | webpack中文网
resolve用于配置模块如何被解析
webpack能解析的三种文件路径
- 绝对路径:已获得文件的绝对路径,不需要进一步解析。
- 相对路径:通过import/require中给的相对路径,来拼接上下文路径,生成该模块的绝对路径
- 模块路径:在resolve.modules配置中指定的所有目录中检索模块,默认从node_modules目录中查找模块。
确定路径是文件还是文件夹
是文件:
- 有扩展名:直接打包
- 没有扩展名:根据resolve.extensions配置作为文件扩展名解析
是文件夹:
在文件中根据resolve.mainFiles配置中指定的文件顺序查找
- resolve.mainFiles配置默认文件名 index
- 再根据resolve.extensions配置来解析扩展名
接下来只详细写一下两个配置项,比较常用
1.resovle.alias
当文件目录很复杂时,使用相对路径../../这种形式进行引用会非常不直观不方便。
给常用的路径起一个别名,来确保模块引用变得简单
例如:给/src/utils文件夹取别名
/* 在webpack.config.js中 */
module.exports = {...module: {/* resolve用于配置模块如何被解析 */resolve: {/* 为路径取别名 引入时更直观方便 */alias: {utils: path.resolve(__dirname, 'src/utils/')}}},
}
原来使用该模块路径引用情况:
import A from '../../utils/a'
现在使用该模块路径:
import A from 'utils/a'
2.resolve.extensions
webpack解析文件时不带扩展名,会自动根据resolve.extensions配置中的扩展名按照顺序进行匹配,能够使用户在引入模块时不带扩展
默认值是 ['.wasm','.mjs','.js','.json']
可自行配置需要的扩展名
resolve: {/* 扩展名数组 */extensions:['.ts','.js','.wasm'] // 会自动覆盖默认数组
}
注意:会自动覆盖默认数组,可以使用'...'来添加默认扩展数组
resolve: {/* 扩展名数组 */extensions:['.ts','.js','.wasm','...']
}
3.resolve.mainFiles
解析目录时要使用的文件名
resolve: {mainFiles: ['index'],},
(二) plugin插件
plugin | webpack 中文文档 | webpack中文文档 | webpack中文网
loader:用于转换某些类型的模块
插件plugin:用于执行范围更广的任务。包括:打包优化,资源管理,注入环境变量
想要使用一个插件,你只需要 require() 它,然后把它添加到 plugins 数组中。多数插件可以通过选项(option)自定义。你也可以在一个配置文件中因为不同目的而多次使用同一个插件,这时需要通过使用 new 操作符来创建一个插件实例。
接下来详细写一些常用插件的使用方法
1.CleanWebpackPlugin
webpack打包生成文件夹后再运行打包不会将原来的文件夹全部删除,需要手动删除文件夹
该插件可以帮助我们直接删除原打包文件夹并重新生成
下载CleanWebpackPlugin插件:
npm i clean-webpack-plugin -D
在webpack.config.js文件中进行插件配置:
// 局部引入插件
const { CleanWebpackPlugin } = require('clean-webpack-plugin')module.exports = {...plugins: [// 使用插件new CleanWebpackPlugin()]
}
现在,webpack官网plugins中不再记录有CleanWebpackPlugin插件,可以直接在output配置中设置 clean:true 即可
Output | webpack 中文文档 | webpack中文文档 | webpack中文网
output:{clean: true
}
2.HtmlWebpackPlugin
HtmlWebpackPlugin插件会在每次打包时在打包文件夹中自动生成html文件,
下载插件:
npm install --save-dev html-webpack-plugin
在webpack.config.js中进行配置:
// 为打包文件生成html文件的插件
const HtmlWebpackPlugin = require('html-webpack-plugin')module.exports = {plugins: [// 使用插件new CleanWebpackPlugin(),new HtmlWebpackPlugin({// 打包项目的标题title: 'dogeggWebsite',// html文件名 默认index.htmlfilename: 'index.html',// 根据当下index.html文件的格式生成打包文件夹中的html // 默认使用路径src/index.html的模板格式template: './src/index.html',})]
}
更多该插件的配置项在官方文档中查看
3.DefinePlugin
DefinePlugin | webpack 中文文档 | webpack中文文档 | webpack中文网
DefinePlugin插件允许在编译时创建全局常量使用,不需要额外下载
使用方法:
传递给 DefinePlugin 的每个键都是一个标识符或多个以 . 连接的标识符。
- 如果该值为字符串,它将被作为代码片段来使用。
- 如果该值不是字符串,则将被转换成字符串(包括函数方法)。
- 如果值是一个对象,则它所有的键将使用相同方法定义。
- 如果键添加
typeof作为前缀,它会被定义为 typeof 调用。
在webpack.config.js中配置:
// 引入definePlugin
const { DefinePlugin } = require('webpack')module.exports = {...plugins: [new DefinePlugin({// 传入参数是键值对形式,引号内是js代码形式// 'BASE_URL': '"./"',BASE_URL: JSON.stringify("./")})]
}
在src/index.html中使用该常量:
<link rel="icon" href="<%= BASE_URL %> favicon.ico" type="image/x-icon">
打包到文件夹后效果:
<link rel="icon" href="./ favicon.ico" type="image/x-icon">
(三)webpack-dev-server
在开发模式中,希望对代码做出改动能够立即编译并展示,就像liveServer一样
因此,使用webpack的开发工具来完成这一效果
webpack 提供几种可选方式,帮助你在代码发生变化后自动编译代码:
- webpack 的 Watch Mode(观察模式)
- webpack-dev-server
- webpack-dev-middleware
下面使用webpack-dev-server来搭建本地服务器
1.开启本地服务器
webpack-dev-server 提供了一个基本的 web server,并具有实时重新加载的功能
下载:npm i webpack-dev-server -D
在package.json里配置serve的便捷指令
"scripts": {"build": "webpack","serve": "webpack serve"},
在webpack.config.js中对devServer配置项进行自定义的配置
devServer: {}
在终端开启服务器:npm run serve
默认在端口8080开启

2.HMR模块热替换
HMR 全称 Hot Module Replacement,翻译为模块热替换
模块热替换是指,在应用程序运行过程中,替换、修改、删除模块,而无需刷新整个页面
webpack-dev-server默认开启HMR
但还是会出现更改一个模块整个页面都刷新的情况:这就需要在入口文件main.js中对需要热替换的模块进行设置
/* 在入口文件中 */// 如果HMR开启,就对对应模块进行热更新,并执行回调函数
if (module.hot) {module.hot.accept('./utils/a.js', () => {console.log('a模块已更新');})
}
再对a模块的内容进行修改就会发现,只更新了a模块内容

3.devServer的更多配置项
DevServer | webpack 中文文档 | webpack中文文档 | webpack中文网
这个不详细写了,需要用到的时候查阅就可以了
相关文章:
初识webpack(二)解析resolve、插件plugins、dev-server
目录 (一)webpack的解析(resolve) 1.resovle.alias 2.resolve.extensions 3.resolve.mainFiles (二) plugin插件 1.CleanWebpackPlugin 2.HtmlWebpackPlugin 3.DefinePlugin (三)webpack-dev-server 1.开启本地服务器 2.HMR模块热替换 3.devServer的更多配置项 (…...
什么是自编码器Auto-Encoder?
来源:https://www.bilibili.com/video/BV1Vx411j78H/?spm_id_from333.1007.0.0&vd_sourcef66cebc7ed6819c67fca9b4fa3785d39 为什么要压缩呢? 让神经网络直接从上千万个神经元中学习是一件很吃力的事情,因此通过压缩提取出原图片中最具代…...
openGauss学习笔记-219 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-网络
文章目录 openGauss学习笔记-219 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-网络219.1 查看网络状况 openGauss学习笔记-219 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-网络 获取openGauss节点的CPU、内存、I/O和网络资源使用情况,确认这些资源…...
SAP PP学习笔记- 豆知识01 - 怎么查询既存品目
SAP系统当中已经有哪些品目要怎么查询呢? 1,MM60 品目一览 这里可以输入Plant,然后可以查询该工厂的所有品目。 2,SE16 > MARA MARA 品目一般Data,存放的是品目基本信息。 如果要查询该品目属于哪个Plant&#x…...
相机的机身马达有什么用?
新手疑问: 为什么我的尼康D3200相机明明拥有拍视频能力,但是拍摄视频时却不能对焦 科普时间 那是因为你的相机缺少机身马达,并且你所使用的镜头也没有马达!机身马达是用于给镜头提供对焦动力的装置。它的作用是使相机具备自动对焦功能。如…...
拿捏c语言指针(上)
目录 前言 编辑 指针 内存与地址 计算机常见单位 理解编址 取地址,指针变量,解引用 取地址 指针变量 解引用 指针变量大小 指针类型的作用 char*解引用后 指针-整数 应用 void*指针 const修饰指针变量 const修饰普通变量 const修饰指…...
JVM指令手册
栈和局部变量操作将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入操作数栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int类型常量4…...
Linux之多线程
目录 一、进程与线程 1.1 进程的概念 1.2 线程的概念 1.3 线程的优点 1.4 线程的缺点 1.5 线程异常 1.6 线程用途 二、线程控制 2.1 POSIX线程库 2.2 创建一个新的线程 2.3 线程ID及进程地址空间布局 2.4 线程终止 2.5 线程等待 2.6 线程分离 一、进程与线程 在…...
TestNG invocationCount属性
有时我们会遇到这样的问题,比如如何多次运行一个测试用例?invocationCount是这个问题的答案。在这篇文章中,我们将讨论在TestNG中与Test annotation一起使用的invocationCount属性。 这个属性有什么作用,或者调用计数有什么用&am…...
关于maven项目中无法通过邮件服务器发送邮件的补充解决方案
1、问题及解决方法 我的一篇文章中提到使用代码发送电子邮件,但是maven项目中无法执行成功,现在我找到了解决办法,只要引入依赖时同时引入下面两个依赖就行了,我无法找到原因主要是使用单元测试方法运行,它居然不报错&…...
树形dp 笔记
树的最长路径 给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值。 现在请你找到树中的一条最长路径。 换句话说,要找到一条路径,使得使得路径两端的点的距离最远。 注意&…...
2024-02-08 Unity 编辑器开发之编辑器拓展1 —— 自定义菜单栏
文章目录 1 特殊文件夹 Editor2 在 Unity 菜单栏中添加自定义页签3 在 Hierarchy 窗口中添加自定义页签4 在 Project 窗口中添加自定义页签5 在菜单栏的 Component 菜单添加脚本6 在 Inspector 为脚本右键添加菜单7 加入快捷键8 小结 1 特殊文件夹 Editor Editor 文件夹是 …...
typescript中的Omit排除类型及Pick取想要的属性
Omit 的使用:排除类型 type OmitUser {name: string,age: number,sex:string } type newOmit Omit<OmitUser, sex>// 定义一个对象并将其类型设置为 newOmit const example: newOmit {name: "John",age: 30 };console.log( Omit 的使用:排除类型 , example…...
MATLAB计算极限和微积分
一.函数与极限 计算极限:lim(3*x^2/(2x1)),x分别趋于0和1,代码如下: syms x; limit(3*x*x/(2*x1),x,0) limit(3*x*x/(2*x1),x,1) 结果分别为0和1: 1.计算双侧极限 计算极限:lim(3*x^2/(2x1))࿰…...
在数组中插入元素
问题:假设有一个数组{1,2,3,4,5},如果我们要在3之后插入一个数(520),这该怎么办呢? 思路:要想在以元素3之后插入一个元素,我们先要做…...
【计算机网络】物理层|传输介质|物理层设备|宽带接入技术
目录 一、思维导图 二、传输介质 1.传输介质——导引型 2.传输介质——非导引型编辑 三、物理层设备 1.物理层设备:中继器&集线器 2.宽带接入技术(有线) 编辑 四、趁热打铁☞习题训练 五、物理层总思维导图 推荐 前些天发现…...
TCP和UDP面试题提问
TOC TCP(传输控制协议)和UDP(用户数据报协议)是两种计算机网络通信协议,它们在网络通信中起着不同的作用。 TCP TCP 是面向连接的协议,它在数据传输之前需要在发送端和接收端建立一条连接。TCP 提供可靠…...
网安常用的三个攻击方式
1.渗透测试执行标准(PTES) 渗透测试执行标准由7个部分组成,包括前期交互、情报收集、威胁建模、漏洞分析、渗透利用、后渗透、撰写报告。在中国,渗透测试必须经过授权,否则就违背了网络安全法。前期交互主要指开展渗透…...
C++面向对象程序设计-北京大学-郭炜【课程笔记(二)】
C面向对象程序设计-北京大学-郭炜【课程笔记(二)】 1、结构化程序设计结构化程序设计的不足 2、面向对象的程序设计2.1、面向对象的程序设计2.2、从客观事物抽象出类2.3、对象的内存分配2.4、对象之间的运算2.5、使用类的成员变量和成员函数用法1&#x…...
IDEA Ultimate下载(采用JetBrain学生认证)
IDEA Ultimate版本下载 Ulitmate是无限制版(解锁所有插件,正版需要付费。学生可以免费申请许可)Community是开源社区版本(部分插件不提供使用,比如Tomcat插件。免费) 我们将通过学生认证获取免费版。 Je…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
