如何利用Vue3+Vite批量导入模块/资源

目录
  • 前言
  • 1,前置基础知识-JavaScript模块化编程
    • (1)export语句-暴露函数和变量使外部调用
    • (2)import语句-导入变量/函数并使用
    • (3)import*asxxx语句-全部导入
    • (4)exportdefault-默认导出
  • 2,在Vite工程中批量导入js模块
  • 3,在Vite工程中批量导入图片/音频等静态资源
  • 总结

前言

在Vue项目开发中,我们常常会导入一些外部的模块,或者是自己写模块导入。

但是模块多了,一个个地导入很显然不是一个好办法,因此我们可以批量导入。

1,前置基础知识 - JavaScript模块化编程

在以往开发普通网页程序时,我们直接使用script标签引入了js文件即可调用其函数,但是在vue中你发现就不行了,因为vue也是使用了模块化编程标准。

通常我们可以把一个封装了很多要复用的函数和变量的js文件称作模块,模块必须暴露(导出)其中的变量、函数才能被外部导入并调用其中的函数。

现在常见的模块标准有两个:CommonJS和ES6。

在这里我们着重讲解ES6模块。

(1) export语句 - 暴露函数和变量使外部调用

现在我们自己创建一个js文件表示我们自己的模块,里面封装一些常常复用的函数、变量等等,就需要使用export暴露出来。

// 导出常量a
export const a = 'test';

// 导出函数myPrint
export function myPrint(msg) {
	console.log('[]' + msg);
}

可见在定义变量/函数时在前面加上export即可。

除此之外,还可以批量导出:

const a = 'test';

function myPrint(msg) {
	console.log('[]' + msg);
}

// 导出常量a和函数myPrint
export {
	a,
	myPrint
};

(2) import语句 - 导入变量/函数并使用

上面封装好了函数、变量等等并导出了,但是还是不能直接使用的。需要在要使用的地方进行导入操作:

// 导入函数myPrint和常量a
import {
	a,
	myPrint
} from './mymodule.js';

// 使用导入的变量和函数
console.log(a);
myPrint('msg');

这样就可以使用了。

可见import语法如下:

import { 变量1/函数1, 变量2/函数2, 变量3/函数3, ... } from 'js文件路径';

需要注意,导入的变量和函数一次可以有多个,用大括号括起来,并且导入的变量/函数名必须和模块中导出的变量/函数名一致!

(3) import * as xxx语句 - 全部导入

对于需要导入很多的模块,我们import后面需要写一长串的导入的变量和函数,因此我们还可以一次性全部导入。

对于上面的mymodule里面导出了一个变量和一个函数,在此我们可以一次性全部导入:

// 一次性全部导入该模块的内容并命名为my
import * as my from './mymodules.js';

// 调用模块属性a
console.log(my.a);
// 调用模块函数myPrint
my.myPrint('hhh');

可见,用import * as 名字 from '模块路径'的方式不仅可以方便地导入一个模块js文件的所有内容,还可以自己定义一个名字以方便调用。

(4) export default - 默认导出

上述的导出方式其实是命名式导出,其它文件导入时的变量/函数名必须和模块中导出的变量/函数名一致。

但是有时候不知道我们要导入的js文件中的函数/变量名怎么办呢?

可以使用默认导出,即export default语句,例如默认导出一个函数:

// 默认导出myPrint函数
export default function myPrint(msg) {
	console.log('[]' + msg);
}

默认导出后,导入时可以自行命名:

// 导入文件中默认导出的函数/变量并命名为p
import p from './mymodule.js';
//使用
p('msg');

可见这里没有使用大括号,并且导入时可以自行命名,不需要和原模块中函数名一样。

注意,一个js文件只能有一个默认导出!不能多次默认导出!

因此,一个有很多变量和函数的复用模块,我们可以这么写:

export default {
	// 变量a
	a: 'a',
	// 函数myPrint
	myPrint() {
		console.log('aa');
	}
}

调用时:

import m from './mymodule.js';

//使用
console.log(m.a);
m.myPrint();

很显然,这里是直接默认导出了一个大的匿名JavaScript对象,并把变量、函数写在这个对象里面。然后再导入,调用其中变量/函数即可。

其实在vue开发中,我们用到的很多外部JavaScript的库,都是这么做的。

事实上,我们的Vue单文件组件原理不也是这样的?

2,在Vite工程中批量导入js模块

在之前的Vue-cli开发中,我们可以使用require.context()来实现批量导入。但是由于Vite是完全基于ES6模块的,因此就不能使用这种方式了。

当然,官方也提供了实现批量导入的方式,用import.meta.glob或者import.meta.globEager函数实现。前者懒加载的导入,后者则为直接导入。今天主要讲解后者。

例如我现在工程目录下src/assets/js下有三个js文件:

现在要在根组件App.vue批量导入它们,则在<script>部分开头写:

const importModules = import.meta.globEager('./assets/js/*.js');

这样就导入了./assets/js下所有js模块文件。

当然这种方式也可以匹配多级目录:

const importModules = import.meta.globEager('./assets/js/**/*.js');

这样就导入了./assets/js下所有js文件及其子目录下的所有js文件。

在这里我们将其导入为一个变量importModules,这个变量里面到底是啥呢?我们在mounted函数里面打印一下看看:

console.log(importModules);

可见导入的是一个对象,这个对象中的每个属性即为模块路径,而对应的值中的default属性即为导入的模块本身,模块的函数变量等等都在里面。因此我们可以取导入的变量的每个属性下的default属性以调用我们的模块。

举个例子,现在要调用模块one中的print函数:

importModules['./assets/js/one.js'].default.print('hello');

到这相信大家又发现问题了:每次调用批量导入的模块,就要用模块的完整路径去取,还需要带上default属性,及其不方便。

我们能不能实现就用模块名(js文件名)去取出对应的模块呢?当然可以,事实上方法很多,我来讲一下我的思路。

我们将上述存放导入模块的变量importModules中的每个属性名都给用字符串裁剪的方式替换成模块名,并将每个属性对应的值直接替换为它的default值不就行了吗?我们来试一下子:

// 对批量导入存放模块的对象进行处理
// 先获取其全部属性
const keys = Object.keys(importModules);
// 执行批量替换操作
for (let path of keys) {
	// 裁剪字符串方式得到路径中的文件名(无扩展名)
	let name = path.substring(path.lastIndexOf('/') + 1, path.lastIndexOf('.js'));
	// 对原对象执行添加新的属性并删除旧属性达到处理效果
	importModules[name] = importModules[path].default;
	delete importModules[path];
}

现在,我们就可以很方便地进行调用了!

// 调用模块one的print
importModules.one.print('hello');
// 打印模块two的name属性
console.log(importModules.two.name);

3,在Vite工程中批量导入图片/音频等静态资源

在Vite中如果是想要动态绑定图片音频视频等等,也是要用import语句的,同样地图片多了,不想一个个地import应当怎么做呢?

事实上,我们还可以用import.meta.globEager批量导入静态资源例如图片音频等等。

假设现在在src/assets/image下有很多图片。

我们仍然可以用上面的方式批量导入:

const importImages = import.meta.globEager('./assets/image/*');

方式和上面一模一样,只不过这次导入的是静态资源,所以说上述importImages的default变成了对应资源的路径。

打印看一看:

同样地,我们可以把上述导入的每个default部分存起来再使用v-for批量呈现,试一下子,整个Vue文件代码如下:

<template>
 <div class="app">
  <!-- 然后就可以批量呈现了 -->
  <img v-for="item in images" :src="item" height="150"/>
 </div>
</template>

<script>
const importImages = import.meta.globEager('./assets/image/*');

export default {
 data() {
  return {
   // 存放批量导入的图片
   images: []
  }
 },
 mounted() {
  // 把导入的对象中每个default属性(对应实际导入的图片)取出来放到data中的变量images中去
  for (let path in importImages) {
   this.images.push(importImages[path].default);
  }
 }
}
</script>

效果:

可见Vite中的批量导入非常方便,无论是模块还是资源都可以。对于静态资源,我们是不是还可以用这个批量导入机制,结合我之前写的判断各个资源加载完成的方法的文章,更加简单地实现网站资源加载检测并制作进度条呢?

总结

到此这篇关于如何利用Vue3+Vite批量导入模块/资源的文章就介绍到这了,更多相关Vue3+Vite批量导入模块资源内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解VUE中常用的几种import(模块、文件)引入方式

    1 引入第三方插件 import echarts from 'echarts' 2 引入工具类 第一种是引入单个方法 import {axiosfetch} from './util'; 下面是写法,需要export导出 export function axiosfetch(options) { } 第二种  导入成组的方法 import * as tools from './libs/tools' 其中tools.js中有多个export方法,把tools里所有export的方法导入 vue中

  • 如何利用Vue3+Vite批量导入模块/资源

    目录 前言 1,前置基础知识-JavaScript模块化编程 (1)export语句-暴露函数和变量使外部调用 (2)import语句-导入变量/函数并使用 (3)import*asxxx语句-全部导入 (4)exportdefault-默认导出 2,在Vite工程中批量导入js模块 3,在Vite工程中批量导入图片/音频等静态资源 总结 前言 在Vue项目开发中,我们常常会导入一些外部的模块,或者是自己写模块导入. 但是模块多了,一个个地导入很显然不是一个好办法,因此我们可以批量导入. 1,前

  • Django框架利用ajax实现批量导入数据功能

    本文实例为大家分享了网页中利用ajax实现批量导入数据功能的实现方法,供大家参考,具体内容如下 url.py代码: 复制代码 代码如下: url(r'^workimport/$', 'keywork.views.import_keywork', name='import_keywork') view.py代码: from keywork.models import DevData from django.http import JsonResponse #django ajax部分 def im

  • Vue3+Vite项目按需自动导入配置以及一些常见问题修复

    目录 一.Vue API自动导入 1.1 配置unplugin-auto-import 1.2 可能遇到ts,eslint不识别而导入报错的问题 1.3 配置src/component目录下的组件自动引入 二.按需引入UI组件库(antd,element-plus) 2.1.按需引入element-plus 2.2 ant-design-vue 按需引入 2.3 自动导入 Element Plus Icon 三.关于配置文件 总结 一.Vue API自动导入 解决的问题:避免在每个vue组件中都

  • VUE3+vite项目中动态引入组件与异步组件的详细实例

    目录 一.全量注册,随用随取 1. 把项目中所有vue文件注册成异步组件. 2. 获取组件 3. 参考如下 二.使用@rollup/plugin-dynamic-import-vars插件 1.介绍 2.安装 3.使用 4.How it works 总结 一.全量注册,随用随取 1. 把项目中所有vue文件注册成异步组件. const app = createApp(App); function registerGlobalAsyncComponents(app: VueApp) { const

  • 如何利用vue3实现放大镜效果实例详解

    目录 前言 一.封装的意义 二.如何封装? 1.  准备 2.  开始封装 3. 使用 三. 效果演示 总结 前言 逛购物网站的时候,想必大家都见过鼠标放到商品上,会有一个放大的效果.今天我们就自己动手封装一个放大镜效果的全局组件,一起来看下吧~ 一.封装的意义 从技术角度 通过vue插件方式封装为全局组件,整个项目其他位置也可以使用,且使用方便 模块化开发思想,一个模块实现一个功能 用户角度 可以带来更好的浏览体验 可以看到商品的细节 二.如何封装? 1.  准备 需要用到@vueuse/co

  • Vue3+Vite实现动态路由的详细实例代码

    项目基本目录 1.首先定义初始默认的路由routes(router.js文件),vue文件使用import引入可以按需加载 import { createRouter, createWebHashHistory } from "vue-router"; import store from '../store/index.js' const routes = [{ path: "/login", component: () => import("../

  • vue3+vite中使用vuex的具体步骤

    目录 前言: 具体步骤: 前言: 在vue3+vite创建的项目中使用vuex,要注意的是vite有部分写法和之前的webpack是不同的,比如,他不支持 require,想把vue2的项目直接升级到vue3的时候,需要改很多地方,如果非要使用vite也可以,记得改相关的内容. 具体步骤: 1.安装vuex( vue3建议 4.0+ ) pnpm i vuex -S 2.main.js中配置 import store from '@/store' // hx-app的全局配置 const app

  • python Django批量导入数据

    前言: 这期间有研究了Django网页制作过程中,如何将数据批量导入到数据库中. 这个过程真的是惨不忍睹,犯了很多的低级错误,这会在正文中说到的.再者导入数据用的是py脚本,脚本内容参考至自强学堂--中级教程--数据导入.  注:本文主要介绍自己学习的经验总结,而非教程! 正文:首先说明采用Django中bulk_create()函数来实现数据批量导入功能,为什么会选择它呢? 1 bulk_create()是执行一条SQL存入多条数据,使得导入速度更快; 2 bulk_create()减少了SQ

  • django批量导入xml数据

    django后台批量导入数据 在生产环境中,往往数据不是几条或者几百条,那么举个例子,将公司所有员工员工号或者帐号密码导入进后台,那就不建议你去后台一条条记录去添加了 如何从xml中批量导入svn记录 第一步: 为数据建立模型 @python_2_unicode_compatible class SVNLog(models.Model): vision = models.IntegerField(verbose_name=u"修订版本", blank=False, null=False

  • java批量导入导出文件的实例分享(兼容xls,xlsx)

    一.介绍 利用java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下. 目前我所接触过的导入导出技术主要有POI和iReport,poi主要作为一些数据批量导入数据库,iReport做报表导出.另外还有jxl类似poi的方式,不过貌似很久没跟新了,2007之后的office好像也不支持,这里就不说了. 二.POI使用详解 2.1 什么是Apache POI? Apache POI是Apache软件基金会的开放源码函式

随机推荐