分享15个Webpack实用的插件!!!


Posted in Javascript onMarch 31, 2021

前言

初衷: 分享一下工作中实用的几个Plugin,希望对大家有些帮助。

html-webpack-plugin

用途: 将一个页面模板打包到dist目录下,默认都是自动引入js or css

安装

cnpm i html-webpack-plugin@3.2.0 -D

配置

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>首页</title>
</head>
<body>
    <div id="app"></div>
</body>
</html>

webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
    plugins: [
        new HtmlWebpackPlugin({
            template: './index.html',  // 以咱们本地的index.html文件为基础模板
            filename: "index.html",  // 输出到dist目录下的文件名称
        }),
    ]
}

HtmlWebpackPlugin接收一个对象,里面自行进行配置,详细参见这里

clean-webpack-plugin

用途: 用于每次打包dist目录删除

安装

cnpm i clean-webpack-plugin -D

配置

webpack.config.js

const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
    plugins: [
        new CleanWebpackPlugin()
    ]
}

extract-text-webpack-plugin

用途:css样式从js文件中提取出来最终合成一个css文件,该插件只支持webpack4之前的版本,如果你当前是webpack4及以上版本那么就会报错。

安装

cnpm i extract-text-webpack-plugin -D

配置

webpack.config.js

const extractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
    module: {
        rules: [
            {
                test: /\.css$/,
                use: extractTextPlugin.extract({
                    fallback: "style-loader", 
                    use: "css-loader"
                })
            }
        ]
    },
    plugins: [
        new extractTextPlugin({
            filename: "[name].css",
            allChunks: true
        })
    ]
}

上面配置中,extractTextPlugin.extract里面参数fallback是当提取不成功时,就执行style-loaderuse里面是提取时使用css-loader进行转换,plugins里面的配置filename是最后合并完的.css文件名称,当allChunksfalse时,只会提取初始化时的css文件,为true时会提取异步的css文件。

mini-css-extract-plugin

用途: 该插件与上面的exract-text-webpack-plugin的一样,都是将css样式提取出来, 唯一就是用法不同,本插件的webpack4版本之后推荐使用

安装

cnpm i mini-css-extract-plugin -D

配置

webpack.config.js

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                   MiniCssExtractPlugin.loader,
                   "css-loader"
                ]
            }
        ]
    },
    plugins: [
        new MiniCssExtractPlugin({
            filename: "css/[name].css",
            chunkFilename: "css/[name].css"
        })
    ]
}

上面配置中,可以看到用法与exract-text-webpack-plugin不同,来看一下它们的区别。

  1. loader配置没有fallback
  2. plugin中设置filename同步加载资源名称,还要指定异步加载css资源chunkFilename
  3. 该插件支持配置publicPath用来设置异步加载css的路径
  4. exract-text-webpack-plugin只会提取一个css文件,mini-css-extract-plugin会根据异步文件提取出来。

webpack.optimize.CommonsChunkPlugin

用途: 用于将页面里的公共代码提取出来,从而进行优化加载速度,该CommonsChunkPlugin只支持Webpack4之前。

安装

该插件是Webpack内置的,不需要安装。

配置

main.js

import Vue from "vue"

webpack.config.js

module.exports = {
    entry: {
        main: "./main.js",
        vendor: ["Vue"]
    },
    plugins: [
        new Webpack.optimize.CommonsChunkPlugin({
            name: "vendor",
            filename: "[name].js"
        }),
        new Webpack.optimize.CommonsChunkPlugin({
            name: "common",
            chunks: ["vendor"],
            filename: "[name].js"
        })
    ]
}

上面配置中,我们把main.js及它里面的依赖文件把Vue.js提取出来进行优化,避免每次打包或者每次访问其它页面都加载一个该js文件, 我们先是把Vue基础环境提取出来,因为基础环境它几乎不会改变,从而进行提取优化是必须的。再把Webpack运行时的代码也提取出来, 这样vendor就再次打包也不会变化,可以走浏览器缓存

optimization.SplitChunks

用途: 该功能与上面的webpack.optimize.CommonsChunkPlugin一样,只不过optimization.SplitChunkswebpack4之后推荐使用的

安装

内置的,不需要安装。

配置

main.js

import Vue from "vue"
console.log(Vue)
import("./news")

news.js

import Vue from "vue"
console.log(Vue)

webpack.config.js

module.exports = {
    mode: "development",
    entry: {
        main: "./main.js"
    },
    output: {
        filename: "[name].js",
        path: __dirname + "/dist"
    },
    optimization: {
        splitChunks: {
            chunks: "all"
        }
    },
}

上面配置中,splitChunkschunksall是对所有的chunk都生效,默认只对async异步有效。

splitChunks默认情况下也有自动提取,默认要求如下:

  • 被提取的模块来自node_module目录
  • 模块大于30kb
  • 按需加载时请求资源最大值小于等于5
  • 首次加载时并行请求最大值小于等于3

DefinePlugin

用途: 用于注入全局变量,一般用在环境变量上。

安装

无需安装,webpack内置

配置

webpack.config.js

const Webpack = require("webpack")
module.exports = {
    plugins: [
        new Webpack.DefinePlugin({
           STR: JSON.stringify("蛙人"),
           "process.env": JSON.stringify("dev"),
            name: "蛙人"
        })
    ]
}

上面配置中,DefinePlugin接收一个对象,里面的key值对应一个value值,这个value值是一个代码片段,可以看上面name那个,会报错 蛙人 is not defined这里需要注意,value值必须是一个变量或代码片段

ProvidePlugin

用途: 用于定义全局变量,如100个页面都引入vue,每个页面都引入只会增加工作量,直接在webpackProvide挂载一个变量就行,不用再去一一引入。

安装

无需安装,webpack内置

配置

webpack.config.js

const Webpack = require("webpack")
module.exports = {
    plugins: [
        new Webpack.ProvidePlugin({
            "Vue": ["vue", "default"] 
        })
    ]
}

上面配置中,ProvidePlugin接收一个对象,key值是使用的变量,value值第一个参数是Vue模块,第二个参数默认取Es Module.default的属性。import默认引入进来是一个 Es Module的对象,里面有default这个属性就是实体对象

hot-module-replacement-plugin

用途: 开启热模块更新

安装

无需安装,webpack内置

配置

webpack.config.js

const Webpack = require("webpack")
module.exports = {
    plugins: [
        new Webpack.HotModuleReplacementPlugin()
    ]
}

IgnorePlugin

用途: 用于过滤打包文件,减少打包体积大小。

安装

无需安装,webpack内置

配置

webpack.config.js

const Webpack = require("webpack")
module.exports = {
    plugins: [
        new Webpack.IgnorePlugin(/.\/lib/, /element-ui/)
    ]
}

uglifyjs-webpack-plugin

用途: 用于压缩js文件,针对webpack4版本以上。

安装

cnpm install uglifyjs-webpack-plugin -D

配置

webpack.config.js

const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
module.exports = {
	optimization: {
        minimizer: [
            new UglifyJsPlugin({
                test: /\.js(\?.*)?$/i,
                exclude: /node_modules/
            })
        ]
    }
}

copy-webpack-plugin

用途: 用于将文件拷贝到某个目录下

安装

cnpm i  copy-webpack-plugin@6.4.1 -D

配置

webpack.config.js

const CopyWebpackPlugin=require('copy-webpack-plugin');
module.exports = {
    plugins: [
        new CopyWebpackPlugin({
            patterns: [
                {
                    from: "./main.js",
                    to: __dirname + "/dist/js",
                    toType: "dir"
                }
            ]
        })
    ]
}

上面配置中,将main.js拷贝到dist目录下的js里,toType默认是file,也可以设置为dir,因为我这dist目录下没有js目录。

optimize-css-assets-webpack-plugin

用途: 用于压缩css样式

安装

cnpm i optimize-css-assets-webpack-plugin -D

配置

webpack.config.js

const OptimizeCssAssetsWebpackPlugin = require("optimize-css-assets-webpack-plugin")
module.exports = {
    plugins: [
        new OptimizeCssAssetsWebpackPlugin(),
    ]
}

imagemin-webpack-plugin

用途: 用于压缩图片

安装

cnpm i imagemin-webpack-plugin -D

配置

webpack.config.js

const ImageminPlugin =  require('imagemin-webpack-plugin').default
module.exports = {
    plugins: [
        new ImageminPlugin({
             test: /\.(jpe?g|png|gif|svg)$/i 
        })
    ]
}

friendly-errors-webpack-plugin

用途: 美化控制台,良好的提示错误,。我们不想自己的终端启动乱糟糟的,比如这样

分享15个Webpack实用的插件!!!

安装

cnpm i friendly-errors-webpack-plugin -D

配置

webpack.config.js

const FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin');
const devServer =  {
    publicPath: "/",
    port: 9527,
    host: "localhost",
    open: true,
    hotOnly: true,
    stats: 'errors-only'
}
module.exports = {
	plugins: [
		new FriendlyErrorsWebpackPlugin({
			compilationSuccessInfo: {
                notes: ['蛙人你好,系统正运行在http://localhost:' + devServer.port]
            },
            clearConsole: true,
		})
	],
	devServer
}

运行完上面代码。看如下结果

分享15个Webpack实用的插件!!!

 

Javascript 相关文章推荐
用JTrackBar实现的模拟苹果风格的滚动条
Aug 06 Javascript
强大的jquery插件jqeuryUI做网页对话框效果!简单
Apr 14 Javascript
用js判断页面是否加载完成实现代码
Dec 11 Javascript
JSON与XML优缺点对比分析
Jul 17 Javascript
JavaScript实现网页加载进度条代码超简单
Sep 21 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
Sep 26 Javascript
js基本算法:冒泡排序,二分查找的简单实例
Oct 08 Javascript
D3.js实现文本的换行详解
Oct 14 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
Dec 02 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
Jun 13 Javascript
总结js函数相关知识点
Feb 27 Javascript
微信小程序轮播图swiper代码详解
Dec 01 Javascript
JS继承最简单的理解方式
Mar 31 #Javascript
javaScript Array api梳理
Mar 31 #Javascript
抖音短视频(douyin)去水印工具的实现代码
Nest.js参数校验和自定义返回数据格式详解
Mar 29 #Javascript
Angular CLI发布路径的配置项浅析
Mar 29 #Javascript
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
You might like
香妃
2021/03/03 冲泡冲煮
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
PHP执行系统命令函数实例讲解
2021/03/03 PHP
JavaScript实用技巧(一)
2010/08/16 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
jquery制作LED 时钟特效
2015/02/01 Javascript
jquery+ajax实现注册实时验证实例详解
2015/12/08 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
详解JS正则replace的使用方法
2016/03/06 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
jQuery的层级查找方式分析
2016/06/16 Javascript
JavaScript基于自定义函数判断变量类型的实现方法
2016/11/23 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
讲解vue-router之命名路由和命名视图
2018/05/28 Javascript
使用layui实现树形结构的方法
2019/09/20 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
python psutil库安装教程
2018/03/19 Python
在python3.5中使用OpenCV的实例讲解
2018/04/02 Python
matplotlib jupyter notebook 图像可视化 plt show操作
2020/04/24 Python
Python Selenium模块安装使用教程详解
2020/07/09 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
pymysql模块使用简介与示例
2020/11/17 Python
国旗下的演讲稿
2014/05/08 职场文书
学校运动会霸气口号
2014/06/07 职场文书
团日活动总结报告
2014/06/25 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
2014年学生党支部工作总结
2014/12/20 职场文书
2015大学迎新晚会主持词
2015/07/16 职场文书
《称赞》教学反思
2016/02/17 职场文书
合作协议书格式范本
2016/03/21 职场文书
canvas实现贪食蛇的实践
2022/02/15 Javascript
使用Ajax实现无刷新上传文件
2022/04/12 Javascript