开发webpack插件-webpack常用插件(优化并持续更新)

常用插件1. html-webpack-plugin(生成html文件并自动引入依赖js)

const HtmlWebpackPlugin = require('html-webpack-plugin');
const path = require('path');
module.exports = {
  entry: 'index.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: 'index_bundle.js',
  },
  plugins: [new HtmlWebpackPlugin()],
};

2. clean-webpack-plugin(自动清除dist)

const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const webpackConfig = {
	plugins: [
		new CleanWebpackPlugin(),
	],
};

3.uglifyjs-webpack-plugin(压缩文件)

1.uglify-js文档

2.参考优化帖子有详细解释

const HtmlWebpackPlugin = require('uglifyjs-webpack-plugin');
optimization: {
	minimizer: [
		new UglifyJsPlugin()
	]
},

这是我们使用当前插件时的默认配置。 可以改成我们现在的js压缩插件。 当然,还有很多配置参数。 让我们来看看。

new UglifyJsPlugin({
	test: /.js(?.*)?$/i,  //选中匹配规则文件,
	include: //includes/, //包含哪些文件
	excluce: //excludes/, //不包含哪些文件
	//看到filter我们就知道了吧这是个过滤器,用来过滤哪些压缩和不压缩的,返回true的是压缩的,返回false不压缩
	chunkFilter: (chunk) => {
		if (chunk.name === '天选之子') {
			return false;
		}
		return true;
 	},
 	cache:true,//是否缓存,可以写string模式的,来确定缓存路径
 	parallel:true,//是否启动多线程提高构建速度,也可以写数字来确定几个线程,建议不用,一般来说没那么复杂用的话反而效果不好
 	uglifyOptions:{}//这个可以写很多的具体压缩规则配置,因为默认用的是uglify-js,所以参数较多我下边列一下
 }),

这也是一个非常常用的插件,几乎可以算是首选。

插件开发是什么_插件开发教程_开发webpack插件

4.DLLPlugin(加速打包,只编译核心代码,第三方库无需编译直接使用)

//webpack.dll.config.js
module.exports = {=
  entry: {
    // 第三方库
    react: ['react', 'react-dom', 'react-redux']
  },
  output: {
    // 输出的动态链接库的文件名称,[name] 代表当前动态链接库的名称,
    filename: '[name].dll.js',
    path: resolve('dist/dll'),
    // library必须和后面dllplugin中的name一致 后面会说明
    library: '[name]_dll_[hash]'
  },
  plugins: [
  // 接入 DllPlugin
    new webpack.DllPlugin({
      // 动态链接库的全局变量名称,需要和 output.library 中保持一致
      // 该字段的值也就是输出的 manifest.json 文件 中 name 字段的值
      name: '[name]_dll_[hash]',
      // 描述动态链接库的 manifest.json 文件输出时的文件名称
      path: path.join(__dirname, 'dist/dll', '[name].manifest.json')
    }),
  ]
}

  new webpack.DllReferencePlugin({
    context: __dirname,
    manifest: require('./dist/dll/react.manifest.json')
  }),

<body>
  <div id="app"></div>
  <!--引用dll文件-->
  <script src="../../dist/dll/react.dll.js" ></script>
</body>

注意这个 Dll 的作用。 其实并不是很复杂,只是超出了我们常用的逻辑而已。

dll首先找到了我们通过配置文件配置的一些第三方库或者组件。 这些库被我们生成成js库,并给出了manifest配置。 这个配置就是Dll库的配置文件。 当我们通过我们的配置名称中找到这个文件时开发webpack插件,我们也会在manifest配置中搜索该模块。 如果找到了,我们就去生成的Dll库去获取,就不再走打包路径了。 通俗地说,我会把所有东西都放进去。 它被打包在一个库中。 该库放置在构建文件夹中并为您提供一个目录。 打包时,使用DllReferencePlugin查找目录(清单)。 如果找到了,就说明它存在,那么你就可以不用管了,为什么,因为入口文件html已经被自动导入了,所以html中的导入很容易理解。 webpack的所有流程都是通过去目录看有没有的方式来完成的。 库还是需要我们自己导入。 因为目录下有些webpack会默认打包代码,可以直接使用。

5. mini-css-extract-plugin(打包css文件开发webpack插件,可以配合uglifyjs-webpack-plugin进行压缩优化)

optimization: {
    minimizer: [
      new OptimizeCSSAssetsPlugin({})
    ]
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: "[name].css",
      chunkFilename: "[id].css"
    })
  ],
  module: {
    rules: [
      {
        test: /.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          "css-loader"
        ]
      }
    ]
  }

看了上面的代码,我们可以看出这个插件简单易用。 我们所做的只是用 MiniCssExtractPlugin.loader 替换 style-loader。 我们可以使用插件中的loader来代替style-loader的作用并进行打包。 当打包成css文件并配置到minimizer中时,就意味着我们的也可以用于优化。 一般情况下,我们会使用 const devMode = process.env.NODE_ENV !== 'Production' 来获取我们当前的环境,然后判断是否是开发环境。 如果是这样,我们仍然会使用这个加载器。 如果没有,我们可以使用样式加载器。

6、IgnorePlugin(忽略第三方包指定的目录,并阻止那些指定的目录被打包)

const { IgnorePlugin }= require('webpack')
plugins: [
  //moment这个库中,如果引用了./locale/目录的内容,就忽略掉,不会打包进去
  new IgnorePlugin (/./locale/, /moment/),
]

//手动在使用moment的下边引入语言包
import 'moment/locale/zh-cn.js';