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 相关文章推荐
通过jquery实现tab标签浏览效果
Feb 20 Javascript
页面右下角弹出提示框示例代码js版
Aug 02 Javascript
给ListBox添加双击事件示例代码
Dec 02 Javascript
JS实现的4种数字千位符格式化方法分享
Mar 02 Javascript
JavaScript实现信用卡校验方法
Apr 07 Javascript
详解React Native顶|底部导航使用小技巧
Sep 14 Javascript
基于vue.js无缝滚动效果
Jan 25 Javascript
详解vue.js下引入百度地图jsApi的两种方法
Jul 27 Javascript
前端js中的事件循环eventloop机制详解
May 15 Javascript
聊聊Vue 中 title 的动态修改问题
Jun 11 Javascript
RxJS的入门指引和初步应用
Jun 15 Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 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
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
详解PHP实现执行定时任务
2015/12/21 PHP
详解PHP中foreach的用法和实例
2016/10/25 PHP
用js计算页面执行时间的函数
2006/12/07 Javascript
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
原生js和jquery分别实现横向导航菜单效果
2016/05/13 Javascript
Vue中android4.4不兼容问题的解决方法
2018/09/04 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
jQuery实现数字华容道小游戏(实例代码)
2020/01/16 jQuery
对于Python中线程问题的简单讲解
2015/04/03 Python
python通过smpt发送邮件的方法
2015/04/30 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
python 读取.nii格式图像实例
2020/07/01 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
美国钻石商店:Zales
2016/11/20 全球购物
三星英国官网:Samsung英国
2018/09/25 全球购物
社区工作者思想汇报
2014/01/13 职场文书
投标邀请书范文
2014/01/31 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
商铺租房协议书范本
2014/12/04 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
Netty分布式客户端接入流程初始化源码分析
2022/03/25 Java/Android
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL