webpack4.15.1 学习笔记(九) — 11个基础的插件使用
处理 webpack 在编译过程中的某个特定任务的功能模块,plugins 选项用于以各种方式自定义 webpack 构建过程。其中webpack 附带了各种内置插件,可以通过 webpack.[plugin-name] 访问这些插件。
webpack 打包的整个过程,它并不直接操作文件,而是基于事件机制工作,会监听 webpack 打包过程中的某些节点,执行广泛的任务。
html-webpack-plugin
简化了html文件的创建,以便为webpack包提供服务。该插件将生成一个 HTML5 文件,所有的 bundle 会自动添加到 html 中。
具体插入方式是将样式link插入到head元素中,script插入到head或者body中。
npm install html-webpack-plugin --save-dev
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
// ...
plugins: [
new HtmlWebpackPlugin({
title: 'HtmlWebpackPlugin 插件学习',
minify: {
removeComments: true, // 移除HTML中的注释
collapseWhitespace: true, // 删除空白符与换行符
minifyCSS: true, // 压缩内联css
},
inject: "head", // 表示script标签插入位置,true(默认值), body, head, false(不插入)
})
],
};
多页应用打包:
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
entry: {
index: './src/index.js',
login: './src/login.js',
},
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
},
plugins: [
new HtmlWebpackPlugin({
filename: 'index.html', // 多个HtmlWebpackPlugin, filename字段不可缺省,否则默认生成的都是 index.html。
}),
new HtmlWebpackPlugin({
filename: 'login.html',
}),
],
}
但是会发现 index.html 和 login.html 同时引入了 index.bundle.js 和 login.bundle.js,而通常只希望 index.html 中只引入 index.bundle.js,login.html 只引入 login.bundle.js。
HtmlWebpackPlugin 提供了一个 chunks 的参数,可以接受一个数组,配置此参数仅会将数组中指定的 js 引入到 html 文件中
module.exports = {
plugins: [
new HtmlWebpackPlugin({
filename: 'index.html',
chunks: ['index'], // index.html 中仅引入了 index.js 文件
}),
new HtmlWebpackPlugin(
filename: 'login.html',
chunks: ['login'], // login.html 中仅引入了 login.js 文件
}),
],
}
clean-webpack-plugin
在每次构建前清理 /dist 文件夹,用于生产环境,因为生产环境会生成许多bundle文件,不及时清理的话每次都生成新的,导致文件夹比较大,打包前清理上一次生成的 bundle 文件是比较推荐的做法,因此只会生成用到的文件。
npm install clean-webpack-plugin --save-dev
const CleanWebpackPlugin = require('clean-webpack-plugin');
module.exports = {
// ...
plugins: [
new CleanWebpackPlugin({
// cleanStaleWebpackAssets 清除过时的网页包资产
cleanStaleWebpackAssets: false // 防止监听到改变时把没有改变的文件给清除了(当文件改变后不删除index.html文件)
})
],
};
webpack-manifest-plugin
能够对「模块映射到输出 bundle 的过程」保持追踪。可以将数据提取到一个 json 文件中;说白了就是生成一个manifest.json 默认文件名, 是一个文件清单, 内容是打包前文件对应打包后的文件名。
npm install webpack-manifest-plugin --save-dev
const { WebpackManifestPlugin } = require('webpack-manifest-plugin');
module.exports = {
// ...
plugins: [
new WebpackManifestPlugin() // 可以接受一个options 参数,默认在dist目录下生成 manifest.json
]
};
HotModuleReplacementPlugin(内置)
允许在运行时更新各种模块,而无需进行完全刷新。不适用于生产环境,意味着应当只在开发环境使用。启用HMR实际上就是更新 webpack-dev-server的配置,及使用 webpack 内置的 HMR 插件。
const webpack = require('webpack');
module.exports = {
plugins: [
new webpack.HotModuleReplacementPlugin(),
],
devServer: {
hot: true
},
};
webpack要完全启用HMR需要使用webpack.HotModuleReplacementPlugin。如果webpack或webpack-dev-server 通过命令行添加 --hot 选项启动,该插件会自动添加,因此不需要将它添加到webpack.config.js中
但是经实际使用 webpack-dev-server 时发现,在webpack.config.js中仅仅配置了devServer.hot:true,并未添加上述插件时仍然实现了HMR
原来 webpack-dev-server 内部自动帮我们完成了这个事情。通过在Github 的 webpack-dev-server 搜索,找到以下源码:
if (options.hot || options.hotOnly) {
config.plugins = config.plugins || [];
// 判断了配置的插件中是否包含名为HotModuleReplacementPlugin的插件,如果没有则添加。
if (
!config.plugins.find(
// Check for the name rather than the constructor reference in case
// there are multiple copies of webpack installed
(plugin) => plugin.constructor.name === 'HotModuleReplacementPlugin'
)
) {
config.plugins.push(new webpack.HotModuleReplacementPlugin());
}
}
mini-css-extract-plugin
抽离css样式到统一的文件中。因为目前学习的版本是webpack4,所以不能直接下载最新版本,需要指定较低的插件版本,否则打包时会报错
npm instasll mini-css-extract-plugin@1.6 -D
可以编写两个css文件,并在入口文件中引入,例如 index.js 中引入 require('index.css'),index.css 中引入 @import './style.css'
// index.js
console.log('index')
require('./index.css')
// index.css
@import './style.css';
.hello {
color: blueviolet;
}
// style.css
body{
background-color: pink;
}
配置文件中,配置css代码抽离目录,及loader配置,在规则中替换原来的style-loader,实际上 style-loader是将css样式插入到html中,该插件是创建一个link标签,将内容添加至link标签中。最后执行打包指令,就可以在出口目录中得到抽离后的css文件。
const MiniCssExtractPlugin = require('mini-css-extract-plugin'); // webpack4 对应版本1.6
module.exports = {
// ...
plugins: [
new MiniCssExtractPlugin({
filename:'main.css'
}),
],
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader']
},
{
test: /\.less$/,
use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader']
},
]
}
};
autoprefixer
自动给浏览器添加前缀,需要配合一个 postcss-loader 去使用(webpack4中使用需要执行版本), 在css-loader之前使用(放在css-loader之后,因为loader 的执行顺序是从右往左),此时在执行打包指令时,会报一个错,提示缺失postcss config文件,创建一个postcss.config.js文件
npm install postcss-loader@4.0 autoprefixer -D
// postcss.config.js
module.exports = {
plugins: [require('autoprefixer')] // 给css添加浏览器前缀
}
// webpack.config.js
module.exports = {
// ...
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader', 'postcss-loader']
},
]
}
};
执行打包指令后,发现生成的样式并未能自动添加浏览器前缀,此时还需要修改package.json有关浏览器的配置,之后在执行打包执行,即可发现已经添加前缀
// package.json
"browserslist": [
"defaults",
"not ie < 11",
"last 2 versions",
"> 1%",
"iOS 7",
"last 3 iOS versions"
]
optimize-css-assets-webpack-plugin
该插件用于压缩抽离的css文件。但是使用该插件以后将不能直接将打包后的 js 代码进行压缩,需要安装另一个插件完成js代码的压缩。下文介绍
npm install optimize-css-assets-webpack-plugin -D
const MiniCssExtractPlugin = require('mini-css-extract-plugin'); // webpack4 对应版本1.6
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin'); // webpack4 对应版本6.0
module.exports = {
// ...
optimization: {
minimizer: [
new OptimizeCssAssetsWebpackPlugin(), // 用了这个插件以后,会导致js代码无法压缩,需要使用UglifyJsPlugin插件,压缩js代码
]
},
plugins: [
new MiniCssExtractPlugin({
filename:'css/main.css'
}),
],
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader']
},
]
}
};
uglifyjs-webpack-plugin
用了optimize-css-assets-webpack-plugin插件压缩css后,会导致js代码无法压缩,需要使用UglifyJsPlugin插件,压缩js代码
npm install uglifyjs-webpack-plugin -D
const UglifyJsPlugin = require("uglifyjs-webpack-plugin") // webpack4 对应版本2.2
module.exports = {
// ...
optimization: {
minimizer: [
new UglifyJsPlugin({ // 压缩js代码
cache: true, // 缓存
parallel: true, // 并发打包
sourceMap: true // 源码映射
})
]
},
};
copy-webpack-plugin
用于拷贝文件的插件,官网显示的用法有很多,版本不同,用法参数各有不同,此处使用为webpack4,插件版本为5.x
npm install copy-webpack-plugin@5 -D
const CopyWebpackPlugin = require("copy-webpack-plugin") // webpack4 对应版本5.1
module.exports = {
// ...
plugins: [
new CopyWebpackPlugin([
{ from: './doc', to: './' } // 将开发相关文档,拷贝至打包文件目录
])
],
};
ProvidePlugin(内置)
提供插件 — 可以用来向每个模块注入变量,但不能通过通过window.$来访问,并未暴露给全局,仅在每个模块中使用
npm install jquery
const webpack = require('webpack');
module: {
// ...
plugins: [
new webpack.ProvidePlugin({
$:'jquery'
}),
],
}
BannerPlugin(内置)
版权声明插件。会给每个打包生成的js文件头部,插入版权声明信息
const webpack = require('webpack');
module: {
// ...
plugins: [
new webpack.BannerPlugin("make 2022 by echoyya ")
],
}
webpack4.15.1 学习笔记(九) — 11个基础的插件使用的更多相关文章
- Linux 学习笔记之超详细基础linux命令 Part 11
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 10---------------- ...
- 多线程学习笔记九之ThreadLocal
目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...
- ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - ROSMapModify - ROS地图修改
ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - 2 - MapModify地图修改 We can use gmapping model to genera ...
- MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九
<Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次 SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...
- python3.4学习笔记(九) Python GUI桌面应用开发工具选择
python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
- 《Think Python》第15章学习笔记
目录 <Think Python>第15章学习笔记 15.1 程序员定义的类型(Programmer-defined types) 15.2 属性(Attributes) 15.3 矩形( ...
- Linux学习笔记(11)linux网络管理与配置之一——配置路由与默认网关,双网卡绑定(5-6)
Linux学习笔记(11)linux网络管理与配置之一——配置路由与默认网关,双网卡绑定(5-6) 大纲目录 0.常用linux基础网络命令 1.配置主机名 2.配置网卡信息与IP地址 3.配置DNS ...
- SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序
SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序 快速开始 本指南将引导您完成创建“hello world”应用程序的过程,该应用程序在浏览器和服务器之间来回发送消 ...
- Flutter学习笔记(11)--文本组件、图标及按钮组件
如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 文本组件 文本组件(text)负责显示文本和定义显示样式,下表为text常见属性 Text组件属性及描述 属性名 类型 默认 ...
随机推荐
- 精准管控|AIRIOT数字油库智能化解决方案
在油库管理的过程中,储油罐区普遍存在分布空间范围广.安全防爆要求高.监控点多.布线复杂.自动化系统集成难度大等问题,传统的油库管理手段相对落后.管理环境复杂,企业在监测监控.设备设施管理.日常运行 ...
- 在唯一密钥属性“name”设置为“XXX”时,无法添加类型为“add”的重复集合项
我是在调试时,更改了项目url出现的问题,没有改端口号,只是改了"/"后面的地址 这个是我是改哈端口号就好了,改了端口号就重新建立虚拟目录了. 感觉是因为端口号没变,但项目url变 ...
- 一文详解编辑距离(Levenshtein Distance)
更多博文请关注:https://blog.bigcoder.cn 一. 什么是Levenshtein Distance Levenshtein Distance,一般称为编辑距离(Edit Dista ...
- Intel HDSLB 高性能四层负载均衡器 — 基本原理和部署配置
前言 在上一篇<Intel HDSLB 高性能四层负载均衡器 - 快速入门和应用场景>中,我们着重介绍了 HDSLB(High Density Scalable Load Balancer ...
- Linux运维面试总结
1.Linux系统相关日志 /var/log/message:系统信息日志,包含错误信息 /var/log/secure:系统登录日志 /var/log/maillog:邮件日志 /var/log/c ...
- WPF开发快速入门【6】下拉框与枚举类型
概述 本文讲述下拉框和枚举类型进行绑定的一些操作. 下拉框的基本操作 设计部分: <ComboBox ItemsSource="{Binding Fruits}" Selec ...
- .net core C# DataTable 和List之间相互转换的方法
一.List<T>/IEnumerable转换到DataTable/DataView 方法一: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 ...
- Flutter(三):Flutter App 可行性分析
一.生态建设 第三方Package https://pub.dev/packages?sort=popularity 截止2021年4月,第三方库达到17000+ 二.Devops 代码风格检查 An ...
- request to https://registry.npm.taobao.org/cnpm failed, reason: certificate has expired
换华为的,否则会出问题:cnpm confg set registry https://mirrors.huaweicloud.com/repository/npm/ npm ERR! code CE ...
- itest(爱测试) 开源接口测试,敏捷测试管理平台10.0.0GA 发布
一:itest work 简介 itest work 开源敏捷测试管理,包含极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock,还有压测 ,又有丰富的统计分析,8合1工作站.可按 ...