### 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);
}
~~~