3.2.3 webpack图片等资源的处理 file-loader|url-loader|img-loader

Posted SlightFly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.2.3 webpack图片等资源的处理 file-loader|url-loader|img-loader相关的知识,希望对你有一定的参考价值。

如果引入除了 js 之外的内容,必须使用 loader 去处理,否则会报错 “Unexpected character ‘口’”  --- 不认识

1、需要用到的 loader

file-loader    //能够正确引入图片,直接引入图片会报错

url-loader     //包含file-loader,在此基础上增加了图片转base64等功能  

img-loader     //处理图片专用,图片的压缩等功能

 2、file-loader - ->  命名 和 路径

{ // 图片
    test: /\\.(png|jpg|jpeg|gif)$/,
    use: [
       {
         loader: \'file-loader\'
       }
    ]
}  

处理完成的名字 都是一长串的hash,,如何给hash命名? -- 需要file-loader的配置

{ // 图片
    test: /\\.(png|jpg|jpeg|gif)$/,
    use: [
       {
         loader: \'file-loader\',
         options: {
            //[hash].[ext] -- 默认
            name: \'[name].[hash:4].[ext]\', //.[ext]文件类型后缀,,png|jpg|...
         }
       }
    ]
} 

{ // 图片
        test: /\\.(png|jpg|jpeg|gif)$/,
        use: [
          {
            loader: \'file-loader\',
            options: {
              //[hash].[ext] -- 默认
              name: \'[name].[hash:4].[ext]\', //.[ext]文件类型后缀,,png|jpg|...
              outputPath: \'assets/img\', //图片相对于dist目录的输出路径  dist下面的 -asset下的 -img下
              publicPath: \'aaaaaaaaaaaaaa\', //告诉你资源应该去哪找,决定引用路径,,,js也有
            }
          }
        ]
} 


3、url-loader 

use: [
      {
            loader: \'url-loader\', //将资源转换成 base64
            options: {
              //[hash].[ext] -- 默认
              name: \'[name].[hash:4].[ext]\', //.[ext]文件类型后缀,,png|jpg|...
              outputPath: \'assets/img\', //图片相对于dist目录的输出路径  dist下面的 -asset下的 -img下
              publicPath: \'assets/img\', //告诉你资源应该去哪找
              limit: 5000 //不设置limit,一张图片都没有打包,,全部将图片转成 base64,设置为5000,图片可以成功打包
              /**
               * 为什么要把图片转成base64? 可以减少资源请求
               * 为什么要设置大小? 如果图片很大,css体积过大,下载较慢,首屏加载效果体验差 ,,,浏览器正常可以异步加载
               * 建议设置为5000,即小于5kb的可以转换成base64,大于5kb的采用异步加载
               */
            }
      }
]

4、img-loader

{
            loader:\'img-loader\', //img-loader本身没有任何作用,功能是靠options中配置一系列插件来完成
            options: {
              /**
               * imagemin
               * imagemin-pngquant imagemin-mozjepg imagemin-gifsicle
               */
              plugins: [
                require(\'imagemin-pngquant\')({
                  speed: 2 //1-11  压缩的程度,值越大,压缩损失 越小,,一般选取2-4之间
                }),
                require(\'imagemin-mozjpeg\')({
                  quality: 80 //1-100,,一般选取60-80
                }),
                require(\'imagemin-gifsicle\')({
                  optimizationLevel: 1 //1,2,3 越大压缩越狠
                })
              ]
            }
}

 5、js中引入图片

app.js

 import img1 from "./assets/img/img1.png";
 var img =new Image(); //不能直接写路径,imh-loader不会处理,必须import进来
 img.src=img1;
 document.getElementById(\'mydiv\').appendChild(img);

6、html中引入图片

1)模板字符串

<!-- 
    同样,不能直接写入路径,webpack不会处理
    webpack中可以在html里面写模板字符串ejs
  需要注意插件版本 file-loader 4.2、4.1版本
  模板字符串
--> <img src="${require(\'./assets/img/img4.jpg\')}"/>
new htmlWebpackPlugin({
      filename:"index.html",
      template:"./src/index.html",
      aa: 11111
})
 <div>${htmlWebpackPlugin.options.aa}</div>  页面显示为11111

2)配置html-loader  --需要对内容进行统一的处理

 

<img src="./assets/img/img4.jpg"/>
{ //html-loader
    test: /\\.html$/,
    use: {
        loader: \'html-loader\'
    }
}
// 问题:图片懒加载,将路径写在data-src下
<img src=\'\' data-src="./assets/img/img4.jpg"/>
{ //html-loader
        test: /\\.html$/,
        use: {
          loader: \'html-loader\',
          options: {
            attrs: ["img: data-src","video: aaa"] //对img下的data-src属性进行处理,对video下的aaa属性进行处理
          }
        }
} 

7、雪碧图

/*
1、拼图
2、我们的css得去定位图片  -- 根据原图大小定位,,导致图片定位不完美
3、不完美-没有完美的雪碧图  -- 除非是完美定制的图片
*/

1)postcss-sprites -- 属于postcss-loader的插件,会自动把 css 文件中的所有背景图合成雪碧图,并修改css文件

{
    loader:"postcss-loader",
    options:{
          plugins: [
                require(\'postcss-sprites\')()
          ]
    }
}

2)webpack-spritesmith -- 属于一个独立的插件,会按照指定的路径的指定图片,生成一个雪碧图,和一个雪碧图相关的css,不会修改原css

const webpackSpriteSmith=require(\'webpack-spritesmith\')
new webpackSpriteSmith({
      src: { //来源
        cwd: path.join(__dirname,"src/assets/img"),//配置路径,对该路径下的文件进行处理
        glob: "*.jpg" //处理的图片类型
      },
      target: { //打包到哪
        image: path.join(__dirname, \'dist/assets/sprites/sprites.png\'),//生成图片的路径
        css: path.join(__dirname, \'dist/assets/sprites/sprites.css\'),//生成css的路径
      },
      apiOptions: { //告诉去哪找图
        cssImageRef: \'./sprites/sprites.png\'
      }
})

8、其他资源文件的处理

// 所有的资源处理都是一个样   
==》 定义test规则  -->  使用url-loader或者file-loader  -->  规划路径
<video src="./assets/video/dx.mp4"></video>
{ //html-loader
        test: /\\.html$/,
        use: {
          loader: \'html-loader\',
          options: {
            attrs: ["img: data-src","video: src"] //对img下的data-src属性进行处理,对video下的src属性进行处理
          }
        }
      },
      {
        test: /\\.pm4$/,
        use: {
          loader: \'url-loader\', //会自动转换为base64,,同样可以使用limit不转换视频
        }
} 

 

查问题的时候搜到的,总结的就一个字,棒!!!https://segmentfault.com/a/1190000019132609?utm_source=tag-newest

以上是关于3.2.3 webpack图片等资源的处理 file-loader|url-loader|img-loader的主要内容,如果未能解决你的问题,请参考以下文章

好用的打包工具webpack

webpack总结

前端模块打包之Webpack

浅谈Webpack

webpack2使用ch10-处理图片(png jpg svg 等) 限制图片 压缩图片

webpack