# plugin
# 概念
Plugin 是一种计算机应用程序,它和主应用程序互相交互,以提供特定的功能
webpack 的 plugin 赋予各种灵活的功能(打包优化,资源管理, 环境变量注入等),它们会运行在 webpack 的 不同阶段(钩子、生命周期),贯穿整个 webpack 编译周期
# 配置方式
- 一般情况,通过配置文件导出对象中 plugins 属性传入 new 实例对象
const HtmlWebpackPlugin = require('html-webpack-plugin') // 通过 npm 安装
const webpack = require('webpack') // 访问内置的插件
module.exports = {
// ...
plugins: [
new webpack.ProcessPlugin(),
new HtmlWebpackPlugin({
template: './src/index.html'
})
]
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 特性
本质是一个具有 apply 方法的 js 对象
apply 方法会被 webpack compiler 调用,并且在整个生命周期都可以访问 compiler 对象
const pluginName = 'ConsoleLogOnBuildWebpackPlugin';
class ConsoleLogOnBuildWebpackPlugin {
apply(compiler) {
compiler.hooks.run.tap(pluginName, (compilation) => {
console.log('webpack 构建过程开始!');
});
}
}
module.exports = ConsoleLogOnBuildWebpackPlugin;
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 常见的 Plugin
# HtmlWebpackPlugin
- 打包结束后,自动生成一个 html 文件,并把打包生成的 js 模块引入到该 html 中
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
// ...
plugins: [
new HtmlWebpackPlugin({
title: 'App',
filename: 'index.html',
template: './src/index.html'
})
]
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<!--./src/index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title><%=htmlWebpackPlugin.options.title%></title>
</head>
<body>
<h1>html-webpack-plugin</h1>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
- 更多配置
参考1 (opens new window)
参考2 (opens new window)
属性名 | 说明 |
---|---|
title | 网页 document.title 的配置, 在index.html 文件中可以使用 <%= htmlWebpackPlugin.options.title %> 设置网页标题为这里设置的值。 |
filename | html 文件生成的名称,可以使用 assets/index.html 来指定生成的文件目录和文件名, 重点1:生成文件的跟路径为ouput.path的目录。 重点2: ‘assets/index.html’ 和 ./assets/index.html 这两种方式的效果时一样的, 都是在 output.path 目录下生成 assets/index.html |
template | 生成 filename 文件的模版, 如果存在 src/index.ejs, 那么默认将会使用这个文件作为模版。 重点:与 filename 的路径不同, 当匹配模版路径的时候将会从项目的跟路径开始 |
# clean-webpack-plugin
- 删除构建文件
# mini-css-extract-plugin
- 提取 css 到单独文件中
plugins: [
new MiniCssExtractPlugin({
filename: '[name].css'
})
]
1
2
3
4
5
2
3
4
5
# DefinePlugin
- 允许在编译时创建配置的全局变量,是 webpack 内置的插件,不需要安装
plugins: [
new webpack.DefinePlugin({
PRODUCTION: JSON.stringify(true),
VERSION: JSON.stringify("5fa3b9"),
BROWSER_SUPPORTS_HTML5: true, // 如果这个值不是字符串,它会被转化为字符串(包括函数)
TWO: "1+1", // 2 如果这个值是一个字符串,它会被当作一个代码片段来使用
"typeof window": JSON.stringify("object"), // 如果在一个 key 前面加了 typeof,它会被定义为 typeof 调用 , 获取的值 是 object 而不是 Xmind 会与 typeof 操作符冲突貌似
NAME: '"hello"',
CONFIG: JSON.stringify({ name: 'hello' }), // 如果这个值是一个对象,它所有的 key 会被同样的方式定义。
})
]
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# copy-webpack-plugin
复制文件或目录到执行区域,如 vue 打包过程,放在 public 下的文件会被复制到 dist 文件夹下
new CopyWebpackPlugin([patterns], options)
module.exports = {
// ...
plugins: [
new CopyWebpackPlugin([
{
from: '', // 要拷贝的源文件
to: '', // 目标文件夹
toType: '', // file or dir
ignore: ['.*'], // 忽略的文件
}
])
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13