解决vue-cli中webpack无法打包js变量中的图片路径

2 篇文章 0 订阅
2 篇文章 0 订阅

首先,我们先来重现一下问题,如果直接通过路径的形式引入一个图片,例如:

<template>
  <div id="app">
    <img src="./assets/demo.jpg">
    <!--<img :src="demo">-->
    <HelloWorld/>
  </div>
</template>
假设在src的asstes目录下有一个叫demo的图片(且假设这个图片比较大,不会被base64压缩),在这种情况下,图片是可以正常显示的。但是有些时候,我们需要以js变量的形式引入一个图片的路径,此时,问题就来了。
<template>
  <div id="app">
    <img src="./assets/demo.jpg">
    {{demo}}
    <img :src="demo" alt="暂时无法显示图片">
    <HelloWorld/>
  </div>
</template>

<script>
  export default {
    name: 'App',
    data: () => ({
      src: './assets/demo.jpg'
    })
  }
</script>

程序运行的效果如下图所示:


可以看到,明明路径是一样的,可是就是显示不出图片,我通过Segmentfault查阅资料,得知,此时经过JS变量引入的图片是没有经过webpack打包压缩的,我们通过npm run build来证明我们的结论。


假如我们把代码还原成以<img  src="./assets/demo.jpg" />的形式,先rm -rf dist删除打包出来的目录,然后重新打包,

结果为:


因此,证明了文件没有经过webpack打包。

解决方法很简单:

<template>
  <div id="app">
    {{src}}
    <img :src="src" alt="暂时无法显示图片">
    <HelloWorld/>
  </div>
</template>

<script>
  const src = require('./assets/demo.jpg');
  export default {
    name: 'App',
    data: () => ({
      src
    })
  }
</script>

这就是所谓的CommonJS风格,还有一种解决方案,使用ES6的import函数,同样可以解决这个问题。

<template>
  <div id="app">
    {{src}}
    <img :src="src" alt="暂时无法显示图片">
  </div>
</template>

<script>
  let srcLoad = () => import('./assets/demo.jpg');
  export default {
    name: 'App',
    data: () => ({
      src: ''
    }),
    created () {
      console.log(srcLoad)
//      ƒ srcLoad() {
//        return __webpack_require__.e/* import() */(1).then(__webpack_require__.bind(null, "./src/assets/demo.jpg"));
//      }
      srcLoad().then( i => {
        this.src = i
      })
    }
  }
</script>

ES6的Import不仅可以进行模块的导入导出,还可以引入一个资源,该函数返回的是一个Promise对象,在then方法中可以获得资源的路径。另外一个就是import只能引入静态资源,不能进行JS字符串的拼接。我们基于require的语法继续扩展一下,大家可以尝试配置一个json-loader,把所以需要JS变量引入的图片路径全部配置到里面去,然后通过require()动态的获取。

补充:webpack采用的是CommonJS语法,从这个console打印的内容确实可以看出。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值