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

前言

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

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

方法 require()

方法 require.context()

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

解决方案

require() 加载模块

报错 require 未定义

Uncaught (in promise) ReferenceError: require is not defined

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

解决方案

  • 使用 EMS import() 方法;
  • 注意 require()同步加载;
  • import()异步加载,推荐使用 await 命令。当然也可以使用 then() 方法,因为其返回 Promise 对象;
// 正确。方式一(推荐):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

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

解决方案

使用 EMS import 命令;

<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

// 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 文件》

// 异步,返回 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);
}
Vite + Vue3项目中遇到“require is not defined”的错误通常是因为你在尝试使用CommonJS模块导出导入机制,而Vite 默认采用的是ES module(ESM)。这在Vue组件内直接使用`import`和`export`语法是可以避免这个问题的。如果你需要引入第三方库,有几种解决方法: 1. **使用vite-plugin-commonjs**:这是一个Vite 插件,它允许你在项目中混合使用CommonJS和ESM。安装并配置这个插件后,你可以像下面这样导入第三方库: ```bash npm install vite-plugin-commonjs -D ``` 在`vite.config.js`中添加: ```javascript import commonjs from &#39;vite-plugin-commonjs&#39; export default defineConfig({ plugins: [ commonjs(), ], }) ``` 2. **将第三方库转换为ESM**:如果可能,尽量将第三方库转换为其ESM版本。很多库现在都支持这种转换,例如 `npm run build -- @某库名` 或者检查其是否有umd版本。 3. **全局引入**:对于一些全局作用域的库,可以在项目的根目录下创建一个`.esm`文件(如`global-utils.esm.js`),然后导入并导出: ```javascript // global-utils.esm.js export { default as myLib } from &#39;my-third-party-lib&#39;; ``` 然后在其他组件中使用`import * as myLib from &#39;@/global-utils&#39;`。 4. **条件加载**:如果有必要,可以使用`@vitejs/plugin-vue-router`的`defineAsyncComponent`来动态导入和延迟加载第三方库,以减少初始加载时的问题。 记得每次更改后都要重启Vite服务查看是否解决了问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值