最近在学习webpack打包图片资源(background-image)时出现了一些问题
一般来说使用webpack进行对图片的打包处理需要下载两个依赖,file-loader和url-loader
url-loader是依赖于file-loader的基础上的扩展,其可以将设置的limit大小的图片转化为base64格式,这样可以减少http的请求次数,减轻服务器的压力。
但是在我使用url-loader进行打包时却发现我的每张图片资源都打包了两次,而且有一张不能显示,打开不显示的图片二进制后内容是:export default __webpack_public_path__ ...(图片名称)
而且打包后的index.html里面引入的图片地址正是这张打不开的图片路径。
这是我的webpack版本
在搜集众多资料之后发现罪魁祸首居然是css-loader这个鬼东西,在某一次的版本更新中,css-loader推出了打包图片的新功能
这是我的css-loader版本
所以我们在对背景图片的引入打包处理时可以不再需要使用url-loader了
同样的对于页面上的图片的引入我们之前的方法是使用html-loader并且要将url-loader的esModule设置为false,因为我们的html-loader引入图片使用的是commonjs,而url-loader默认使用es6模块化解析,如果不设置为false打包后的图片路径会出现 [object Module]。
但是现在因为css-loader的更新,我们可以直接使用html-loader去对图片的引入进行一个打包而不需要进行其他的操作处理。
更新一下
因为在后面的研究中想对打包后的图片进行重命名,可是css-loader并不支持呀!怎么办呢,也意识到上面的处理方法并不是一个完美的方案,于是又经过一下午的摸索找到了完美的解决方案,依旧是使用我们的url-loader。
先上代码
可以看到红色框框里面添加的type属性,这里很关键!
同时使用url-loader和css-loader的时候就会出现一开始碰到的问题,在取消了css-loader的url属性后又会发现我们的图片路径引入错误。所以我猜测可能是两个模块之间的功能发生冲突了,所以加上我们最重要的属性type后发现我们已经完美打包了~图片资源也不会出现重复打包的现象。
更新一下
在后续学习webpack打包过程中突然发现我使用的是webpack5!然后回过头来看图片资源的打包,发现了上面只是对webpack5使用之前版本的打包方式的冲突解决。
而在我们的webpack5版本中已经可以不需要使用url-loader和file-loader了(字体图标的打包也是)
直接使用我们webpack5的asset-module,直接放上代码