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中的运用上部
Nov 20 Javascript
JSONP 跨域共享信息
Aug 16 Javascript
node.js中的console用法总结
Dec 15 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
Mar 18 Javascript
使用jQuery操作HTML的table表格的实例解析
Mar 13 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
May 17 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
Jun 25 Javascript
jQuery实现表单动态添加数据并提交的方法
Jul 19 jQuery
微信小程序模板template简单用法示例
Dec 04 Javascript
vue-cli系列之vue-cli-service整体架构浅析
Jan 14 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
如何让vue长列表快速加载
Mar 29 Vue.js
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 数组遍历方法大全(foreach,list,each)
2010/06/30 PHP
php绘图中显示不出图片的原因及解决
2014/03/05 PHP
php线性表的入栈与出栈实例分析
2015/06/12 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
2015/07/06 PHP
PHP使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
可输入的下拉框
2006/06/19 Javascript
JavaScript获取文本框内选中文本的方法
2015/02/20 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
js实现点击切换TAB标签实例
2015/08/21 Javascript
聊一聊JavaScript作用域和作用域链
2016/05/03 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
2017/11/13 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
2018/05/11 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
vue实现路由懒加载及组件懒加载的方式
2019/06/11 Javascript
layer.confirm()右边按钮实现href的例子
2019/09/27 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
微信小程序用canvas画图并分享
2020/03/09 Javascript
如何用itertools解决无序排列组合的问题
2017/05/18 Python
Python反射用法实例简析
2017/12/22 Python
Jupyter中直接显示Matplotlib的图形方法
2018/05/24 Python
Python控制Firefox方法总结
2019/06/03 Python
python写一个随机点名软件的实例
2019/11/28 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
对python中各个response的使用说明
2020/03/28 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
大学生毕业自我鉴定范文
2013/11/03 职场文书
刚毕业大学生自荐信范文
2014/02/20 职场文书
感谢信怎么写
2015/01/21 职场文书
党员读书活动心得体会
2016/01/14 职场文书
七年级作文之秋游
2019/10/21 职场文书
粗暴解决CUDA out of memory的问题
2021/05/22 Python
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang