走近webpack(3)–图片的处理[通俗易懂]

上一章,咱们学了如何用webpack来打包css,压缩js等。这一篇文章咱们来学习一下如何用webpack来处理图片。废话不多说,咱们开始吧。首先,咱们随便找一张你喜欢的图片放到src/images

大家好,又见面了,我是你们的朋友全栈君。

  上一章,咱们学了如何用webpack来打包css,压缩js等。这一篇文章咱们来学习一下如何用webpack来处理图片。废话不多说,咱们开始吧。

  首先,咱们随便找一张你喜欢的图片放到src/images目录下,然后把图片设置为背景图片,代码是这个样子。

src/index.html:

<div id="title"></div>
<div id="name"></div>
<div id="img"></div>
<script src="./entry1.js"></script>
<script src="./entry2.js"></script>

src/css/index.css:

body{
   background:red; 
}
#title{
  background:orange;  
  color:blue;      
}
#img{
    background: url(../images/dog.jpg);
    width: 500px;
    height: 500px;
}

  ok,我们写完了代码,现在webpack是无法解析的,我们可以打包试一下,发现会报错。嗯,没有加入loader肯定会报错的!

  那么,接下来我们来安装一下打包图片需要用到的loader:

npm install --save-dev file-loader url-loader

  在等待安装之际,我们先解释一下这两个loader分别都是做什么的:

  file-loader:解决引用路径的问题,拿background样式用url引入背景图来说,我们都知道,webpack最终会将各个模块打包成一个文件,因此我们样式中的url路径是相对入口html页面的,而不是相对于原始css文件所在的路径的。这就会导致图片引入失败。这个问题是用file-loader解决的,file-loader可以解析项目中的url引入(不仅限于css),根据我们的配置,将图片拷贝到相应的路径,再根据我们的配置,修改打包后文件引用路径,使之指向正确的文件。

  url-loader:如果图片较多,会发很多http请求,会降低页面性能。这个问题可以通过url-loader解决。url-loader会将引入的图片编码,生成dataURl。相当于把图片数据翻译成一串字符。再把这串字符打包到文件中,最终只需要引入这个文件就能访问图片了。当然,如果图片较大,编码会消耗性能。因此url-loader提供了一个limit参数,小于limit字节的文件会被转为DataURl,大于limit的还会使用file-loader进行copy。其实简单来说,url-loader的作用就是根据配置来判断图片是否需要转换成字符串编码,来使项目的性能和速度更快。

  那么,接下来我们在module中配置一下loader,现在我们的module看起来是这样的,其中limit参数就是用来判断需要把图片转换成字符串编码的大小范围,单位是B。

module:{
        rules: [
            {
              test: /\.css$/,
              use: [ 'style-loader', 'css-loader' ]
            },{
               test:/\.(png|jpg|gif)/ ,
               use:[{
                   loader:'url-loader',
                   options:{
                       limit:500000
                   }
               }]
            }
          ]
    },

  唉?不对啊,你安装了两个loader,为什么只用了url-loader啊?!因为url-loader内置了file-loader。这里安装file-loader是为了方便下面用到的时候不用再安装了。

  OK,咱们来打包一下看看会发生什么吧。打开页面发现我们引入的图片已经显示了。

  下面说一下怎么把css从js中分离出来,我们上面的css都是通过import引入到js中再进行打包的,这样不利于维护,也违背了js,css,html互相分离的基本原则。但是一旦分离了css,那么原本的图片路径就会出现问题。我们下面来解决一下。但是webpack官方认为css就应该打包进js中以减少http请求。所以,仁者见仁智者见智,怎么做看具体情况来选择吧。

  其实要解决这个问题很简单,用插件,extract–text–webpack–plugin。怎么安装就不说了,已经说了好多遍了,跟上面的安装方法一样,改个名字而已。

  既然是插件,我们就需要在config中引入并且new一个实例之后才可以使用:

module:{
    rules: [
        {
          test: /\.css$/,
/*修改了一下使用的方式*/ use: extractTextPlugin.extract({ fallback: "style-loader", use: "css-loader" }) },{
           test:/\.(png|jpg|gif)/ ,
           use:[{
               loader:'url-loader',
               options:{
                   limit:500000
               }
           }]
        }
      ]
},
//插件,用于生产模版和各项功能
plugins:[
    new uglify(),
    new htmlPlugin({
        minify:{
            removeAttributeQuotes:true
        },
        hash:true,
        template:'./src/index.html'
       
    }),
/*这里new了一个插件的实例*/
    new extractTextPlugin("css/index.css")
],

  ok,我们兴致勃勃地去打包一下,竟然报错了,报错的主要原因是extract–text–webpack–plugin当前还没有支持webpack4.x,那么我们该怎么办呢?别急,咱们想想办法解决:

npm install --save-dev extract-text-webpack-plugin@next
/*更新版本*/

  这样就可以打包了,但是我们打包完成之后发现index.html并没有引入相应的css,页面没有任何css,别急,我们来进行下一步解决这个问题。

  我们在config中定义一个路径变量:

var webpath={
    publicPath:"http://192.168.199.124:9090/"
}
/*就是你在devServer中定义的host和端口*/

  然后在output属性中定义一个publicPath属性:

output:{
    path:path.resolve(__dirname,'dist'),
    filename:'[name].js',
    publicPath:webpath.publicPath
},

  并且要把之前配置在devServer中的host修改成你自己的本机host,我的是http://192.168.199.124,如果你不知道,可以在cmd中使用ipconfig来查询。

  然后,我们npm run server一下,发现打开的页面已经有图片和样式了。

  那么我们就学会了如何处理css中的图片问题,下面我们学习一下如何处理html中的图片(也是用插件,各种插件,你可以去github随便找一个你喜欢的可以处理这中问题类型的插件):

  这里我们使用html–withimg–loader,然后在config中如下配置:

npm install html-withimg-loader --save
/*因为在生产环节中也需要用到,所以使用--save命令*/
{
    test: /\.(htm|html)$/i,
     use:[ 'html-withimg-loader'] 
}

  完事了。。。。。。简单吧。

  前边的内容,打包后的图片并没有放到images文件夹下,要放到images文件夹下,其实只需要配置我们的url-loader选项就可以了。前面也说到了,要限制limit的大小,不然图片在小于limit的范围内会进行转码,咱们来小小的修改下代码就可以了:

{
   test:/\.(png|jpg|gif)/ ,
   use:[{
       loader:'url-loader',
       options:{
           limit:500,
           outputPath:'images/'
       }
   }]
}

  我们在src/index.html中加入一个图片的引入:

<div id="title"></div>
<div id="name"></div>
<div id="img"></div>
<!-- 通过src引入图片 -->
<img id="htmlImg" src="./images/dog.jpg">

  然后在src/css/index.css下写上这样的css:

body{
   background:red; 
}
#title{
  background:orange;  
  color:blue;      
}
#img{
    background: url(../images/dog.jpg);
    width: 500px;
    height: 500px;
}
/*设置图片大小*/
#htmlImg{
    width: 500px;
    height: 500px;
}

  然后我们npm run server一下看看结果吧。这里说明一下,可能细心的小伙伴会问,为什么以前打包用npm run build 而这里用npm run server呢?

  通常情况下,我们有两种环境,一种是dev,一种是prod,也就是开发环境和生产环境,一般在开发环境下,我们本地会通过webpack-dev-server通过express起一个node服务器,而不是真正的打包,而我们以前所一起学习的webpack使用方法即包含了开发环境下的需求,又有生产环境下的内容,当我们要把整个项目打包上线的时候,我们会压缩js,压缩图片,整合资源以减少http请求,但是我们在开发环境下的时候,往往需要更多的功能以使代码更容易阅读和debug。再有就是,我们在引入图片的时候,用的是绝对地址,也就是node起服务器后你本地的ip地址,如果不通过npm run server起本地服务器,是无法找到图片的。有兴趣的小伙伴可以试试npm run build然后手动打开dist下的html看看效果。

  至此,图片的处理方式就结束了。下一章咱们来看看怎么处理less啊,sass这样的css预编译语言,毕竟现在很少用css来写样式了。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/124438.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java四舍五入_Java几种常见的四舍五入的方法

    java四舍五入_Java几种常见的四舍五入的方法展开全部下面给你介绍3种常见的四舍五入://方式e68a8462616964757a686964616f31333365653764一:BigDecimal方式doublef=3.1315;BigDecimalb=newBigDecimal(newDouble(f).toString);doublef1=b.setScale(3,BigDecimal.ROUND_HALF…

    2022年7月7日
  • MacBook Pro最全快捷键指南——高效型选手必备

    MacBook Pro最全快捷键指南——高效型选手必备剪切、拷贝、粘贴和其他常用快捷键Command-X:剪切所选项并拷贝到剪贴板。Command-C:将所选项拷贝到剪贴板。Command-V:将剪贴板的内容粘贴到当前文稿或应用中。Command-Z:撤销前一个命令。随后您可以按Command-Shift-Z来重做,从而反向执行撤销命令。Command-A:全选各项。Command-F:查找文稿中的项目或打开“查找”窗…

    2022年5月25日
  • CBAM:Convolutional Block Attention Module流程详解及Pytorch实现

    CBAM:Convolutional Block Attention Module流程详解及Pytorch实现CBAM结构详解及Pytorch实现

    2022年9月15日
  • vue 组件插槽_vue插槽的使用

    vue 组件插槽_vue插槽的使用插槽应用场景当封装一个组件后,内部有一些地方待定功能暴露给外界来写。就好比于el-table中的单个表格内部可能是下拉框,或者是一些文本输入。需要用template来嵌套使用子组件<template><div><divv-for=”iteminarrData”:key=”item.id”><slotname=”todo”:row=”item”></slot><

    2022年9月23日
  • SQL中declare_hive变量赋值

    SQL中declare_hive变量赋值平时写SQL查询、存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量的作用域的兴趣。大家都知道c#中的局部变量,在if中如果我们定义一个变量的话他的作用到if结束为止,if外是不识别这个变量的,else里都不能使用,简单的写一下。

    2022年8月20日
  • 强化学习 模仿学习 于robot[通俗易懂]

    强化学习 模仿学习 于robot[通俗易懂]写在前面:分享知识是再好不过的事情。这篇文章主要是总结自己最近看的一些文章以及相关知识。自己在暑假实习的时候学习的就是在物理仿真平台上做robot的强化学习,未来读PhD的时候也被老师继续分配到了这个方向,哈哈。可能要一直从入门到入土了,趁着最近写researchproposal的时候,将最近的理解记录一下。鉴于笔者知识水平有限,若有不妥当之处,还请指出。摘要:robot强化学习模仿学…

    2022年9月19日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号