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的onchange事件与jQuery的change()方法比较
Sep 28 Javascript
JavaScript 三种创建对象的方法
Oct 16 Javascript
jquery异步调用页面后台方法&amp;#8207;(asp.net)
Mar 01 Javascript
getComputedStyle与currentStyle获取样式(style/class)
Mar 19 Javascript
解决Extjs4中form表单提交后无法进入success函数问题
Nov 26 Javascript
jquery实现邮箱自动补全功能示例分享
Feb 17 Javascript
JQuery each()嵌套使用小结
Apr 18 Javascript
jquery实现选中单选按钮下拉伸缩效果
Aug 06 Javascript
JavaScript获取客户端IP的方法(新方法)
Mar 11 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
Aug 30 Javascript
微信小程序Echarts图表组件使用方法详解
Jun 25 Javascript
js对象数组和对象的使用实例详解
Aug 27 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在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
JavaScript的变量作用域深入理解
2009/10/25 Javascript
再谈javascript面向对象编程
2012/03/18 Javascript
jQuery JSON实现无刷新三级联动实例探讨
2013/05/28 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
AngularJs directive详解及示例代码
2016/09/01 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
react 组件传值的三种方法
2019/06/03 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
Vue实现Layui的集成方法步骤
2020/04/10 Javascript
[03:46]DAC趣味视频-中文考试.mp4
2017/04/02 DOTA
浅谈Python爬取网页的编码处理
2016/11/04 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
python3实现多线程聊天室
2018/12/12 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
python3 selenium自动化 frame表单嵌套的切换方法
2019/08/23 Python
使用Pandas的Series方法绘制图像教程
2019/12/04 Python
python 解决flask 图片在线浏览或者直接下载的问题
2020/01/09 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
使用HTML5拍照示例代码
2013/08/06 HTML / CSS
外贸英语毕业生自荐信
2013/11/14 职场文书
高一新生军训感言
2014/03/02 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
慈善募捐倡议书
2015/04/27 职场文书