You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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);
})();

关键说明

  1. 异步处理:import()返回Promise,必须用await等待模块加载完成,才能获取到模块对象。
  2. 模块导出匹配:确保你的函数模块已转为ES模块语法——原来的module.exports = (client) => { ... }要改为export default (client) => { ... };如果是命名导出,则调用对应的命名成员(比如funcModule.init(client))。
  3. 路径正确性:动态导入的路径是相对于当前文件的相对路径,需和fs.readdirSync的路径对应,且ES模块中必须写全文件后缀(.js)。

内容的提问来源于stack exchange,提问作者Rohfule

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:33:41