一. 认识插件Plugin
Webpack
的另一个核心是Plugin
,官方有这样一段对Plugin
的描述:- While loaders are used to transform certain types of modules, plugins can be leveraged to perform a wider range of tasks like bundle optimization, asset management and injection of environment variables.
- 上面表达的含义翻译过来就是:
Loader
是用于特定的模块类型进行转换Plugin
可以用于执行更加广泛的任务,比如打包优化、资源管理、环境变量注入等
二. CleanWebpackPlugin
前面我们演示的过程中,每次修改了一些配置,重新打包时,都需要手动删除
dist
文件夹**:**- 我们可以借助于一个插件来帮助我们完成,这个插件就是
CleanWebpackPlugin
- 我们可以借助于一个插件来帮助我们完成,这个插件就是
首先,我们先安装这个插件:
jsnpm i clean-webpack-plugin -D
之后在
webpack.config.js
中中配置:jsconst { CleanWebpackPlugin } = require('clean-webpack-plugin') // 自动生成了 const path = require('path') module.exports = { plugins: [ new CleanWebpackPlugin() // 这里写,上面会自动生成,也可能是咱装的vscode插件的功能吧,反正就记录一下吧 ] }
目前
webpack
官网中已经看不到CleanWebpackPlugin
插件了,可以在npm
官网中查看,所以可以在output
中配置clean
属性,在生成文件之前清空output
目录jsmodule.exports = { //... output: { clean: true, // 在生成文件之前清空 output 目录 } }
三. HtmlWebpackPlugin
1.HtmlWebpackPlugin
另外还有一个不太规范的地方:
- 我们的
HTML
文件是编写在根目录下的,而最终打包的dist
文件夹中是没有index.html
文件的 - 在进行项目部署的时,必然也是需要有对应的入口文件
index.html
- 所以我们也需要对
index.html
进行打包处理
- 我们的
对
HTML
进行打包处理我们可以使用另外一个插件:HtmlWebpackPlugin
- 会自动在输出文件夹下生成一个
index.html
,同时自动将bundle.js
使用defer
属性引入进index.html
中
jsnpm install html-webpack-plugin -D
- 会自动在输出文件夹下生成一个
webpack.config.js
中的配置:jsconst HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { plugins: [ new HtmlWebpackPlugin({ title: '电商项目' }) ] }
2.生成index.html
分析
我们会发现,现在自动在
dist
文件夹中,生成了一个index.html
的文件:- 该文件中也自动添加了我们打包的
bundle.js
文件
- 该文件中也自动添加了我们打包的
这个文件是如何生成的呢?
- 默认情况下是根据
ejs
的一个模板来生成的 - 在
html-webpack-plugin
的源码中,有一个default_index.ejs
模块
- 默认情况下是根据
3.自定义HTML
模板
如果我们想在自己的模块中加入一些比较特别的内容:
- 比如添加一个
noscript
标签,在用户的js
被关闭(禁止使用js
)时,给予响应的提示 - 比如在开发
vue
或者react
项目时,我们需要一个可以挂载后续组件的根标签<div id="app"></div>
- 比如添加一个
这个我们需要一个属于自己的
index.html
模块:
4.自定义模板数据填充
上面的代码中,会有一些类似这样的语法
<% 变量 %>
,这个是EJS
模块填充数据的方式在配置
HtmlWebpackPlugin
时,我们可以添加如下配置:template
:指定我们要使用的模块所在的路径title
:在进行htmlWebpackPlugin.options.title
读取时,就会读到该信息
jsconst HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { plugins: [ new HtmlWebpackPlugin({ title: '电商项目', template: './src/index.html' }) ] }
四. DefinePlugin
1. DefinePlugin的介绍
但是,这个时候编译还是会报错,因为在我们的模块中还使用到一个
BASE_URL
的常量:这是因为在编译
template
模块时,有一个BASE_URL
:<link rel="icon" href="<%= BASE_URL %>favicon.ico">
- 但是我们并没有设置过这个常量值,所以会出现没有定义的错误
这个时候我们可以使用
DefinePlugin
插件
2. DefinePlugin的使用
DefinePlugin
允许在编译时创建配置的全局常量,是一个webpack
内置插件(不需要单独安装):jsconst { DefinePlugin } = require('webpack') plugins: [ new DefinePlugin({ // 默认情况下有注入一个变量(process.env.NODE_ENV),用来判断当前环境是生产环境还是开发环境 BASE_URL: '"./"', // 外层引号里面的值("./")会被当成js代码执行,相当于通过eval的方式执行,将执行的结果作为这里的值,所以需要在里面再添加引号,这样就会被解析为字符串了 later: "'later'" // later加引号不加引号都行,就是js里的对象的key // DefinePlugin注入的变量当前项目的其他位置都可以使用 }) ]
这个时候,编译
template
就可以正确的编译了,会读取到BASE_URL
的值注意:
- 默认情况下有注入一个变量(
process.env.NODE_ENV
),用来判断当前环境是生产环境还是开发环境 - 外层引号里面的值(
"./"
)会被当成js
代码执行,相当于通过eval
的方式执行,将执行的结果作为这里的值,所以需要在里面再添加引号,这样就会被解析为字符串了 DefinePlugin
注入的变量当前项目的其他位置都可以使用
- 默认情况下有注入一个变量(
五. mode
模式配置
1.Mode
配置
前面我们一直没有讲
mode
Mode
配置选项,可以告知webpack
使用相应模式的内置优化:- 默认值是
production
(什么都不设置的情况下) - 可选值有:
'none'
|'development'
|'production'
jsmodule.exports = { mode: 'development' // 设置为生成环境,会自动检查包的大小,如果包过大,会自动提出建议你限制包的大小,通过import()函数限制 }
- 默认值是
这几个选项有什么样的区别呢?
2.Mode
配置代表更多
- 设置对应的
mode
值,相当于给webpack
设置了很多的配置: