最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • vue如何动态加载本地图片

    正文概述 掘金(前端队长Daotin)   2021-07-22   1053

    大家好,我是前端队长Daotin,想要获取更多前端精彩内容,关注我(全网同名),解锁前端成长新姿势。

    以下正文:


    今天遇到一个在vue文件中引入本地图片的问题,于是有了这篇文章。

    通常,我们的一个img标签在html中是这么写的:

    <img src="../images/demo.png">
    
    

    这种写法只能引用相对路径下的图片。不能使用绝对路径。使用绝对路径的话,这类资源将会直接被拷贝,而不会经过 webpack 的处理。

    如果src是变量的话,我们一般会在data中定一个变量src进行动态绑定。

    <img :src="src">
    
    //data中定义变量src
    data() {
      return {
        src: '../images/demo.png' 
      }
    }
    
    

    然而这时候,会发现这个时候图片并没有被加载出来,图片没有显示出来,通过查看发现这张图片的地址显示 ../images/demo.png ,也就是说通过v-bind形式绑定的相对路径不会被webpack的file-loader处理,只会做简单的文本替换。

    那怎么办呢?

    解决方法

    1、将图片转**base64**格式

    <img src="data:image/png;base64,iVBYKIGloxxxxxxxxxxxxxxxxxxx...">
    
    

    一般图片比较小的可以这么做,比如图标icon等,大小一般在10KB以内的。

    2、使用**import**引入图片

    <img :src="src">
    
    //使用import引入
    import img from '../images/demo.png'
    
    //data中定义变量src
    data() {
      return {
        src: img 
      }
    }
    
    
    

    3、使用**require**动态加载

    <img :src="src">
    
    //data中定义变量src
    data() {
      return {
        src: require('../images/demo.png')
      }
    }
    
    
    

    4、引入**publicPath**并且将其拼接在路径中,实现引入路径的动态变动

    <img :src="publicPath + 'images/demo.jpg'" > // √
    // 编译后:
    <img src="/foo/images/demo.jpg" >
    <script>
    export default:{
        data(){
            return {
              publicPath: process.env.BASE_URL,
            }
        },
    }
    </script>
    
    

    vue.config.js中配置publicPath路径:

    //vue.config.js
    module.exports = {
        publicPath:'/foo/',
        ...
    }
    
    

    结论

    静态资源可以通过两种方式进行处理:

    • 在 JavaScript 被导入或在 template/CSS 中通过相对路径被引用。这类引用会被 webpack 处理。

    • 放置在 public 目录下或通过绝对路径被引用。这类资源将会直接被拷贝,而不会经过 webpack 的处理。

    原理

    从相对路径导入

    当你在 JavaScript、CSS 或 *.vue 文件中使用相对路径 (必须以 . 开头) 引用一个静态资源时,该资源将会被包含进入 webpack 的依赖图中。

    在其编译过程中,所有诸如 <img src="...">background: url(...) 和 CSS @import 的资源 URL 都会被解析为一个模块依赖

    绝对路径引入时,路径读取的是public文件夹中的资源,任何放置在 public 文件夹的静态资源都会被简单的复制到编译后的目录中,而不经过 webpack特殊处理。

    当你的应用被部署在一个域名的根路径上时,比如http://www.abc.com/,此时这种引入方式可以正常显示但是如果你的应用没有部署在域名的根部,那么你需要为你的 URL 配置 publicPath 前缀,publicPath 是部署应用包时的基本 URL,需要在 vue.config.js 中进行配置。

    扩展

    关于vue file-loader vs url-loader

    原文链接:www.cnblogs.com/weizaiyes/p…

    关于background url引入图片时

    按照上面理论,如果我采用相对路径的方式引入图片的话,webpack会对其require处理。

    background: url('./iphonexs.png') 0 0 no-repeat;
    
    

    实际上确实如此,我看到页面的背景变成:

    background: url(/resources/dist/images/iphonexs.a25bee7.png) 0 0 no-repeat;
    
    
    

    这是根据url-loader的配置处理的结果。

    或者采用动态style的方式:

    <div 
      :style="{'background': 'url(' + require('./iphonexs.png') + ') 0 0 no-repeat'}">
    </div>
    
    

    Reference

    • cli.vuejs.org/zh/guide/ht…

    • segmentfault.com/a/119000001…

    • github.com/vuejs/vue-c…

    (完)

    如果有问题可以帮我指出,感谢!

    --- End ---

    你好,我是前端队长Daotin,专注分享前端与认知。希望在这里,和你分享我的前端学习和工作经验,记录个人成长。

    想要获取更多前端精彩内容,关注我(全网同名),解锁前端成长新姿势。

    vue如何动态加载本地图片


    起源地下载网 » vue如何动态加载本地图片

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元