当前位置: 首页 > news >正文

初识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能解析的三种文件路径

  1. 绝对路径:已获得文件的绝对路径,不需要进一步解析。
  2. 相对路径:通过import/require中给的相对路径,来拼接上下文路径,生成该模块的绝对路径
  3. 模块路径:在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 提供几种可选方式,帮助你在代码发生变化后自动编译代码:

  1. webpack 的 Watch Mode(观察模式)
  2. webpack-dev-server
  3. 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中文网

这个不详细写了,需要用到的时候查阅就可以了 

相关文章:

  • 【AI视野·今日NLP 自然语言处理论文速览 第七十九期】Thu, 18 Jan 2024
  • java.lang.NoClassDefFoundError: org/springframework/core/GenericTypeResolver
  • mongodb 导出数据
  • 【并发编程】AQS原理
  • LCP 30. 魔塔游戏
  • Bean 的六种作用域
  • Flink理论—容错之状态
  • 【报错解决】-bash: export: `-8‘: not a valid identifier 不是有效的标识符
  • 【算法题】93. 复原 IP 地址
  • HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核基础-消息队列queue
  • 【Linux学习】线程池
  • 【数据库】哪些操作会导致索引失效
  • Java 中 一些常见的并发集合类
  • 『运维备忘录』之 Zip 命令详解
  • C#系列-使用 Minio 做图片服务器实现图片上传 和下载(13)
  • [数据结构]链表的实现在PHP中
  • angular2 简述
  • IOS评论框不贴底(ios12新bug)
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • KMP算法及优化
  • mac修复ab及siege安装
  • maya建模与骨骼动画快速实现人工鱼
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • node-glob通配符
  • opencv python Meanshift 和 Camshift
  • Python学习之路13-记分
  • Spring声明式事务管理之一:五大属性分析
  • SQLServer之创建显式事务
  • 前端学习笔记之观察者模式
  • 区块链将重新定义世界
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 我从编程教室毕业
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (四)Linux Shell编程——输入输出重定向
  • (循环依赖问题)学习spring的第九天
  • (一)Neo4j下载安装以及初次使用
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • 、写入Shellcode到注册表上线
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net 发送邮件
  • /etc/fstab和/etc/mtab的区别
  • [ 第一章] JavaScript 简史
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [CISCN 2023 初赛]go_session
  • [CISCN2019 华东北赛区]Web2
  • [codeforces]Recover the String
  • [HDOJ4911]Inversion
  • [IE编程] 了解Urlmon.dll和Wininet.dll