由浅入深学习webpack+vue全家桶,实现知乎日报--webpack创建基本项目步骤(第五节)使用url-loader和file-loader

在前边的文章介绍过webpack如何将.css文件的代码插入到html页面(style-loadercss-loader)、将散落在项目各地的css代码合并到一个index.css文件里进行统一管理(extract-text-webpack-plugin)、对.vue文件进行编译(vue-loadervue-style-loaderbabel等)。除了这些功能之外,webpack还支持对图片、字体等文件的处理,本节介绍url-loaderfile-loader的简单配置。

1. 安装依赖:

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

2. 修改webpack.config.js,代码如下:

//部分代码省略
module: {
    rules: [{
        test: /\.(gif|png|jpg|jpeg|woff|svg|ttf)\??.*$/,
        use: [{
            loader: 'url-loader',
            options: {
                limit: 102400
            }
        }]
    }]
}

这个配置的含义是:当webpack编译以.gif、.png、.jpg、.jpeg、.woff、.svg、.ttf结尾的文件时,使用"url-loader"加载,limit: 102400表示当文件体积小于100kb时,使用base64的形式加载,不会生成一个文件。

3. 在根目录中新建文件夹img,移入一个100kb以内的图片命名为test.jpg,在app.vue中引用,代码如下:

<template>
    <div>
        <p>app.vue img</p>
        <img src="./img/test.jpg" class="img" />
        <vTitle></vTitle>
        <vCount v-model="count"></vCount>
        <p>app.vue count {{count}}</p>
    </div>
</template>
# js代码不变
# css代码省略

4. 启动项目,看到如下效果:

image.png

可以看到,图片正常加载,并以base64形式加载。

5. 其他加载方式

图片除了使用<img/>的src属性直接引用文件以外,还可以使用import方式加载。在title.vue中使用该方法加载,修改代码:

<template>
    <nav>
        <ul class="nav">
            <li
                v-for="(item, idx) in navs"
                :key="idx"
                :value="item.value"
                :class="{'active': idx === 0}"
            >
                <a href="javascript:void(0);">{{item.text}}</a>
            </li>
        </ul>
        <p>title.vue img</p>
        <img :src="img" alt="" srcset=""> 
    </nav>
</template>

<script>
//引入图片
import img from '../img/test.jpg'
export default {
  data() {
    return {
      navs: [
          {
              text: '新闻',
              vaule: 'news'
          },
          {
              text: '视频',
              vaule: 'videos'
          },
          {
              text: '生活',
              vaule: 'life'
          }
      ],
      //声明img
      img
    };
  },
}
# css代码省略
</script>

效果如下:

image.png

title.vue中通过import方式引入的图片也以base64的形式展示出来了。

6. 踩坑

app.vue和title.vue中引入图片的路径都是相对路径,最终图片都以base64方式展示,如果使用绝对路径会成功吗?
再次修改title.vue,代码如下:

<template>
   <nav>
       <ul class="nav">
           <li
               v-for="(item, idx) in navs"
               :key="idx"
               :value="item.value"
               :class="{'active': idx === 0}"
           >
               <a href="javascript:void(0);">{{item.text}}</a>
           </li>
       </ul>
       <p>title.vue img</p>
       <img :src="img" alt="" srcset="">
       <div style="padding: 10px 50px">
           <p>img标签绝对路径</p>
           <img src="/img/test.jpg" />
           <p>import 绝对路径</p>
           <img :src="absSrc" />
       </div>
   </nav>
</template>

<script>
//引入图片
import img from '../img/test.jpg'
import absSrc from '@/test.jpg'
export default {
 data() {
   return {
     navs: [
         {
             text: '新闻',
             vaule: 'news'
         },
         {
             text: '视频',
             vaule: 'videos'
         },
         {
             text: '生活',
             vaule: 'life'
         }
     ],
     //声明img
     img,
     absSrc
   };
 },
}
</script>
#css代码省略

我们注意到这样一行代码:

import absSrc from '@/test.jpg'

这个是使用到了webpack的解析Resolve----使用"@"作为img文件夹的别名,这里我们需要给webpack.config.js加一个resolve参数:

var config = {
    //部分代码省略
    plugins: [
        new ExtractTextPlugin('index.css')
    ],
    resolve: {
        alias: {
            '@': require('path').resolve(__dirname, 'img') 
        }
    }
}

由于修改了配置文件,需要重新启动项目,效果如下:

image.png

很显然:通过<img />的src属性引用绝对路径的图片并未使用base64方式加载;使用import方式引用绝对路径的图片使用了base64加载。

7. 总结

  • 使用url-loader、file-loader可以对图片、字体文件进行转换。
  • url-loader在使用时可以配置相应的选项,如limit等,具体信息参考npm url-loader.
  • url-loader最终的目的是为了将图片以base64方式加载,引入的方式可以使用<img/>、import两种方式,但是<img/>的src属性直接引入的绝对路径则无法通过base64方式展示,即:
import img from "../img/test.jpg"
import absSrc from "@/test.jpg"
src引入方式 是否可以通过base64加载
<img src="相对路径">
<img src="绝对路径"> ×
<img :src="img">
<img :src="absSrc">
  • 使用"@"作为文件夹img的别名,需要配置webpack的解析Resolve属性。

完整代码github地址:https://github.com/zhiyuanMain/zhihu-daily

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容