如何将Discord.js代码中的require转换为ES模块并传递client?
解决Discord.js项目中ES模块动态加载函数并传递client的问题
首先,你需要确保项目已配置为ES模块:在package.json中添加"type": "module"字段,这是ES模块语法生效的前提。
原来的require是同步加载模块并直接调用导出函数,而ES模块的import()是异步操作,返回Promise,不能像require那样同步链式调用。正确的做法是使用async/await处理异步导入,具体修改如下:
修改后的完整代码
import { Client, Collection, GatewayIntentBits } from 'discord.js'; import * as dotenv from 'dotenv'; dotenv.config(); import * as fs from 'fs'; const client = new Client({ intents: [GatewayIntentBits.Guilds] }); client.commands = new Collection(); client.commandArray = []; // 异步加载函数模块 async function loadFunctions() { const functionFolders = fs.readdirSync(`./src/functions`); for (const folder of functionFolders) { const functionFiles = fs .readdirSync(`./src/functions/${folder}`) .filter((file) => file.endsWith(".js")); for (const file of functionFiles) { // 动态导入模块,注意路径需匹配实际文件位置,且不能省略.js后缀 const funcModule = await import(`./functions/${folder}/${file}`); // 调用模块默认导出的函数并传递client实例 funcModule.default(client); } } } // 初始化流程 (async () => { await loadFunctions(); client.handlerCommands(); client.handlerEvents(); await client.login(process.env.token); })();
关键说明
- 异步处理:
import()返回Promise,必须用await等待模块加载完成,才能获取到模块对象。 - 模块导出匹配:确保你的函数模块已转为ES模块语法——原来的
module.exports = (client) => { ... }要改为export default (client) => { ... };如果是命名导出,则调用对应的命名成员(比如funcModule.init(client))。 - 路径正确性:动态导入的路径是相对于当前文件的相对路径,需和
fs.readdirSync的路径对应,且ES模块中必须写全文件后缀(.js)。
内容的提问来源于stack exchange,提问作者Rohfule
相关产品推荐
相关产品推荐

