webpack常用插件:
babel:
1、babel-loader
作用:把用最新标准编写的 JavaScript 代码向下编译成可以在今天随处可用的版本。 这一过程叫做“源码到源码”编译, 也被称为转换编译。
使用:
.babelrc
{
"presets": [],
"plugins": []
}
2、babel-preset-env
作用:如果使用babel-preset-es2015,es2016,es2017包含了过多在某些情况下不需要的功能。但使用babel-preset-env, 我们可以声明环境, 然后该preset就会只编译包含我们所声明环境缺少的特性的代码,因此也是比较推荐的方式。
使用:
.babelrc
{
"presets": [
[
"env",
{
"targets": {
"browsers": ["last 2 versions", "ie >= 7"]
}
}
]
]
}
3、babel-core
作用:把 js 代码分析成 ast(虚拟语法树) ,方便各个插件分析语法进行相应的处理。
使用:开箱即用,babel的外围组件。
4、style-babel
作用:将css-loader生成的css代码挂载到页面的header部分。
使用:
{
test: /\.(css)$/,
use: [
{
loader: 'style-loader',
options: {
injectType: 'singletonStyleTag',
},
},
{ loader: 'css-loader' },
],
}
4、css-babel
作用:分析出各个css文件之间的关系,把各个css文件合并成一段css,必须结合style-loader使用。
5、file-loader
作用:处理import/require()等方式引入的一个文件资源,并且会将它放到我们输出的文件夹中;当然也可以修改它的名字和所在文件夹。
使用:
{
test:/\.(png|jpe?g|gif|svg)$/,
use:[
{
loader:'file-loader',
options:{
name:"img/[name].[hash:6].[ext]",//img目录
}
}
]
}
6、postcss-loader
作用:PostCSS 本身是一个功能比较单一的工具。它提供了一种方式用 JavaScript 代码来处理 CSS。它负责把 CSS 代码解析成抽象语法树结构(Abstract Syntax Tree,AST),再交由插件来进行处理。插件基于 CSS 代码的 AST 所能进行的操作是多种多样的,比如可以支持变量和混入(mixin),增加浏览器相关的声明前缀,或是把使用将来的 CSS 规范的样式规则转译(transpile)成当前的 CSS 规范支持的格式。
使用:
module:{
rules:[
{
test:/.(css|scss)$/,
use:[
{loader:"style-loader"},
{loader:"css-loader"},
{loader:"postcss-loader"},
{loader:"sass-loader"}
]
}
]
}
postcss.config.js
module.exports = {
plugins:[
require("autoprefixer")({
overrideBrowserslist:[
"defaults",
"Android 4.1",
"iOS 7.1",
"Chrome>31",
"ff>31",
"ie>=8",
"last 2 versions",
">0%"
]
})
]
}
7、url-loader
作用:url-loader 会将引入的文件进行编码,生成 DataURL,相当于把文件翻译成了一串字符串,再把这个字符串打包到 JavaScript。考虑将较小的图片放在本地,然后使用 url-loader 将这些图片通过 base64 的方式引入代码中。这样就节省了请求次数,从而提高页面性能。
module.exports = {
module: {
rules: [
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'url-loader',
options: {},
},
],
},
],
},
};
8、inline-html-loader
作用:实现一个 loader 去解析 HTML 里面的?__inline 语法
使用:
html
<!DOCTYPE html>
<html lang="en">
<head>
<link href="./meta.html?__inline">
<title>Document</title>
<script type="text/javascript" src="../node_modules/lib-flexible/flexible.js?__inline"></script>
</head>
<body>
<div id="root"></div>
</body>
</html>
webpack.config.js
{
test: /.html$/,
use: 'inline-html-loader'
},
9、inline-file-loader
作用:实现 ?__inline 的语法糖,引用某个图片的时候看到这个后缀则自动的将这张图片进行 base64 编码。
使用:
css
.search {
background: url(./search-icon.png?__inline) no-repeat;
}
webpack.config.js
{
test: /.(png|jpg|gif|jpeg)$/,
use: [
{
loader: 'inline-file-loader',
options: {
name: '[name]_[hash:8].[ext]'
}
}
]
},
{
test: /.(woff|woff2|eot|ttf|otf)$/,
use: [
{
loader: 'inline-file-loader',
options: {
name: '[name]_[hash:8][ext]'
}
}
]
}
css插件
1、mini-css-extract-plugin
作用:css样式从js文件中提取到单独的css文件中。
使用:
module: {
rules: [
{
test: /\.css$/,
use: [{
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: './dist',
},
}, {
loader: "css-loader",
}
]
},
...
]
},
plugins: [
...
new MiniCssExtractPlugin({
filename: 'style.css',
}),
]
2、optimize-css-assets-webpack-plugin
作用:压缩css文件。
使用:
plugins: [
new ExtractTextPlugin('styles.css'),
//new OptimizeCssAssetsPlugin()
new OptimizeCSSAssetsPlugin({
assetNameRegExp: /\.css$/g,
cssProcessor: require('cssnano'),
cssProcessorPluginOptions: {
preset: ['default', { discardComments: { removeAll: true } }],
},
canPrint: true
}),
]
3、postcss-preset-env
作用:称之为postcss预设环境,大意就是它整合了很多的常用插件到一起,并帮你完成了基本的配置,你只需要安装它一个插件,就相当于安装了很多插件了。
使用:
postcss.config.js
module.exports = {
plugins: {
"postcss-preset-env": {
browsers: [
"last 2 version",
"> 1%"
]
}
}
}
.browserslistrc
last 2 version
> 1%
package.json
"browserslist": [
"last 2 version",
"> 1%"
]
4、html-inline-css-webpack-plugin
作用:将<link rel="stylesheet" /> => <style>...<style/>
,注意:html-inline-css-webpack-plugin 需要放在 html-webpack-plugin 后面。
使用:
plugins: [
new MiniCssExtractPlugin({
filename: '[name]_[contenthash:8].css'
}),
new HtmlWebpackPlugin(),
new HTMLInlineCSSWebpackPlugin()
]
5、autoprefixer
作用:解析CSS文件并且添加浏览器前缀到CSS规则里。
使用:
postcss.config.js
module.exports = {
plugins: {
// 兼容浏览器,添加前缀
'autoprefixer':{
overrideBrowserslist: [
"Android 4.1",
"iOS 7.1",
"Chrome > 31",
"ff > 31",
"ie >= 8"
//'last 10 versions', // 所有主流浏览器最近2个版本
],
grid: true
}
}
}
or
module.exports = {
plugins: [
// 兼容浏览器,添加前缀
require('autoprefixer')({
overrideBrowserslist: [
"Android 4.1",
"iOS 7.1",
"Chrome > 31",
"ff > 31",
"ie >= 8"
//'last 2 versions', // 所有主流浏览器最近2个版本
],grid: true})
]
}
or
module.exports = {
plugins: [
require('autoprefixer')()
]
}
package.json
"browserslist": [
"defaults",
"not ie < 11",
"last 2 versions",
"> 1%",
"iOS 7",
"last 3 iOS versions"
]
6、px2rem-loader
作用:自动将px转换为rem。一般与flexiable.js结合使用。
使用:
{
loader: 'px2rem-loader',
options: {
remUnit: 75,
remPrecision: 8
}
},
html
1、html-webpack-plugin
作用:在webpack构建后生成html文件,同时把构建好入口js文件引入到生成的html文件中。
使用:
new HtmlWebpackPlugin({
template: path.join(__dirname, 'src/index.html'),
filename: 'index.html',
chunks: ['index'],
inject: true,
minify: {
html5: true,
collapseWhitespace: true,
preserveLineBreaks: false,
minifyCSS: true,
minifyJS: true,
removeComments: false
}
})
2、html-webpack-externals-plugin
作用:基础库不打包,直接CDN引入
使用:
new HtmlWebpackExternalsPlugin({
externals: [
{
module: 'react',
entry: 'https://11.url.cn/now/lib/16.2.0/react.min.js',
global: 'React'
},
{
module: 'react-dom',
entry: 'https://11.url.cn/now/lib/16.2.0/react-dom.min.js',
global: 'ReactDOM'
}
]
})
Js
1、uglifyjs-webpack-plugin(webpack4)
作用:该插件用来缩小(压缩优化)js文件。
使用:
plugins: [
new UglifyJsPlugin()
]
2、clean-webpack-plugin
作用:删除生成的build文件。
使用:
plugins: [
new CleanWebpackPlugin()
]
3、terser-webpack-plugin(开箱即用,自定义需安装)
作用:
使用:
module.exports = {
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
test: /\.js(\?.*)?$/i,
parallel: true,
extractComments: true,
sourceMap: config.build.productionSourceMap,
terserOptions: {
output: {
// 是否输出可读性较强的代码,即会保留空格和制表符,默认为输出,为了达到更好的压缩效果,可以设置为false
beautify: false,
// 是否保留代码中的注释,默认为保留,为了达到更好的压缩效果,可以设置为false
comments: false
},
compress: {
// 是否在UglifyJS删除没有用到的代码时输出警告信息,默认为输出,可以设置为false关闭这些作用不大的警告
warnings: false,
// 是否删除代码中所有的console语句,默认为不删除,开启后,会删除所有的console语句
drop_console: true,
drop_debugger: true,
// 是否内嵌虽然已经定义了,但是只用到一次的变量,比如将 var x = 1; y = x, 转换成 y = 5, 默认为不转换,为了达到更好的压缩效果,可以设置为false
collapse_vars: true,
// 是否提取出现了多次但是没有定义成变量去引用的静态值,比如将 x = 'xxx'; y = 'xxx' 转换成var a = 'xxxx'; x = a; y = a; 默认为不转换,为了达到更好的压缩效果,可以设置为false
reduce_vars: true,
pure_funcs: ['console.log'] // 移除console
}
}
}),
],
},
};
4、HotModuleReplacementPlugin
作用:热替换插件
使用:
devServer: {
contentBase: './dist',
hot: true,
stats: 'errors-only'
},
plugins: [
new webpack.HotModuleReplacementPlugin()
]
5、friendly-errors-webpack-plugin
作用:Webpack友好的错误提示插件
使用:
plugins: [
new FriendlyErrorsWebpackPlugin(),
],
devServer: {
// ...
quiet: true,
// ...
},
6、DllPlugin、DllReferencePlugin
作用:为了分散 bundle 包,加快编译过程而生的。通过创建一个名为mainfest.json
的依赖文件,指明依赖项目,为后面构建的bundle包作导引。
使用:
webpack.config.dll.js
const fs = require('fs')
const path = require('path')
const webpack = require('webpack')
const CleanWebpackPlugin = require('clean-webpack-plugin')
process.noDeprecation = true
// 入口
var entry = {
// 把有需要打包的常用库封装,如babel-polyfill,jquery等
vendor: ['babel-polyfill', 'vue/dist/vue.runtime.min', 'jquery/dist/jquery.slim.min']
}
var config = {
entry: entry,
output: {
path: path.resolve(__dirname, '../dist/static/js'),
filename: '[name].js',
library: '[name]_library'
},
module: {
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/,
query: {
presets: ['es2015']
}
}
]
},
plugins: [
new CleanWebpackPlugin(['dist'], {
root: path.resolve(__dirname, '..')
}),
// 划重点!!
new webpack.DllPlugin({
// 指定路径
path: path.join(__dirname, '../dist', '[name]-manifest.json'),
// 指定依赖库的名称
name: '[name]_library'
}),
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
}),
new webpack.optimize.UglifyJsPlugin({
sourceMap: true,
output: false,
compress: {
unused: true,
dead_code: true,
pure_getters: true,
warnings: false,
screw_ie8: true,
conditionals: true,
comparisons: true,
sequences: true,
evaluate: true,
join_vars: true,
if_return: true
},
comments: false,
minimize: true
})
]
}
module.exports = config
webpack.prod.js
plugins: [
// 划重点
new webpack.DllReferencePlugin({
context: path.resolve(__dirname, '..'),
manifest: require('../dist/vendor-manifest.json')
})
]