Vue 自定义标签的src属性不能使用相对路径的解决


Posted in Javascript onSeptember 17, 2019

场景

吾辈在使用 Vuetify 时突然遇到的,明明 img 标签就可以使用相对路径获取到图片,而 Veutify 的组件 v-img 却不能使用。

如下面 3 种加载图片的方式

<!-- 正常加载 -->
<v-img :src="require('../../assets/logo.png')" />
<!-- 无法加载 -->
<v-img src="../../assets/logo.png" />
<!-- 正常加载 -->
<img src="../../assets/logo.png" />
吾辈在 segmentfault 上的提问

原因

是的,居然必须用 require() 引入图片才能生效,那为什么 img 标签可以直接使用相对路径呢?这和 vue-loader 资源路径处理 有关系。

Vue 自定义标签的src属性不能使用相对路径的解决

官方明确指出会将所有资源路径作为模块依赖,也就是后台 vue-loader 帮我们转换成 require() 的形式了。

解决方案

vue cli 3

vue cli 3 的配置项 API 发生了改变,由 transformToRequire 改为 transformAssetUrls,而且配置方式也不再是直接修改 webpack 配置文件,而是修改 vue.config.js 这个经过包装后的文件。现在,最新的配置方式如下

module.exports = {
 chainWebpack: config => {
  config.module
   .rule('vue')
   .use('vue-loader')
   .loader('vue-loader')
   .tap(options => {
    return {
     ...options,
     //修复静态资源引用的问题 vue cli 2 => vue cli 3 升级之后配置项由 transformToRequire 改为 transformAssetUrls
     transformAssetUrls: {
      video: ['src', 'poster'],
      source: 'src',
      img: 'src',
      image: 'xlink:href',
      // 在这里添加需要使用静态资源的自定义元素
      'a-avatar': 'src',
     },
    }
   })
 },
}
具体参考
Vue Loader => 从 v14 迁移 => 废弃的选项
Vue Cli 3 => webpack 相关 => 链式操作 (高级) => 修改 Loader 选项

vue cli 2

那么,Veutify 组件中的 src 不能使用相对路径的原因就很明确了。因为 vue-loader 并不知道我们要把 v-imgsrc 属性转换成 require() 依赖。我们找到 vue-loader 配置处,在 options.transformToRequire 中加上 v-img 即可

// vuetify 框架的 src 标签也需要自动转换为 require
'v-img': 'src'

吾辈的配置文件在 build > vue-loader.conf.js

'use strict'
const utils = require('./utils')
const config = require('../config')
const isProduction = process.env.NODE_ENV === 'production'
const sourceMapEnabled = isProduction
 ? config.build.productionSourceMap
 : config.dev.cssSourceMap

module.exports = {
 loaders: utils.cssLoaders({
  sourceMap: sourceMapEnabled,
  extract: isProduction,
 }),
 cssSourceMap: sourceMapEnabled,
 cacheBusting: config.dev.cacheBusting,
 transformToRequire: {
  video: ['src', 'poster'],
  source: 'src',
  img: 'src',
  image: 'xlink:href',
  'v-img': 'src',
 },
}
vue-loader 官方文档参考

然后重启 npm run dev 刷新一下就行啦

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js截取函数(indexOf,join等)
Sep 01 Javascript
自己写了一个展开和收起的多更能型的js效果
Mar 05 Javascript
javascript获取dom的下一个节点方法
Sep 05 Javascript
javascript中数组的定义及使用实例
Jan 21 Javascript
JS运动框架之分享侧边栏动画实例
Mar 03 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
Jan 19 Javascript
基于javascript实现页面加载loading效果
Sep 15 Javascript
jQuery使用deferreds串行多个ajax请求
Aug 22 Javascript
手写Node静态资源服务器的实现方法
Mar 20 Javascript
一篇文章,教你学会Vue CLI 插件开发
Apr 17 Javascript
js贪心算法 钱币找零问题代码实例
Sep 11 Javascript
JavaScript利用键盘码控制div移动
Mar 19 Javascript
vue.js购物车添加商品组件的方法
Sep 17 #Javascript
关于vue项目中搜索节流的实现代码
Sep 17 #Javascript
Vue的生命周期操作示例
Sep 17 #Javascript
小程序两种滚动公告栏的实现方法
Sep 17 #Javascript
Vue Extends 扩展选项用法完整实例
Sep 17 #Javascript
react native 仿微信聊天室实例代码
Sep 17 #Javascript
Vue 自定义指令功能完整实例
Sep 17 #Javascript
You might like
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
php获取bing每日壁纸示例分享
2014/02/25 PHP
php获取从html表单传递数组的方法
2015/03/20 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
PHP FileSystem 文件系统常用api整理总结
2019/07/12 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
js小技巧--自动隐藏红叉叉
2007/08/13 Javascript
jquery next nextAll nextUntil siblings的区别介绍
2013/10/05 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
2014/08/15 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
Node.js读写文件之批量替换图片的实现方法
2016/09/07 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
2017/03/24 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
2019/01/20 Javascript
JS实现头条新闻的经典轮播图效果示例
2019/01/30 Javascript
python实现分析apache和nginx日志文件并输出访客ip列表的方法
2015/04/04 Python
在Docker上部署Python的Flask框架的教程
2015/04/08 Python
mac系统安装Python3初体验
2018/01/02 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
Python多图片合并PDF的方法
2019/01/03 Python
python里 super类的工作原理详解
2019/06/19 Python
Flask框架搭建虚拟环境的步骤分析
2019/12/21 Python
python爬虫scrapy图书分类实例讲解
2020/11/23 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
Kipling澳洲官网:购买凯浦林包包
2020/12/17 全球购物
配件采购员岗位职责
2013/12/03 职场文书
大学运动会通讯稿
2014/01/28 职场文书
师范学院美术系毕业生自我鉴定
2014/01/29 职场文书
微电影大赛策划方案
2014/06/05 职场文书
先进员工事迹材料
2014/12/20 职场文书
护理心得体会范文
2016/01/22 职场文书
python如何利用cv2模块读取显示保存图片
2021/06/04 Python