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 相关文章推荐
javascript 对表格的行和列都能加亮显示
Dec 26 Javascript
js 距离某一时间点时间是多少实现代码
Oct 14 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
Mar 11 Javascript
jQuery滚动条插件nanoscroller使用指南
Apr 21 Javascript
一张Web前端的思维导图分享
Jul 03 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
Aug 04 Javascript
JS组件Bootstrap Select2使用方法详解
Apr 17 Javascript
JavaScript鼠标事件,点击鼠标右键,弹出div的简单实例
Aug 03 Javascript
js实现移动端编辑添加地址【模仿京东】
Apr 28 Javascript
jquery实现的简单轮播图功能【适合新手】
Aug 17 jQuery
JavaScript创建、读取和删除cookie
Sep 03 Javascript
Vue中多元素过渡特效的解决方案
Feb 05 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
解析PHP实现多进程并行执行脚本
2013/06/18 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
二级域名转向类
2006/11/09 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
js实现收缩菜单效果实例代码
2013/10/30 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
React Native之ListView实现九宫格效果的示例
2017/08/02 Javascript
[02:38]DOTA2亚洲邀请赛 IG战队巡礼
2015/02/03 DOTA
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
python使用递归的方式建立二叉树
2019/07/03 Python
Django实现auth模块下的登录注册与注销功能
2019/10/10 Python
Python numpy线性代数用法实例解析
2019/11/15 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
Python实现手势识别
2020/10/21 Python
python 实现音频叠加的示例
2020/10/29 Python
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
ANINE BING官方网站:奢华的衣橱基本款和时尚永恒的单品
2019/11/26 全球购物
GWT (Google Web Toolkit)有哪些主要的原件组成?
2015/06/08 面试题
师范生实习的个人自我鉴定
2013/10/20 职场文书
市场营销专业毕业生自荐信
2013/11/02 职场文书
入党自荐书范文
2014/03/09 职场文书
2014年银行客户经理工作总结
2014/11/12 职场文书
优秀班主任申报材料
2014/12/16 职场文书
中考百日冲刺决心书
2015/09/22 职场文书
2016年国培研修日志
2015/11/13 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
导游词之云南-元阳梯田
2019/10/08 职场文书