webpack中plugin的使用

801 阅读3分钟

插件(plugin)

Loader是用于特定的模块类型进行转换;

Plugin可以用于执行更加广泛的任务,比如打包优化、资源管理、环境变量注入等;

CleanWebpackPlugin

该插件帮助我们,在每次打包时,自动删除上一次打包后的文件。

安装:

 npm install clean-webpack-plugin -D

配置:

 const {CleanWebpackPlugin} = require("clean-webpack-plugin");
 ​
 module.exports={
     plugins: [new CleanWebpackPlugin()]
 }
 ​

HtmlWebpackPlugin

在打包完成的文件夹(dist/)中生成一个index.html文件。

安装:

 npm install html-webpack-plugin -D

配置:

 const HtmlWebpackPlugin = require("html-webpack-plugin");
 ​
 module.exports={
     plugins: [new HtmlWebpackPlugin()]
 }

index.html是通过ejs模板生成的,我们也可以自定义模板来生成index.html文件。

  1. 创建一个模板文件(public/index.html)

     <!DOCTYPE html>
     <html lang="">
       <head>
         <meta charset="utf-8">
         <meta http-equiv="X-UA-Compatible" content="IE=edge">
         <meta name="viewport" content="width=device-width,initial-scale=1.0">
         <link rel="icon" href="<%= BASE_URL %>favicon.ico">
         <title><%= htmlWebpackPlugin.options.title %></title>
       </head>
       <body>
         <div id="app"></div>
         <!-- built files will be auto injected -->
       </body>
     </html>
     ​
    
  2. 对HtmlWebpackPlugin插件进行配置

  3. 配置DefinePlugin插件

  4. 配置CopyWebpackPlugin插件

完整配置:

 const {CleanWebpackPlugin} = require("clean-webpack-plugin");
 const HtmlWebpackPlugin = require("html-webpack-plugin");
 const {DefinePlugin} = require("webpack");
 const CopyWebpackPlugin = require("copy-webpack-plugin");
 ​
 modult.exports={
     entry: "./src/index.js",
     output: {
         filename: "bundle.js",
         path: path.resolve(__dirname, "./dist"),
     },
     plugins: [
     new CleanWebpackPlugin(),
     new HtmlWebpackPlugin({
       //模板文件
       template: "./public/index.html",
       //模板中使用到的title属性
       title: "webpack项目",
     }),
     new DefinePlugin({
       //设置全局变量
       BASE_URL: "'./'",
     }),
     new CopyWebpackPlugin({
       patterns: [
         {
           //文件来源
           from: "public",
           //文件去向
           to: "./", //相对于output的path属性来定位的(./代表dist/)
           globOptions: {
             //如果使用了HtmlWebpackPlugin,模板和要copy的文件在同一个文件夹中,
             //必须设置该属性,忽略掉模板文件
             ignore: ["**/index.html"],
           },
         },
       ],
     }),
   ],
 }
 ​

DefinePlugin

DefinePlugin允许在编译时创建配置的全局常量,是一个webpack内置的插件。

配置:

 module.exports={
     plugins: [new HtmlWebpackPlugin()]
 }

CopyWebpackPlugin

在vue的打包过程中,如果我们将一些文件放到public的目录下,那么这个目录会被复制到dist文件夹中。

这个复制的功能,我们可以使用CopyWebpackPlugin来完成;

安装:

 npm install copy-webpack-plugin -D

接下来配置CopyWebpackPlugin即可:

复制的规则在patterns中设置;

  1. from: 设置从哪一个源中开始复制;
  2. to: 复制到的位置,可以省略,会默认复制到打包的目录下;
  3. globOptions: 设置一些额外的选项,其中可以编写需要忽略的文件:

index.html:不需要复制,因为我们已经通过HtmlWebpackPlugin完成了index.html的生成;

mode

用于设置是开发模式还是生产模式。默认情况是生产模式。

选项描述
development会将 DefinePluginprocess.env.NODE_ENV 的值设置为 development. 为模块和 chunk 启用有效的名。
production会将 DefinePluginprocess.env.NODE_ENV 的值设置为 production。为模块和 chunk 启用确定性的混淆名称,FlagDependencyUsagePluginFlagIncludedChunksPluginModuleConcatenationPluginNoEmitOnErrorsPluginTerserPlugin
none不使用任何默认优化选项

配置:

 module.exports={
     mode:'development'
 }

开发模式:(development)可以帮助我们寻找错误,定位到出错的文件。

生产模式:(production) 代码会被压缩和丑化等一系列操作,我们是无法阅读的,出错后没有办法定位错误。

devtool

此选项控制是否生成,以及如何生成 source map。

如果为开发模式,默认使用的是eval选项。

常用值:

source-map: 整个 source map 作为一个单独的文件生成。它为 bundle 添加了一个引用注释,以便开发工具知道在哪里可以找到它。

eval :每个模块都使用 eval() 执行,并且都有 //@ sourceURL。此选项会非常快地构建。主要缺点是,由于会映射到转换后的代码,而不是映射到原始代码(没有从 loader 中获取 source map),所以不能正确的显示行数。

配置:

 module.exports={
     devtool:'source-map'
 }