欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > Vite 不支持 require 解决方案(三种情况/require is not defined)

Vite 不支持 require 解决方案(三种情况/require is not defined)

2025/3/12 23:58:33 来源:https://blog.csdn.net/qq_38188485/article/details/146144563  浏览:    关键词:Vite 不支持 require 解决方案(三种情况/require is not defined)

前言

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

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

方法 require()

  • Node.JS 原生方法 ,以 CommonJS 方式加载模块/文件/图片

  • Webpack 默认支持 ,Vite 不支持;

方法 require.context()

  • Webpack 特定方法,此方法可实现自定义上下文;
  • Vite 不支持;

但 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);
}

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词