前言 继上次分享了webpack的基本配置之后,这次分享一些工作中项目中常用的配置插件,以及一些经常用到的插件我知道和认为是好的。如分析不到位,欢迎指正。好吧,这些东西都有文档,你可以绕过它们。 很多插件在Wepack4之后就被废弃了。这里只说明webpack4还支持的(包括4之前的插件),已经放弃的就不细说了。 上次分享后,有掘金网友留言质疑:骗小白点赞,是不是原创,是不是抄袭别人等等。当然,也有很多网友支持鼓励。不管是表扬还是批评,苏南都非常感谢您,是您让我认识到了自己的不足和优缺点。 大家的留言让我想起了刚开始接触前端时的难过。我基本上是自己学的,没有人指导。当我遇到问题时,我就像一只无头苍蝇。我在互联网上到处搜索。百度从来没有骗过我。一个接一个地点击广告,翻了十几八页,终于找到了解决问题的办法。 我痴迷于前端的热爱。我经常在一个问题上卡到深夜。刚入前端的时候,曾经感叹在编辑器里写点东西,在网页上运行。甚至感叹js写了一个alerthelloworld。浏览器会自动弹出一个窗口,感觉整个世界都在向你招手,那时候的兴奋是无法形容的,甚至幻想着未来的某一天,可能会有几千万、几亿的用户,使用你写的东西。 这几天一直在想,要不要继续写这个插件的总结?从写博客到今天,快两个月了,还是个新人。虽然做了几年技术,但不敢说自己牛逼。写博客的初衷是了解自己在工作中遇到的问题/经验。等等做个总结,俗话说:好记性不如烂笔头;同时也希望把自己遇到的问题和陷阱分享给大家,让遇到同样问题的朋友少走一点弯路。 终于,想了半天,终于明白,没有人是完美的,每个人的性格不同,面孔不同,无论你做什么,总会有不同的声音,无论你分享什么,都有永远是需要它的人。所以走自己的路,让别人打车,坚持自己想要的,努力成为自己想成为的,这就是对自己最大的肯定————对刚入前端的我们。做自己想做的事,爱一个值得的人;成为自己喜欢的样子,让自己发光!元气满满,最充实的日子就是最好的!大家早上好,这里是@IT·平头哥联盟,我是首席填坑官?苏楠,用心分享,共同成长,做温暖的攻城狮。 :honeyBadger8,群:912594095mini-css-extract-plugincss-extraction,看名字就是用来提取css的。在此之前,我们可能会更多地使用extract-text-webpack-plugin。两者的优势是什么?extract-text-webpack-plugin根据您创建的实例提取css或配置多个入口块。比如你配置一个入口文件,所有的css都会被提取到一个style文件中。如果你创建了多个extract-text-webpack-plugin实例,会生成多个css文件,而mini-css-extract-plugin,默认会将你的样式模块化,嗯,有点和output里的配置一样,异步按需加载,不再只是js的特权;//extract-text-webpack-plugin编译打包config.module.rules.push({test:/\.(scss|css)$/,use:ExtractTextPlugin.autoprefixer')({//添加前缀浏览器:CSS_BROWSERS,}),]],minimize:true},},"sass-loader"]})})config.plugins.push(newExtractTextPlugin({filename:'css/[name].css',disable:false,allChunks:true,}));//mini-css-extract-plugin编译打包config.module.rules.push({test:/\.(scss|css)$/,//处理css/scss同时使用:[{loader:MiniCssExtractPlugin.loader,},"css-loader",//cssprocessor{loader:'postcss-loader',/*postcss这个插件的作用是和现有的工具集成,在很少的情况下单独使用,我们使用最多的常见的是用autoprefixer添加各个浏览器的前缀,以达到更好的兼容性。更深入一点的是cssnext,它允许开发者自定义属性和变量:color:var(--theme-color,#42b983);*/options:{plugins:[require('autoprefixer')({browsers:CSS_BROWSERS,}),],},},"sass-loader"//sass处理器,即使你也可以加一个less处理器]})config.plugins.push(newMiniCssExtractPlugin({filename:'css/[name].css',//这里的配置与输出一致chunkFilename:'css/[id][chunkhash:8].css',}));config.plugins.push(newOptimizeCssAssetsPlugin({}));//上面例子中已经使用了压缩文件optimize-css-assets-webpack-plugin,它的作用是压缩css文件,assetNameRegExp:默认是所有的css都会被压缩,这个字段可以指定一些文件到被处理,cssProcessor:指定一个处理器来优化css,默认cssnano,cssProcessorPluginOptions:cssProcessor后面可以跟一个process方法,会返回一个promise对象,而cssProcessorPluginOptions是一个options参数选项!canPrint:Boolean,是否在控制台显示编译后的信息,没发现有什么用!陷阱:建议使用更高版本的包。之前低版本遇到了各浏览器样式丢失和前缀被杀的问题。newOptimizeCssAssetsPlugin({assetNameRegExp:/\.optimize\.css$/g,cssProcessor:require('cssnano'),cssProcessorPluginOptions:{preset:['default',{discardComments:{removeAll:true}}],//自动前缀:{browsers:CSS_BROWSERS},也可以指定前缀},canPrint:true})SplitChunksPlugin,RuntimeChunkPlugin它们与上一篇优化配置下的splitChunks和runtimeChunk基本相同;SplitChunksPlugin和RuntimeChunkPlugin实际上是webpack4之前CommonsChunkPlugin的替代品,用于提取一些公共模块;chunks:要处理的类型,一共有三个Value:all,async,initialminSize:最小尺寸maxSize:最大包尺寸,超过一个新包的尺寸minChunks:必须至少被引用N次的模块,maxAsyncRequests:最大数量按需加载的并行请求数maxInitialRequests:初始化加载请求的最大数量newwebpack.optimize.SplitChunksPlugin({chunks:'async',minSize:30000,maxSize:0,minChunks:1,maxAsyncRequests:1,maxInitialRequests:1,name:true,//可以指定...,}),newwebpack.optimize.RuntimeChunkPlugin({name:'manifest',name:entrypoint=>`runtimechunk~${entrypoint.name}`//动态文件名})HotModuleReplacementPlugin热更新替换,替换不刷新重载页面编辑修改代码:它只会更新变化的内容,所以速度很快,几乎一变化,浏览器窗口的内容就已经更新了;使用HotModuleReplacementPlugin插件后,会暴露一个module.hot对象,它下面有很多属性:accept:有两个参数,一个是授权模块(可以直接是单个文件路径,也可以是包含的数组多个文件路径),第二个参数为回调函数,即更新后要做的逻辑处理decline有点黑名单的意思,就是忽略一些模块,不更新。状态当前有updated、idle、check、prepare、ready、dispose、apply、fail等;一般只有accept用的最多,下面有个例子;newwebpack.HotModuleReplacementPlugin()//路由入口页面...if(module.hot){module.hot.accept(['./pages/routes'],(err)=>{constNextRoute=require('./pages/routes')//从DOM中移除挂载的React组件并重新加载ReactDOM.unmountComponentAtNode(APP_DOM);ReactDOM.render(
