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 相关文章推荐
用一段js程序来实现动画功能
Mar 06 Javascript
JavaScript Undefined,Null类型和NaN值区别
Oct 22 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
Feb 26 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
Jun 03 Javascript
js仿腾讯QQ的web登陆界面
Aug 19 Javascript
关于js函数解释(包括内嵌,对象等)
Nov 20 Javascript
BootStrap daterangepicker 双日历控件
Jun 02 Javascript
详解Vue.js项目API、Router配置拆分实践
Mar 16 Javascript
vuex state及mapState的基础用法详解
Apr 19 Javascript
Vue 指令实现按钮级别权限管理功能
Apr 23 Javascript
详解微信小程序-canvas绘制文字实现自动换行
Apr 26 Javascript
微信小程序自定义toast组件的方法详解【含动画】
May 11 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缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
php url路由入门实例
2014/04/23 PHP
Yii2框架加载css和js文件的方法分析
2019/05/25 PHP
使用JQuery和s3captche实现一个水果名字的验证
2009/08/14 Javascript
js 替换功能函数,用正则表达式解决,js的全部替换
2010/12/08 Javascript
JavaScript获取/更改文本框的值的实例代码
2013/08/02 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
跟我学习javascript的定时器
2015/11/19 Javascript
Angularjs的ng-repeat中去除重复数据的方法
2016/08/05 Javascript
浅谈Javascript中的12种DOM节点类型
2016/08/19 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
react开发中如何使用require.ensure加载es6风格的组件
2017/05/09 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
vue2 前端搜索实现示例
2018/02/26 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
关于vue的npm run dev和npm run build的区别介绍
2019/01/14 Javascript
layui点击弹框页面 表单请求的方法
2019/09/21 Javascript
JS 图片压缩原理与实现方法详解
2020/04/29 Javascript
解决vant title-active-color与title-inactive-color不生效问题
2020/11/03 Javascript
gearman的安装启动及python API使用实例
2014/07/08 Python
python利用装饰器进行运算的实例分析
2015/08/04 Python
Python实现通过文件路径获取文件hash值的方法
2017/04/29 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
Selenium的使用详解
2018/10/19 Python
详解Python locals()的陷阱
2019/03/26 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
解决Python3下map函数的显示问题
2019/12/04 Python
Python如何基于rsa模块实现非对称加密与解密
2020/01/03 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
如何使用pandas读取txt文件中指定的列(有无标题)
2020/03/05 Python
详解Python 循环嵌套
2020/07/09 Python
PHP面试题集
2016/12/18 面试题
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
影视艺术学院毕业生自荐信
2013/11/13 职场文书
公务员党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书