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聚焦于第一个字段的代码
Oct 15 Javascript
jQuery EasyUI API 中文文档 - Menu菜单
Oct 03 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
Jun 08 Javascript
使用jquery自定义鼠标样式满足个性需求
Nov 05 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
Apr 12 Javascript
使用pjax实现无刷新更改页面url
Feb 05 Javascript
jquery衣服颜色选取插件效果代码分享
Aug 28 Javascript
js中获取键盘按下键值event.keyCode、event.charCode和event.which的兼容性详解
Mar 15 Javascript
JS将unicode码转中文方法
May 08 Javascript
深究AngularJS中ng-drag、ng-drop的用法
Jun 12 Javascript
详解webpack-dev-server的简单使用
Apr 02 Javascript
JavaScript中展开运算符及应用的实例代码
Jan 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
多重?l件?合查?(一)
2006/10/09 PHP
PHP实现微信发红包程序
2015/08/24 PHP
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
jquery基础教程之deferred对象使用方法
2014/01/22 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
jQuery往返城市和日期查询实例讲解
2015/10/09 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
详细分析单线程JS执行问题
2017/11/22 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
layui实现table加载的示例代码
2018/08/14 Javascript
[52:09]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第二场
2014/05/26 DOTA
Python实现从url中提取域名的几种方法
2014/09/26 Python
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
Python中字典和集合学习小结
2017/07/07 Python
python中logging库的使用总结
2017/10/18 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
python调用百度REST API实现语音识别
2018/08/30 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
PyCharm设置每行最大长度限制的方法
2019/01/16 Python
python实现狄克斯特拉算法
2019/01/17 Python
Python实现计算长方形面积(带参数函数demo)
2020/01/18 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
在echarts中图例legend和坐标系grid实现左右布局实例
2020/05/16 Python
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
2014/03/30 面试题
工厂保洁员岗位职责
2013/12/04 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
大客户经理岗位职责
2015/04/09 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP
redis中lua脚本使用教程
2021/11/01 Redis