const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const webpackConfig = {
plugins: [
new CleanWebpackPlugin(),
],
};
dry
: 模拟删除文件,默认是false,模拟,就是没删,但是打印还是打印的verbose
:是否要打印在终端上,就是打包时候执行的时候是否要知道删除某某文件的结果cleanStaleWebpackAssets
:是否要删除没用到的文件,我们有时候会copy插件复制一些静态文件,用请求的方式调用protectWebpackAssets
:不允许删除当前网页包资产,这个是啥意思呢,我也没查到,默认是true,意思是文件打包过去不允许手都删除?明天我试一下这个以上这就是正确的使用方式了,引入的时候解构赋值,使用的时候不用传目录名,因为插件会自己寻找webpack输出的出口
//在plugin中配置的时候
new PurifyCss({
paths: glob.sync([ // 传入多文件路径pat
h.resolve(__dirname, './*.html'), // 处理根目录下的html文件
path.resolve(__dirname, './src/*.js') // 处理src目录下的js文件
])
})
注意事项
:“官方提示这个插件需要和extract-text-webpack-plugin一起使用,因为这个插件是需要输出资源的,如果没有单独的css去输出资源的话,这个插件起不到任何作用”,这里就有问题了嗷,extract-text-webpack-plugin再webpack4就不支持使用了的,因为purifycss-webpack其实也都是五年前的东西了,所以配套的extract-text-webpack-plugin已经过时了,用我们前边章节讲的mini-css-extract-plugin,来替换掉官方文档建议的插件,网上搜的也都要考虑自己的webpack版本,不能乱用的,是不支持的
//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')
}),
]
}
这里就是dll的配置,webpack打包之前先执行这个配置文件,执行语句为webpack --config webpack.dll.js --mode=development
,这里也可以配置为命令,执行这个命令会生成一个manifest.json文件,这个文件的名称就是entry配置的名称-manifest.json
,这个名称需要记住规则,因为再webpack.config.js中配置是要使用的
new webpack.DllReferencePlugin({
context: __dirname,
manifest: require('./dist/dll/react.manifest.json')
}),
在webpack里需要配置这个manifest文件,用来使DllReferencePlugin
这个插件找到生成的配置文件,然后再入口文件中引入react.dll.js就可以了
<body>
<div id="app"></div>
<!--引用dll文件-->
<script src="../../dist/dll/react.dll.js" ></script>
</body>
注意看这个Dll到了第做了什么,实际上不是很复杂,只不过是在我们常用的逻辑之外
Dll先是通过配置文件,找到了我们配置的一些第三方库或者组件,这些库被我们生成了一个js库,而且给出了一个manifest配置,这个配置就是Dll库的配置文件,当找通过我们配置的名称找到这个文件的时候,我们就会再manifest的配置找寻找模块,找到了就去生成的Dll库中拿,就不再经过打包路径了
,通俗一些来讲,就是我把东西都包装好在一个库里,这个库放在了build文件夹内,给你了你一个目录,你那边打包的时候,通过DllReferencePlugin来找目录(manifest),找到的话说明是有的,那你就不用管了,为啥,因为入口文件html已经手动引入了,所以说html内引入也很好理解,webpack所有的流程就到目录那看有没有就已经结束了,库还是需要我们自己引入的,因为目录里有的webpack会默认为可以打包好的代码可以直接使用
const { IgnorePlugin }= require('webpack')
plugins: [
//moment这个库中,如果引用了./locale/目录的内容,就忽略掉,不会打包进去
new IgnorePlugin (/\.\/locale/, /moment/),
]
IgnorePlugin 虽然有时候不好筛选出来区分我们需要的和不需要的会一并给忽略掉,但是我们是可以手动引入的,这样就不会被忽略了
//手动在使用moment的下边引入语言包
import 'moment/locale/zh-cn.js';
本来看到了IgnorePlugin想说一下按需加载来着,但是回头想一想,是不是太简单了,elementUI的按需引入方案,使用babel-plugin-component,其实本质上是把引入的语法做了一个转换,转换为引入所需的单独文件,跟我们webpack内的忽略过滤文件原理不大相同,所以就暂且不说吧
总结: webapck的优化方式非常的多,通过各种插件可以进行非常细致的优化,可以说能让我们从各个角度去优化自己的使用体验,vite的打包方式当然是更加爽快,配置也少,但是vite的生态现在不好,还有就是我们实际上这些年沉淀了好些的老项目,vite最不好的地方就是很难从webpack去切换,创建新项目还好一些,老项目改造,我是吃够了苦的,话不多说,明天继续