Webpack 4.X 从入门到精通 - plugin(二)

通过上一篇文章,我们明白了webpack的两个配置参数入口与出口,webpack会找到入口文件的地址,进去后一顿蹂躏,再通过你给的输出地址就把编译后的文件给你了。这篇文章接着去丰富webpack.config.js的内容,说一个参数叫plugins

plugins

plugins里面放的是插件,在webpack里有各式各样的插件能够帮你完成任何构建的事情。只有你想不到的,没有它做不到的。并且全世界的小伙伴们都在给webpack贡献开源的插件,所以插件的种类是非常丰富的。

插件能做什么

插件的作用在于提高开发效率,能够解放双手,让我们去做更多有意义的事情。一些很low的事就统统交给插件去完成。比如在上一篇文章里讲到当webpack编译打包后,我们需要新建一个index.thml,以及在页面里通过script标签去引入生成的js文件,那这些傻瓜式的,浪费精力的事情就应该交给插件自动完成,这就是所谓的自动化。我们只需要关注功能如何实现、去做一些有意义的事件即可。

插件的难点不在于plugins参数如何去用,而在于插件本身如何去用。因为每个插件的功能不一样,所需的配置参数也不同。要用这个插件需要按它的要求来写参数,所以没有一套统一的规格,这就要求大家善于去看插件的API,通过webpack官网或者github都能找到插件说明。

html-webpack-plugin

下面就以这个html-webpack-plugin插件为例,给大家演示插件的用法。这个插件的作用是用来自动生成html页面,既可以生成单个页面又可以生成多个页面,并且在生成前你可以给它一堆的配置,它会按照你想要的生成方式去生成页面。

小试牛刀

第一步:安装

npm i html-webpack-plugin -D

第二步:在webpack.config.js里引入模块

const HtmlWebpackPlugin=require(‘html-webpack-plugin‘);

第三步:在pluginsnew一个

plugins:[
    new HtmlWebpackPlugin()
]

此时webpack.config.js的内容如下:

const path=require(‘path‘);
const HtmlWebpackPlugin=require(‘html-webpack-plugin‘);

module.exports={
    entry:{
        one:‘./src/1.js‘,
        two:‘./src/2.js‘
    },
    output:{
        path:path.resolve(__dirname,‘dist‘),
        filename:‘[name].bundle.js‘
    },
    plugins:[
        new HtmlWebpackPlugin()
    ]
}   

1.js的内容如下:

console.log(‘这是第一个入口文件‘);

2.js的内容如下

console.log(‘这是第二个入口文件!‘);

第四步:在终端里执行命令webpack,如果不出意外的话是下面这样:

这个就代表已经成功了,在项目目录里会自动生成一个dist目录,里面包含一个index.html及一个one.bundle.js和一个two.bundle.js。打开index.html的源码,你能看到已经自动添加了两个script标签分别引入了两个js文件。

锋芒必露

接着要演示html-webpack-plugin的配置参数,加上这些参数后,页面就会变得酸爽动人!
1、创建模板
src目录下创建一个template.html做为模板文件,代码如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <!--这是个模板文件,title里的语法是为了能解析配置参数里title对应的值-->
        <title><%= htmlWebpackPlugin.options.title %></title>
    </head>
    <body>
        <div id="box">这是自带的div</div>
    </body>
</html>

2、修改配置文件
webpack.config.js里修改plugins如下:

plugins:[
    new HtmlWebpackPlugin({
        title:‘陈学辉‘,    /*这个值对应html里的title*/
        template:‘./src/template.html‘, //模板文件地址
        filename:‘test1.html‘,  //文件名,默认为index.html(路径相对于output.path的值)
        inject:true,    //script标签的位置,true/body为在</body>标签前,head为在<head>里,false表示页面不引入js文件
        hash:true,  //是否为引入的js文件添加hash值
        chunks:[‘one‘], //页面里要引入的js文件,值对应的是entry里的key。省略参数会把entry里所有文件都引入
        //excludeChunks:[‘one‘],//页面里不能引入的js文件,与chunks刚好相反
        minify:{    //html-webpack-plugin内部集成了html-minifier
            collapseWhitespace:true,    //压缩空格
            removeAttributeQuotes:true, //移除引号
            removeComments:true,        //移除注释
        },
    }),
    //生成两个文件,分别引入两个js文件(现在是一个文件里引入了两个js)
    new HtmlWebpackPlugin({
        title:‘kaivon‘,
        template:‘./src/template.html‘,
        hash:true,
        filename:‘test2.html‘,
        chunks:[‘two‘]
    })
]

删掉dist目录,并在终端再次执行webpack命令。此时会在项目的根目录下生成一个dist文件,目录如下:

此时以test1.html为例打开源码,应该是下面这个样子

关于html-webpack-plugin插件的其它配置参数请参考:https://github.com/jantimon/html-webpack-plugin

clean-webpack-plugin

在用HtmlWebpackPlugin的时候时需要把dist目录删掉再去看生成的文件,这个也属于傻瓜式的操作,clean-webpack-plugin这个插件就可以做这件事情

第一步:安装

npm i clean-webpack-plugin -D

第二步:在webpack.config.js里引入模块

const CleanWebpackPlugin=require(‘clean-webpack-plugin‘);

第三步:在plugins最上面 new一个

plugins:[
    new CleanWebpackPlugin([‘./dist‘]),  //这个一定要放在最上面,作用是先删除dist目录再创建新的dist目录。里面的参数为要删除的目录,放在一个数组里面
    ...
]

在文件夹里打开dist所在的目录,并在终端里再次执行命令webpack后,会看到dist目录先被删除后又被创建。
关于clean-webpack-plugin插件的所有配置参数请参考:https://github.com/johnagan/clean-webpack-plugin

资料下载

下一篇:Webpack 4.X 从入门到精通 - devServer(三)

原文地址:http://blog.51cto.com/13258913/2153286

时间: 2024-10-30 05:24:10

Webpack 4.X 从入门到精通 - plugin(二)的相关文章

Webpack 4.X 从入门到精通 - devServer与mode(三)

上一篇文章里详细介绍了一下插件的用法,这一篇文章接着丰富module.exports里的属性.如今的前端发展已经非常迅速了,伴随而来的是开发模式的转变.现在已经不再是写个静态页面并放在浏览器里打开预览一下了.在实际的开发中会经常需要使用http服务器,比如之前的ajax,想要看到效果就必需搭建一个服务器.搭建服务器的方式有非常的多,而webpack则原生的提供服务器的支持,大家无需再去下载软件.同时它还提供了自动刷新.热更新等功能,使开发变得非常方便. devServer 安装使用 npm i

Microsoft.AspNetCore.Authentication.Cookies从入门到精通 (二)

目录 Microsoft.AspNetCore.Authentication.Cookies从入门到精通 (二) Cookie加密 Cookie伪加密(序列化/反序列化) 减少Cookie中Value的大小 自定义Cookie管理功能 总结 未完待续...... Microsoft.AspNetCore.Authentication.Cookies从入门到精通 (二) ? 上篇文章我们介绍了Microsoft.AspNetCore.Authentication.Cookies的部分内容,由于篇幅

ActiveMQ从入门到精通(二)

接上一篇<ActiveMQ从入门到精通(一)>,本篇主要讨论的话题是:消息的顺序消费.JMS Selectors.消息的同步/异步接受方式.Message.P2P/PubSub.持久化订阅.持久化消息到MySQL以及与Spring整合等知识. 消息的顺序消费 在上一篇文章中,我们已经明确知道了ActiveMQ并不能保证消费的顺序性,即便我们使用了消息优先级.而在实际开发中,有些场景又是需要对消息进行顺序消费的,比如:用户从下单.到支付.再到发货等.如果使用ActiveMQ该如何保证消费的顺序性

利用MAT分析JVM内存问题,从入门到精通(二)

上一篇文章MAT入门到精通(一)介绍了MAT的使用场景和基本概念,这篇文章开始介绍MAT的基本功能,后面还有两篇,一篇是MAT的高级功能,另一篇是MAT实战案例分析. 三.欢迎页 使用MAT打开一个heap dump文件,解析完成后,默认会进入欢迎页,欢迎页里包含了一些常见的分析:最大内存占用分析.常见的分析动作.常用的分析报告.MAT使用教程等等. 我们看下下面这张图,可以看出MAT的主要结构和功能: inspector:透视图,用于展示一个对象的详细信息,例如内存地址.加载器名称.包名.对象

MyBatis从入门到精通(十二):使用collection标签实现嵌套查询

最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解使用collection标签实现嵌套查询的方法. 1. 需求升级 在上篇博客中,我们实现了需求:根据用户id查询用户信息的同时获取用户拥有的角色. 因为角色可以拥有多个权限,所以本篇博客我们升级需求为:根据用户id查询用户信息的同时获取用户拥有的角色以及角色包含的权限. 2. 实现方式 因为我们需要使用到权限表的映射,所以我们需要

webpack -&gt; vue Component 从入门到放弃(二)

Foreword 上一篇简单介绍了webpack的打包功能,应该说是比较无意义的打包,对于开发人员来说,这种效率是非常低的.所以我们来点升华. First Step 我们给第一篇例子中加个样式文件我们 style.css body { background: yellow; } 然后修改 entry.js require("!style-loader!css-loader!./style.css") // 载入 style.css document.getElementById('ap

Webpack 4.X 从入门到精通 - 第三方库(六)

在开发的时候会时常用到第三方的库或者框架,比如耳熟能详的jquery.借助它们能提高开发效率,但是如何在webpack中使用呢.这篇文章介绍两个东西,如何使用第三方库以及如何提取第三方库. 使用第三方库 1.在入口文件当中直接导入 安装jQuery npm i jquery -S 目录结构如图: package.json内容如下: { "name": "webpack-demo", "version": "1.0.0", &q

Flask从入门到精通(二)

一.程序上下文 Flask接收到来自客户端的请求后,路由到指定的接口进行响应处理并返回处理结果.响应接口需要知道客户端的请求体,即request对象才能进行正确的处理.如果给每个接口函数都传递一个request对象参数,太过冗余,且代码会很难看,因此Flask使用上下文临时将某些对象编程线程内的全局变量,即在同一个线程内,上下文信息可全局共享,且不会干扰到其他的线程环境. Flask有两种上下文,分别为程序上下文和请求上下文,各自对应的全局变量如下表: 变量名 上下文 备注 current_ap

ado.net 从入门到精通(二)DataTable与xml

把datatable保存为xml,再读取xml转化为datatable DataTable dt = new DataTable("dt", "http://baidu.com"); dt.Prefix = "xs";//前缀 dt.Columns.Add("id"); dt.Columns.Add("name"); DataRow dr = dt.NewRow(); dr["id"]