file-loade

前面说到打包图片文件需要使用file-loader,但是打包后的图片名是一串hash值而不是之前的文件名。

这时候就需要我们来配置一些参数:
https://v4.webpack.docschina.org/loaders/file-loader/#name

  1. module.exports = {
  2. // ...
  3. // 当你打包一个模块的时候就到这里查询相应的规则
  4. module: {
  5. rules: [{
  6. test: /\.jpg$/,
  7. use: {
  8. loader: "file-loader",
  9. options: {
  10. // name 标识当前的文件名,ext 表示当前的文件拓展名
  11. name: "[name].[ext]"
  12. }
  13. }
  14. }]
  15. }
  16. // ...
  17. }

另外我们还可以配置将打包后的图片单独存放到一个文件夹:
https://www.webpackjs.com/loaders/file-loader/#outputpath

  1. module.exports = {
  2. // ...
  3. // 当你打包一个模块的时候就到这里查询相应的规则
  4. module: {
  5. rules: [{
  6. test: /\.jpg$/,
  7. use: {
  8. loader: "file-loader",
  9. options: {
  10. name: "[name].[ext]",
  11. // publicPath 文件打包后的存放位置
  12. publicPath: "images/"
  13. }
  14. }
  15. }]
  16. }
  17. // ...
  18. }

url-loader

类似的还有url-loader,但是在文件大小(单位byte)低于指定的限制时,可以返回一个 DataURL
https://webpack.docschina.org/loaders/url-loader/
安装:

  1. $ npm install url-loader --save-dev

配置:

  1. module.exports = {
  2. // ...
  3. module: {
  4. rules: [{
  5. test: /\.jpg$/,
  6. use: {
  7. loader: "url-loader",
  8. }
  9. }]
  10. }
  11. // ...
  12. }

image.png
url-loader将图片转换为Base64的字符串,直接放到img标签的src属性中,而不是单独生成图片文件(简单说就是不会打包到dist文件夹中)。

这样做的好处就是:图片转换为JS代码,减少了一次http的请求。
但是还有个问题,如果这个图片特别的大,你的JS文件就会特别的大,你的JS加载时间就会变长。

如何解决呢?如果一个图片非常小我们就可以将它处理成Base64,相反图片非常大的话就输出到目录中。

  1. module.exports = {
  2. // ...
  3. use: {
  4. loader: "url-loader",
  5. options: {
  6. name:"[name]_[hash].[exe]",
  7. // 如果大于就输出到目录
  8. publicPath: "images/",
  9. // 如果图片小于2048(2kb)字节的话就处理成 base64 的字符串
  10. limit: 2048,
  11. }
  12. }
  13. // ...
  14. }