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 学习技巧
Feb 17 Javascript
Fastest way to build an HTML string(拼装html字符串的最快方法)
Aug 20 Javascript
使用闭包对setTimeout进行简单封装避免出错
Jul 10 Javascript
javascript操作数组详解
Dec 17 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
Aug 25 Javascript
jQuery页面加载初始化的3种方法(推荐)
Jun 02 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
Aug 09 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
Apr 20 Javascript
Node.js中的require.resolve方法使用简介
Apr 23 Javascript
Vue 2.0学习笔记之Vue中的computed属性
Oct 16 Javascript
详解webpack 热更新优化
Sep 13 Javascript
angularJS实现不同视图同步刷新详解
Oct 09 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的控制语句
2006/10/09 PHP
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
php 批量添加多行文本框textarea一行一个
2014/06/03 PHP
php获取系统变量方法小结
2015/05/29 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
2016/03/01 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
PHP模拟http请求的方法详解
2016/11/09 PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
2017/08/10 PHP
Javascript Function对象扩展之延时执行函数
2010/07/06 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
动态加载js文件简单示例
2016/04/21 Javascript
Google 地图事件实例讲解
2016/08/06 Javascript
Nodejs+express+ejs简单使用实例代码
2017/09/18 NodeJs
关于ES6箭头函数中的this问题
2018/02/27 Javascript
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
使用Vue做一个简单的todo应用的三种方式的示例代码
2018/10/20 Javascript
JavaScript禁用右键单击优缺点分析
2019/01/20 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
python操作日期和时间的方法
2014/03/11 Python
Python字典简介以及用法详解
2016/11/15 Python
python实现折半查找和归并排序算法
2017/04/14 Python
python实现逻辑回归的方法示例
2017/05/02 Python
pandas.loc 选取指定列进行操作的实例
2018/05/18 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
对python判断是否回文数的实例详解
2019/02/08 Python
详解Python直接赋值,深拷贝和浅拷贝
2020/07/09 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
关于期中考试的反思
2014/02/02 职场文书
品牌宣传方案
2014/03/21 职场文书
经销商订货会主持词
2014/03/27 职场文书
运动会800米赞词
2015/07/22 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
2021/04/05 Python
Pandas 稀疏数据结构的实现
2021/07/25 Python
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python