多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### require() * [Node.JS 原生方法](https://nodejs.org/docs/latest/api/modules.html#requireid),以`CommonJS`方式加载**模块/文件/图片**; * [Webpack 默认支持](https://webpack.docschina.org/api/module-methods/#require),`Vite`不支持; ### require.context() * [Webpack 特定方法](https://webpack.docschina.org/api/module-methods/#webpack),此方法可[实现自定义上下文](https://webpack.docschina.org/guides/dependency-management/#requirecontext); * `Vite`不支持; ## 解决方案 ### require() 加载模块 **报错 require 未定义** > Uncaught (in promise) ReferenceError: require is not defined ``` javascript // 报错。CommonJS 方式加载 initNav() { const ElementResizeDetector = require('element-resize-detector'); const erd = ElementResizeDetector(); } ``` **解决方案** * 使用[EMS import()](https://wangdoc.com/es6/module#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 未定义** > Uncaught (in promise) ReferenceError: require is not defined ```js export default { data () { return { pwdIcon2: require('../assets/images/pwd-icon.png'), } } } ``` **解决方案** 使用[EMS import](https://wangdoc.com/es6/module#import-%E5%91%BD%E4%BB%A4)命令; ~~~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](https://cn.vitejs.dev/guide/migration-from-v2#importmetaglob),可**异步**和**同步**加载。详见[《Vite 基础知识:使用 Glob 动态加载 .vue 文件》](https://blog.csdn.net/sinat_31213021/article/details/135548940) ~~~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); } ~~~