《八》Webpack 中的 Plugin

本文介绍了Webpack中的几个常用插件,如CleanWebpackPlugin用于清理输出文件,HtmlWebpackPlugin自动生成HTML并引入资源,DefinePlugin用于定义全局常量,以及CopyWebpackPlugin和ProvidePlugin的用法,展示了如何通过这些插件优化打包过程和解决常见问题。

Plugin:扩展插件。是用来扩展 Webpack 的功能的,可以贯穿 Webpack 的整个生命周期,在特定时机注入扩展逻辑,执行更广泛的任务,比如打包优化、资源管理、环境注入等。

CleanWebpackPlugin 插件:

运行 webpack 命令进行打包,最终会生成一个文件夹。当修改了代码重新进行打包后:

  1. 如果生成的文件在输出的文件夹下已有同名的文件,Webpack 会进行覆盖。
  2. 如果生成的文件是新的文件,Webpack 会将其添加到输出的文件夹下。
  3. 如果输出的文件夹下有旧的文件,但是并没有生成的新的同名的文件,Webpack 会对其进行保留,不会删除。

因此,之前都是每次运行 webpack 命令进行打包之前,手动删除打包输出的文件。可以使用 CleanWebpackPlugin 插件来解决。

使用 CleanWebpackPlugin 插件:

CleanWebpackPlugin 插件:在打包之前自动删除之前打包输出的文件。

  1. 安装 CleanWebpackPlugin 插件:npm install clean-webpack-plugin --save-dev
  2. 在 Webpack 配置文件中进行配置。
    const path = require('path')
    // 导入 CleanWebpackPlugin
    const {CleanWebpackPlugin} = require('clean-webpack-plugin')
    
    module.exports = {
      // 必须明确配置 output.path,否则 CleanWebpackPlugin 会找不到要清除输出文件夹的地方
      output: {
        path: path.resolve(__dirname, 'dist'),
      },
      plugins: [
        // 使用 CleanWebpackPlugin。Plugin 都是一个一个的类
        new CleanWebpackPlugin()
      ]
    }
    

HtmlWebpackPlugin 插件:

之前是手动创建了一个 HTML 文件,并手动将打包后的 JS 文件引入了进去。可以使用 HtmlWebpackPlugin 插件来自动生成 HTML 文件。

使用 HtmlWebpackPlugin 插件:

HtmlWebpackPlugin 插件:在打包后生成的文件下自动生成一个 HTML 文件,并将打包后的资源自动引入。

HtmlWebpackPlugin 插件底层是根据 ejs 模板来生成 HTML 文件的。
在这里插入图片描述

  1. 安装 HtmlWebpackPlugin 插件:npm install html-webpack-plugin --save-dev
  2. webpack.config.js 配置文件中进行配置。
    // 导入 HtmlWebpackPlugin
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports = {
      plugins: [
        // 使用 HtmlWebpackPlugin
        new HtmlWebpackPlugin()
      ]
    }
    

运行 webpack 命令进行打包,会发现,在打包生成的文件夹下自动生成的了index.html 文件。
请添加图片描述

配置 HtmlWebpackPlugin 插件自动生成的 HTML 文件的 <title> 标签的值:
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  plugins: [
    new HtmlWebpackPlugin({
      // 配置使用 HtmlWebpackPlugin 插件自动生成的 HTML 文件的 <title> 标签的值。默认是 Webpack App
      title: '测试',
    })
  ]
}

运行 webpack 命令进行打包,会发现,在打包生成的文件夹下自动生成的 index.html 文件中 <title> 标签的值变为了测试。

配置 HtmlWebpackPlugin 插件根据自定义 HTML 模板来生成 HTML 文件:
  1. 新建 public/index.html 文件并编写代码。
  2. webpack.config.js 配置文件中进行配置。
    const HtmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports = {
      plugins: [
        new HtmlWebpackPlugin({
          // HtmlWebpackPlugin 插件将会根据 template 属性指定的 HTML 文件生成打包后的 HTML 文件
          template: './public/index.html'
        })
      ]
    }
    

运行 webpack 命令进行打包,会发现,HtmlWebpackPlugin 插件根据 public/index.html 在打包生成的文件夹下自动生成了 index.html 文件。

CopyWebpackPlugin 插件:

在 public 文件夹下新增 favicon.png 图片。 运行 webpack 命令进行打包,想要实现的效果是,将 pubilc 文件夹下除了 index.html 文件外的其他内容全部复制到 Webpack 打包生成的文件夹下。

使用 CopyWebpackPlugin 插件:

CopyWebpackPlugin 插件:用于复制文件和目录。

  1. 安装 CopyWebpackPlugin 插件:npm install copy-webpack-plugin --save-dev
  2. webpack.config.js 配置文件进行配置。
    const path = require('path')
    // 导入 CopyWebpackPlugin
    const CopyWebpackPlugin = require('copy-webpack-plugin')
    
    module.exports = {
      plugins: [
        // 使用 CopyWebpackPlugin
        new CopyWebpackPlugin({
          // 匹配要复制的资源,复制到哪个地方。patterns 是一个数组,可以匹配多个对象
          patterns: [
            {
              // 要复制资源的位置
              from: 'public',
              // 复制到哪个地方。如果 to 的属性值是相对路径,将会相对于 Webpack 打包生成的目录;如果是绝对路径,将直接使用指定的路口;如果不明确设置 to 属性,将默认复制到 Webpack 打包生成的目录下
              to: path.resolve(__dirname, 'dist'),
              globOptions: {
                // 复制时要忽略的文件。前面必须加 **/,否则将会忽略失败
                ignore: [
                  '**/index.html'
                ]
              }
            }
          ]
        })
      ]
    }
    

运行 webpack 命令进行打包,会发现, public 文件夹下除了 index.html 文件外的其他内容已经全部复制到 Webpack 打包生成的文件夹下了。

请添加图片描述

DefinePlugin 插件:

DefinePlugin 是 Webpack 内置的一个插件,不需要单独安装。允许在 Webpack 编译时创建全局常量,就可以在项目中全局使用。

  1. webpack.config.js 配置文件中进行配置。
    // 导入 DefinePlugin
    const {DefinePlugin} = require('webpack')
    
    module.exports = {
      plugins: [
        // 使用 DefinePlugin
        new DefinePlugin({
          // 定义全局常量 ENV
          // 由于 DefinePlugin 插件直接执行文本替换,给定的值必须包含字符串本身的引号,否则的话替换后就会成为变量名而非字符串值。因此,可以使用 '"production"' 或者 JSON.stringify('production')
          // ENV: '"production"',
          ENV: JSON.stringify('production')
        })
      ]
    }
    
  2. src/js/component.js 中编写以下代码。
    // 使用全局常量 ENV
    console.log(ENV)
    

运行 webpack 命令进行打包,打开浏览器,可以看到有 ENV 的打印信息。
请添加图片描述

ProvidePlugin 插件:

例如:现在项目中依赖一个第三方库,这个第三方库本身又依赖 lodash,但是它默认全局已经存在了 lodash,因此没有对 lodash 进行导入,那么运行起来就会报错,此时就需要通过 ProvidePlugin 来实现 shimming 效果。

shimming:垫片。是某一类功能的统称,给代码填充一些垫片来处理一些问题。
Webpack 官方并不推荐随意使用 shimming,因为 Webpack 的理念是编写具有封闭性的、不存在隐含依赖的、彼此隔离的模块,从而使前端开发更加模块化,但是 shimming 会使得模块的依赖关系不明确。

使用 ProvidePlugin 插件:

ProvidePlugin:是 Webpack 内置的一个插件。用于当在代码中找不到某一个变量时,自动导入对应的库。可以传入一个对象,其中的 key 是在代码中使用的库的名称,value 是要自动导入的库的名称。

  1. 安装 lodash。
  2. 新建 src/index.js,并编写代码。
    // 使用了  ldash,但是并没有引入
    console.log(_.join(['a', 'b', 'c'], '/'))
    
  3. webpack.config.js 进行配置。
    const webpack = require('webpack')
    
    module.exports = {
      plugins: [
        // 当在代码中找不到变量 _ 时,会自动引入 lodash 库
        new webpack.ProvidePlugin({
          _: 'lodash'
        })
      ]
    }
    
  4. 新建 index.html,并编写代码。
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    <body>
      <script src="./dist/main.js"></script>
    </body>
    </html>
    
  5. 运行 webpack 命令进行打包,并在浏览器中运行,会发现可以正常运行。
    请添加图片描述
### WebpackPlugin 的功能及作用 Webpack 中的插件(Plugin)是用于扩展 Webpack 功能的核心工具之一。它们通过监听 Webpack 内部事件钩子,在构建流程的不同阶段执行自定义逻辑,从而实现对打包过程的深度控制[^1]。以下是关于 Webpack 插件功能及作用的详细说明: #### 1. 打包优化 插件可以优化输出文件的结构和内容,例如压缩代码、去除未使用的模块等。常用的优化插件包括 `UglifyJS Webpack Plugin`,它能够高效地压缩 JavaScript 文件,提升网页性能[^3]。 #### 2. 资源管理 插件可用于管理项目中的静态资源,例如复制文件、生成 HTML 文件等。例如,`CopyWebpackPlugin` 可以将指定的静态文件复制到输出目录中[^2],而 `HtmlWebpackPlugin` 则能自动生成 HTML 文件,并将打包后的 JavaScript 文件自动注入到 HTML 中[^1]。 #### 3. 环境变量注入 插件可以定义全局变量,以便在代码中使用。例如,`DefinePlugin` 允许开发者定义环境变量,如 `process.env.NODE_ENV`,从而区分开发环境和生产环境[^1]。 #### 4. 自定义功能 开发者可以通过编写自定义插件来实现特定需求。例如,监听 Webpack 构建过程中的事件钩子,并在特定阶段执行逻辑。以下是一个简单的自定义插件示例: ```javascript class MyExampleWebpackPlugin { apply(compiler) { compiler.hooks.emit.tapAsync('MyExampleWebpackPlugin', (compilation, callback) => { console.log('这是一个示例插件!'); callback(); }); } } module.exports = MyExampleWebpackPlugin; ``` 此插件会在 Webpack 的 `emit` 阶段打印一条日志信息[^4]。 #### 5. 生命周期集成 插件贯穿了 Webpack 的整个编译周期,能够在不同阶段(如 `compile`、`emit`、`done` 等)执行任务[^1]。这种机制使得插件能够灵活地介入构建流程,满足各种复杂需求。 ### 示例配置 以下是一个包含多个插件的 Webpack 配置示例: ```javascript const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const { DefinePlugin } = require('webpack'); module.exports = { entry: './src/index.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html' }), new DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify('production') }) ] }; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值