webpack插件解析:HtmlWebpackPlugin是干什么的以及如何使用它
HtmlWebpackPlugin是一个出现频率比较高的webpack插件,本文对其作用和配置作一番比较详细的分析(本文的配置均在webpack.config.js中进行)。
为何使用它
简单来说,HtmlWebpackPlugin是用于生成html文件。我们的疑问可能在于,webpack本身不能生成html文件吗?事实上,默认的webpack主要是用于处理js文件的依赖图构建和打包,当需要生成html文件时,便需要使HtmlWebpackPlugin插件。
如何安装
作为开发依赖安装即可:
npm install --save-dev html-webpack-plugin
如何在webpack.config.js中配置该插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
...
plugins: [new HtmlWebpackPlugin()]
};
以上配置中,首先使用了require引入插件,首字母开头表明是一个构造函数,而后使用new语句创建一个实例,并将其作为webpackConfig的plugins选项的一个数组成员,这样表示webpack打包时将使用HtmlWebpackPlugin插件。
这里没有做HtmlWebpackPlugin的任何额外配置,实际上它的默认配置将会生效。
默认配置是如何工作的
在以上配置中,HtmlWebpackPlugin就已经会生效,只不过是应用的默认配置。默认配置如下:
- 默认配置会在
出口目录中(通过output.path选项配置)生成一个index.html文件; - 生成的index.html文件将会以script标签的形式引入每一个输出js文件(
通过output.filename选项配置)。
现在我们把其他基本配置补充完整:
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
mode:'development',
entry:{
app:path.resolve(__dirname,'./index.js'),
test:path.resolve(__dirname,'./test.js')
},
output:{
path: path.resolve(__dirname,'./dist'),
filename:'[name]_bundle.js'
},
plugins:[new HtmlWebpackPlugin()]
}
以上配置中,先抛开HtmlWebpackPlugin来分析打包结果:由于项目中存在两个入口,出口(输出文件)使用了占位符,因此结果是在dist目录下生成两个js文件即app_bundle.js和test_bundle.js两个文件。
根据上面所述的默认配置,那么除此之外,还会在dist目录下生成一个index.html文件,它以script标签的形式引入app_bundle.js和test_bundle.js,即:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Webpack App</title>
</head>
<body>
<script type="text/javascript" src="app_bundle.js"></script>
<script type="text/javascript" src="test_bundle.js"></script>
</body>
</html>
修改默认配置
假如想要修改默认配置,只需要在在实例化HtmlWebpackPlugin的对象时,传入一个配置对象即可,如:
const htmlPlugin = new HtmlWebpackPlugin({
template:path.join(__dirname,'./public/index.html'),
filename: 'index.html'
});
module.exports = {
...
plugins: [new HtmlWebpackPlugin()]
};
常见应用:在内存中生成index.html文件
以上案例中,我们实现了生成物理的index.html文件,即在项目的dist目录下,是可以看见index.html的。有另外一种常见情况,即我们需要在内存中生成index.html文件,这时内存中的index.html中是在资源管理器中看不到的。我们何时会有这样的奇怪需求呢?
试想这样的应用场景:
我们的项目中需要实时预览效果,需要启动一个本地服务器,例如需要通过
http://localhost:8080这样的方式访问index.html文件。显然我们对项目做的每一个更改,webpack都会重新打包,并反映到index.html文件中去。
这听起来是完全可行的,问题在于:
- webpack打包时读写
磁盘去生成目标文件,由于物理磁盘读写速度非常有限,很可能导致预览滞后。
因此我们可以生成一个内存中的index.html文件用于浏览器实时预览,由于内存读写速度明显快于物理磁盘,因此实时预览也更加及时。
如何实现呢?
- 我们只需要安装webpack-dev-server,并启动一个服务即可。这时HtmlWebpackPlugin将
在内存中生成html文件,而不是在出口目录中。 - 使用 webpack-dev-server后,
出口目录中的js文件同时会在内存中生成,并被内存中的index.html文件引入。
限于篇幅,这里不再赘述webpack-dev-server的作用机制及配置方法。
webpack插件解析:HtmlWebpackPlugin是干什么的以及如何使用它的更多相关文章
- webpack插件之htmlWebpackPlugin
webpack插件之htmlWebpackPlugin webpack插件 自动化 htmlWebpackPlugin 由于webpack已经帮我们处理好js之间的依赖关系,现在我们可以忽略js的加 ...
- webpack插件之html-webpack-plugin
官方文档:https://www.npmjs.com/package/html-webpack-plugin html-webpack-plugin 插件专门为由webpack打包后的js提供一个载体 ...
- webpack 插件: html-webpack-plugin
插件地址:https://www.npmjs.com/package/html-webpack-plugin 这个插件用来简化创建服务于 webpack bundle 的 HTML 文件,尤其是对于在 ...
- 【webpack插件使用】在开发中快速掌握并使用Webpack构建web应用程序
1.webpack-dev-server插件的基本使用 入门程序 const path = require('path'); // 导出一个Webpack的配置对象(通过node中的模块操作,向外暴露 ...
- 从0开始编写webpack插件
1. 前言 插件(plugins)是webpack中的一等功臣.正是由于有了诸多插件的存在,才使得webpack无所不能.在webpack源码中也是使用了大量的内部插件,插件要是用的好,可以让你的工作 ...
- 【Web】阿里icon图标webpack插件(webpack-qc-iconfont-plugin)详解
webpack-qc-iconfont-plugin webpack-qc-iconfont-plugin是一个webpack插件,可以轻松地帮你将阿里icon的图标项目下载至本地 开发初衷 之前已经 ...
- webpack 插件拾趣 (1) —— webpack-dev-server
结束了一季的忙碌,我这封笔已久的博客也终究该从春困的咒印中复苏,想来写些实用易读的作为开篇,自然是最好不过. 新开个 webpack 插件/工具介绍的文章系列,约莫每周更新一篇篇幅适中的文章聊以共勉, ...
- webpack模块解析
前面的话 在web存在多种支持JavaScript模块化的工具(如requirejs和r.js),这些工具各有优势和限制.webpack基于从这些系统获得的经验教训,并将模块的概念应用于项目中的任何文 ...
- 探寻 webpack 插件机制
webpack 可谓是让人欣喜又让人忧,功能强大但需要一定的学习成本.在探寻 webpack 插件机制前,首先需要了解一件有意思的事情,webpack 插件机制是整个 webpack 工具的骨架,而 ...
随机推荐
- JDBC下Date类型转换问题
一.前言 在学过MVC后,其中的DAO层是负责与数据库进行进行数据交互,而service层个servlet层需要数据时,不允许直接向数据库要,而是通过Dao层来获取相关数据.这个时候,就引出一个规定& ...
- findbugs过滤R.java文件
在第一次使用findbugs时检查出100多个Bad pratice,仔细一看原来全是R文件里面的类名首字母没有大写导致的. 于是只有自己在findbugs设置界面中添加过滤条件来忽略掉R文件. 在F ...
- 汇编刷题:屏幕显示 HOW ARE YOU!
DATA SEGMENT INFO DB 'HOW ARE YOU!$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DAT ...
- Linux(Fedora)系统下配制8086汇编环境
1.到www,nasm.us下载nasm 2.解压并安装nasm #tar -xzvf nasm-2.11.08.tar.gz #cd nasm-2.11.08 #./configure #make ...
- scp 使用方法
scp就是secure copy,一个在linux下用来进行远程拷贝文件的命令.有时我们需要获得远程服务器上的某个文件,该服务器既没有配置ftp服务器,也没有做共享,无法通过常规途径获得文件时,只需要 ...
- .Net微服务实战之技术架构分层篇
一拍即合 上一篇<.Net微服务实战之技术选型篇>,从技术选型角度讲解了微服务实施的中间件的选择与协作,工欲善其事,必先利其器,中间件的选择是作为微服务的基础与开始,也希望给一直想在.Ne ...
- Struts2-学习笔记系列(15)-ajax支持和JSON
7.1stream类型的result 使用stream就无需jsp页面,直接在action想浏览者生成指定的响应 @Override public java.lang.String execute() ...
- springIoc中的单列对象的分析
最近有个同事去面试,其中有一个问题是关于spring单例的.本篇博文就发表一下小编我自己的理解~~. 使用过spring的程序猿应该都知道,我们的bean(controller.service和Dao ...
- 【半监督学习】MixMatch、UDA、ReMixMatch、FixMatch
半监督学习(Semi-Supervised Learning,SSL)的 SOTA 一次次被 Google 刷新,从 MixMatch 开始,到同期的 UDA.ReMixMatch,再到 2020 年 ...
- unity使用Animator做一个简单的动画
1.在unity的物体上添加Animator组件 2.在Project下的Assets下添加Animator Controller 3.在Animator Controller添加动作 4.在动作之间 ...