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 相关文章推荐
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
Apr 01 Javascript
学习javascript,实现插入排序实现代码
Jul 31 Javascript
JS弹出对话框实现方法(三种方式)
Dec 18 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
Dec 07 Javascript
React-router 4 按需加载的实现方式及原理详解
May 25 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
Jun 08 Javascript
Angular4集成ng2-file-upload的上传组件
Mar 14 Javascript
玩转vue的slot内容分发
Sep 22 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
Dec 11 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
Sep 27 Javascript
vue.js 实现a标签href里添加参数
Nov 12 Javascript
js中forEach,for in,for of循环的用法示例小结
Mar 14 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 extract 将数组拆分成多个变量的函数
2010/06/30 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
实现局部遮罩与关闭原理及代码
2013/02/04 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
jQuery实现带延迟效果的滑动菜单代码
2015/09/02 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
JavaScript中将数组进行合并的基本方法讲解
2016/03/07 Javascript
微信小程序 教程之WXSS
2016/10/18 Javascript
jQuery Easy UI中根据第一个下拉框选中的值设置第二个下拉框是否可以编辑
2016/11/29 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
2017/07/07 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
vuex实现的简单购物车功能示例
2019/02/13 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
js实现踩五彩块游戏
2020/02/08 Javascript
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
Pycharm学习教程(1) 定制外观
2017/05/02 Python
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
Django REST framework视图的用法
2019/01/16 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
python-pyinstaller、打包后获取路径的实例
2019/06/10 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
python的faker库用法
2019/11/28 Python
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
广州某公司软件工程师面试题
2014/12/22 面试题
结婚典礼证婚词
2014/01/08 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
表扬信范文
2015/05/04 职场文书
SpringAop日志找不到方法的处理
2021/06/21 Java/Android
Spring Cloud 中@FeignClient注解中的contextId属性详解
2021/09/25 Java/Android
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python
Vue+TypeScript中处理computed方式
2022/04/02 Vue.js