8.webpack插件

225 阅读2分钟

插件机制

loader专注实现资源模块的加载

plugin用来解决项目中除了资源加载以外其他的自动化工作,比如清理上一次打包输出的文件、拷贝不需要参与打包的静态文件到输出目录、压缩输出代码

自动清除输出目录的插件

每次使用webpack打包的时候清除上一次打包输出的文件

安装

`yarn add clean-webpack-plugin --dev`

打开配置文件,导入clean-webpack-plugin插件

const {CleanWebpackPlugin} = require('clean-webpack-plugin');

插件的使用需要添加plugins属性,在该属性中通过new一个对象的方式使用插件

```
const path = require('path')
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
module.exports = {
    mode: 'none',
    entry: "./src/index.js",    //入口文件
    output: {
        filename: "bundle.js",  //文件名称
        path: path.join(__dirname, "output"),    //输出目录
        publicPath: 'output/'   //指定文件读取目录
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env']
                    }
                }
            },
            {
                test: /\.css$/,
                use: ['style-loader','css-loader']
            },
            {
                test: /.(jpe?g|png)$/,
                use: {
                    loader: 'url-loader',
                    options: {
                        limit: 10 * 1024    //10KB
                    }
                }
            },
            {
                test: /\.html$/,
                use: {
                    loader: 'html-loader',
                    options: {
                        attributes: {
                            list: [
                                {
                                    tag: 'a',
                                    attribute: 'href',
                                    type: 'src'
                                },
                                {
                                  tag: 'img',
                                  attribute: 'data-srcset',
                                  type: 'srcset',
                                }
                            ]
                        }
                    }
                }
            }
        ]
    },
    plugins: [
        new CleanWebpackPlugin()    //这里使用自动清除插件
    ]
}
```

生成HTML的插件html-webpack-plugin

安装

yarn add html-webpack-plugin --dev

引入html-webpack-plugin

const HtmlWebpackPlugin = require('html-webpack-plugin');

在plugins数组下实例化对象

plugins: [
        new CleanWebpackPlugin(),    //这里使用自动清除插件
        new HtmlWebpackPlugin(),    //默认生成index.html
    ]

到这一步执行yarn webpack就可以自动生成html文件到输出目录了

但是生成的html文件还有点问题,在引入bundle.js的script标签那里src路径多了output,这是因为之前在output对象下添加了publicPath属性,把它去掉就可以了。

如果对html文件有特殊的要求,可以在实例化HtmlWebpackPlugin对象的时候传入一个对象,支持修改的属性可在npm或者GitHub查

```javascript
new HtmlWebpackPlugin({
            title: 'Webpack Plugin sample',
            meta: {
                viewport: 'width=device-width'
            }
        })
```

如果要修改的属性比较多,可以指定一个html模板

```javascript
new HtmlWebpackPlugin({
            title: 'Webpack Plugin sample',
            meta: {
                viewport: 'width=device-width'
            },
            template: './src/index.html'
        })
```

index.html

```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>Webpack</title>
</head>
<body>
    <div class="container">
        <h1><%= htmlWebpackPlugin.options.title %></h1>
    </div>
</body>
</html>
```

这里的h1标签使用了EJS,需要去掉html-loader的使用才能生效,否则生成的html文件将会原样输出这段代码