【第12期】Vue3+TypeScript+Vite中动态引入图片等静态资源

简介: 【第12期】Vue3+TypeScript+Vite中动态引入图片等静态资源c

概述

在Vue2中,我们大多数项目使用webpack来打包,图片等静态资源通过require来引入,但是随着Vue3+TypeScript+Vite的普及,作为webpack的打包工具已经被vite代替,通过require引入静态资源的方法也做了相应的修改。vue3 如果使用的是typescript开发,就会出现require引入图片报错,require is not defined 不能像使用vue2 这样imgUrl: require(’…/assets/test.png’) 导入,是因为typescript不支持require导入,所以用import导入。

引入方式

Vue3+TypeScript+Vite项目开发需要 动态引入静态资源,也就是img标签的src属性值为动态获取,按照以往的做法直接是require引入即可,如下代码:

<img class="img" :src="require(`../../../assets/image/${item.img}`)" />

写上后代码波浪线报错,报错提示:

找不到名称 “require”。是否需要为节点安装类型定义? 请尝试使用  npm i --save-dev @types/node。ts(2580)在进行了npm i --save-dev @types/node 安装以及在TypeScript的配置文件 tsconfig.json中添加了配置项 "type":["node"] 后波浪线提示消失,但浏览器的控制台依然报错,在查看资料后得知,在vite中不能使用require引入图片资源,因为这里的requirewebpack提供的一种加载能力,由于我们并非使用的webpack作为项目的构建工具,我们使用的是Vite,因此这里必须转用 Vite提供的静态资源载入,vite关于这一部分的官方说明在这里,有兴趣的小伙伴可以看官方的文档:https://vitejs.cn/guide/assets.html#new-url-url-import-meta-url

使用import.meta.url

这里主要使用new URL 一共接收两个参数,第一个参数即图片的路径,这里就是对应require中的值,第二个参数是vite的一个全局变量,可以理解成直接写死了 import.meta.url

function getImg(name: string) {
    return new URL(`../../../../assets/images/svg/${name}`, import.meta.url).href;
}

template中使用

<img class="t-desktop-icon" :src="getImg(path)" />

使用await import引入

<template>
    <img :src="imgUrl" alt="logo">
</template>
<script lang="ts">
    import {ref, onMounted} from "vue";
    export default {
        name: "imgPage",
        setup(){
            onMounted(()=>{
                handleImgSrc();
            })
            const imgUrl = ref('');
            const handleImgSrc = async()=>{
                let img = 
                imgUrl.value = await import('@/assets/img/logo.png').default;
            };
            return{
                imgUrl
            }
        }
    }
</script>
目录
相关文章
|
11天前
|
JavaScript 开发者 索引
【亮剑】探讨了在TypeScript中为对象动态添加属性的三种方式
【4月更文挑战第30天】本文探讨了在TypeScript中为对象动态添加属性的三种方式:1) 使用索引签名允许添加任意属性,如`[key: string]: any`;2) 通过接口和类型别名提供编译时类型检查,例如`interface Person { name: string; age: number; }`;3) 利用类创建具有属性的对象,如`class Person { name: string; age: number; }`。每种方法有其适用场景,开发者可根据需求选择。
|
11天前
|
JavaScript 安全 前端开发
【亮剑】TypeScript 由于其强类型的特性,直接为对象动态添加属性可能会遇到一些问题
【4月更文挑战第30天】本文探讨了在 TypeScript 中安全地为对象动态添加属性的方法。基础方法是使用索引签名,允许接受任何属性名但牺牲了部分类型检查。进阶方法是接口扩展,通过声明合并动态添加属性,保持类型安全但可能导致代码重复。高级方法利用 OOP 模式的类继承,确保类型安全但增加代码复杂性。选择哪种方法取决于应用场景、代码复杂性和类型安全性需求。
|
11天前
|
前端开发 JavaScript 安全
【亮剑】探讨了在React TypeScript应用中如何通过道具(props)传递CSS样式,以实现模块化、主题化和动态样式
【4月更文挑战第30天】本文探讨了在React TypeScript应用中如何通过道具(props)传递CSS样式,以实现模块化、主题化和动态样式。文章分为三部分:首先解释了样式传递的必要性,包括模块化、主题化和动态样式以及TypeScript集成。接着介绍了内联样式的基本用法和最佳实践,展示了一个使用内联样式自定义按钮颜色的例子。最后,讨论了使用CSS模块和TypeScript接口处理复杂样式的方案,强调了它们在组织和重用样式方面的优势。结合TypeScript,确保了样式的正确性和可维护性,为开发者提供了灵活的样式管理策略。
|
24天前
|
JavaScript
vue3+vite项目配置ESlint
vue3+vite项目配置ESlint
49 0
|
24天前
乾坤子应用配置(vue3+vite)
乾坤子应用配置(vue3+vite)
67 0
|
25天前
|
JavaScript
vite+typescript从入门到实战(二)
vite+typescript从入门到实战
40 0
|
25天前
|
JavaScript 前端开发 数据可视化
前端开发使用 Vue 3 + TypeScript + Pinia + Element Plus + ECharts
前端开发使用 Vue 3 + TypeScript + Pinia + Element Plus + ECharts
41 0
|
2月前
|
JavaScript 前端开发
在Vue中使用TypeScript的常见问题有哪些?
在Vue中使用TypeScript的常见问题有哪些?
32 2
|
2月前
|
JavaScript 前端开发
在Vue中使用TypeScript的优缺点是什么?
在Vue中使用TypeScript的优缺点是什么?
16 0
|
2月前
|
JavaScript
在 Vue 中如何使用 TypeScript?
在 Vue 中如何使用 TypeScript?
16 0