《Vite 基础知识》Vite 不支持 require 解决方案(三种情况/require is not defined)

前言

首先,Vite 中没有 require 相关方法,因为它默认支持 ESM 方式加载模块!

所以,我们要理清如下两个方法

方法 require()

方法 require.context()

Vite 提供解决方案,请接着往下看!

解决方案

require() 加载模块

报错 require 未定义

Uncaught (in promise) ReferenceError: require is not defined

js 复制代码
// 报错。CommonJS 方式加载
initNav() {
	const ElementResizeDetector = require('element-resize-detector');
	const erd = ElementResizeDetector();
}

解决方案

  • 使用 EMS import() 方法;
  • 注意 require()同步加载;
  • import()异步 加载,推荐使用 await 命令。当然也可以使用 then() 方法,因为其返回 Promise 对象;
js 复制代码
// 正确。方式一(推荐):ESM 方式加载,使用 await 命令
async initNav() {
	const ElementResizeDetector = await import('element-resize-detector');
	const erd = elementResizeDetectorMaker.default();
}


// 正确。方式二:ESM 方式加载,使用 then() 方法
initNav() {
	import('element-resize-detector').then(module => {
        const erd = module.default();        
    }).catch(err => {
        console.error('加载失败');
    });
}

require() 加载图片

报错 require 未定义

Possible Unhandled Promise Rejection: ReferenceError: require is not defined

vue 复制代码
<template>
	<img class="pwd-icon" :src="pwdIcon" >
</template>
<script>
export default {
	data () {
		return {
			pwdIcon2: require('../assets/images/pwd-icon.png'),
		}
	}
}
</script>

解决方案

使用 EMS import 命令;

vue 复制代码
<template>
	<img class="pwd-icon" :src="pwdIcon" >
</template>
<script>
import PwdIcon from '../assets/images/pwd-icon.png'
export default {
	data () {
		return {
			pwdIcon: PwdIcon,
		}
	}
}
</script>

require.context() 批量加载文件

报错 require 未定义

Possible Unhandled Promise Rejection: ReferenceError: require is not defined

js 复制代码
// require 是同步加载
const modulesFiles = require.context('./src/components', true, /\.vue$/);

const modules = modulesFiles.keys().reduce((modules, modulePath) => {
    const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1');
    modules[moduleName] = modulesFiles(modulePath).default;
    return modules;
}, {});

解决方案

使用 import.meta.glob ,可异步同步 加载。详见《Vite 基础知识:使用 Glob 动态加载 .vue 文件》

js 复制代码
// 异步,返回 Promise 对象
const modules = import.meta.glob('./src/components/**/*.vue');

for (const path in modules) {
    modules[path]().then((mod) => {
        console.log(path, mod.default);
    })
}

// 同步,配置参数 { eager: true }
const modules = import.meta.glob('./src/components/**/*.vue', { eager: true });

for (const path in modules) {
    console.log(path, modules[path].default);
}
相关推荐
kyriewen14 小时前
从Webpack到Vite:我们迁移了一个10万行代码的项目,总结了这7个坑
前端·webpack·vite
大家的林语冰21 小时前
尤雨溪官宣:Vite+ 全员加盟 Cloudflare,正式进军全栈开发和 AI 部署云平台!
前端·javascript·vite
码农阿豪21 小时前
Node.js 连金仓数据库(下篇):连接池、事务和那些坑
数据库·node.js
晓杰'21 小时前
从0到1实现Balatro游戏后端(7):Boss Blind与特殊规则实现
后端·websocket·typescript·node.js·游戏开发·项目实战·nestjs
右耳朵猫AI1 天前
Node.js周刊2026W21 | Node.js 26.2.0、Bun v1.3.14、Rolldown 1.0、TypeORM 1.0
node.js
wgc2k1 天前
Node.js游戏服务器项目移植 5-唯一 ID 生成方案
游戏·node.js
x***r1511 天前
Node.js v0.12.2 安装教程(Windows x86版 node-v0.12.2-x86.msi 详细步骤)
windows·node.js
海兰1 天前
【实用程序】 极简OA系统-详细设计及源码(基于Node.js + Express + SQLite + 原生前端)
sqlite·node.js·express
x***r1512 天前
nvm-windows 安装教程:Node.js 多版本管理(避坑版)
windows·node.js
云水一下2 天前
掌握 Express 框架:从零到 MVC 博客系统
node.js·express