webpack 内置插件
所有的 webpack 内置插件都作为 webpack 的静态属性存在的,使用下面的方式即可创建一个插件对象
js
const webpack = require("webpack");
new webpack.插件名(options);
DefinePlugin
全局常量定义插件,一般用于公司中定义的一些需要全局使用的东西。
使用该插件通常定义一些常量值,例如:
js
//写在plugins配置项中
new webpack.DefinePlugin({
PI: `Math.PI`, // PI = Math.PI
VERSION: `"1.0.0"`, // VERSION = "1.0.0"
DOMAIN: JSON.stringify("duyi.com"),
});
这样一来,在源码中,我们可以直接使用插件中提供的常量,当 webpack 编译完成后,会自动替换为常量的值
例子
webpack.config.js
js
const webpack = require("webpack");
module.exports = {
mode: "development",
devtool: "source-map",
plugins: [
/**定义全局常量
* 定义好之后可以在代码中使用,在AST抽象语法树分析的时候,会将这些替换。
* 字符串的键就是常量名,字符串的值就是常量值。(不是字符串本身哦)
*/
new webpack.DefinePlugin({
PI: `Math.PI`, //const PI=Math.PI
VERSION: `'v1.1.0'`, //const VERSION='v1.1.0'
AUTHOR: JSON.stringify("Yan"),
}),
],
};
index.js
js
console.log(PI);
console.log(VERSION);
console.log(AUTHOR);
//编译后
console.log(Math.PI);
console.log("v1.1.0");
console.log("Yan");
BannerPlugin
它可以为每个 chunk 生成的文件头部添加一行注释,一般用于添加作者、公司、版权等信息。
js
new webpack.BannerPlugin({
banner: `
hash:[hash]
chunkhash:[chunkhash]
name:[name]
author:yuanjin
corporation:duyi
`,
});
例子
webpack.config.js
js
const webpack = require("webpack");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
module.exports = {
mode: "development",
devtool: "source-map",
plugins: [
/**给每个chunk加上横幅 */
new webpack.BannerPlugin({
banner: `
hash:[hash]
chunkhash:[chunkhash]
name:[name]
author:yuanjin
corporation:duyi
`,
}),
new CleanWebpackPlugin(),
],
};
编译后的 main.js
js
/*!
*
* hash:02edab8cc09531612656
* chunkhash:1aeb31f1b555a617e8ef
* name:main
* author:yuanjin
* corporation:duyi
*
*/
xxxxxx;
xxx;
ProvidePlugin
自动加载模块,而不必到处 import 或 require
js
new webpack.ProvidePlugin({
$: "jquery",
_: "lodash",
});
然后在我们任意源码中:
js
$("#item"); // <= 起作用
_.drop([1, 2, 3], 2); // <= 起作用 将数组中的前两个丢掉
例子
js
const webpack = require("webpack");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
mode: "development",
devtool: "source-map",
//
plugins: [
/**自动加载,不必再经常的使用import和require了 */
new webpack.ProvidePlugin({
$: "jquery",
_: "lodash",
}),
new CleanWebpackPlugin(),
new HtmlWebpackPlugin(),
],
};
index.js
js
//不引入的使用jquery
$("<div>").text("你好").appendTo("body");
//使用lodash
console.log(_.cloneDeep({ a: 1, b: 2 }));
编译后的结果 main.js
js
"./src/index.js": function (module, exports, __webpack_require__) {
(function ($, _) {
//不引入的使用jquery
$("<div>").text("你好").appendTo("body");
//使用lodash
console.log(_.cloneDeep({ a: 1, b: 2 }));
}).call(
this,
__webpack_require__(
/*! jquery */ "./node_modules/.pnpm/jquery@3.7.1/node_modules/jquery/dist/jquery.js"
),
__webpack_require__(
/*! lodash */ "./node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/lodash.js"
)
);
},
编译结果分析
js
/*我们最开始期待的index.js模块打包之后的样子*/
{
"index.js":function(module, exports, __webpack_require__){
// xxx
}
}
/*实际上打包出的模板
在index.js的内部又建立了一个自执行函数,然后使用call方法将jquery和lodash传入
这样很巧妙的避免了全局变量的污染
*/
{
"index.js":function(module, exports, __webpack_require__){
(function($, _){
//xxxindex.js的代码
}).call(this,__webpack_require__("jquery"),__webpack_require__("lodash"))
}
}