无HTML环境下引用外部JS方法?Discord Bot模块导入报错求助
解决Node.js环境下Discord Bot拆分JS文件的模块引用问题
你遇到的SyntaxError: Cannot use import statement outside a module报错,核心原因是Node.js默认采用CommonJS模块系统,而你混用了CommonJS的require和ES模块的import/export语法——两种模块系统不能在同一个项目里混用。下面给你两种可行的解决思路:
方案一:改用CommonJS语法(无需配置,快速适配)
CommonJS是Node.js传统的模块机制,和你熟悉的C#命名空间逻辑更接近:
- 把要暴露的方法/变量通过
module.exports导出(类似C#中类的public成员) - 通过
require导入其他模块的内容(类似C#中using命名空间后引用类)
修改代码:
- test.js:替换导出语法
function sendMessage(message) { if (message.content === 'say ping') { message.channel.send('!ping'); } } module.exports = { sendMessage };
- app.js:替换导入语法
const { Client, IntentsBitField } = require('discord.js'); const token = "token_here"; const { sendMessage } = require('./test.js'); // 改用require导入 const client = new Client({ intents: [ IntentsBitField.Flags.Guilds, IntentsBitField.Flags.GuildMembers, IntentsBitField.Flags.GuildMessages, IntentsBitField.Flags.MessageContent ] }); client.on('ready', (clientTemp) => { console.log(`${clientTemp.user.tag} is online`); }); client.on('messageCreate', (message) => { sendMessage(message); }) client.login(token);
方案二:配置为ES模块系统(使用import/export)
如果更习惯ES模块的语法,需要告诉Node.js当前项目使用ES模块:
- 在项目根目录的
package.json中添加"type": "module"字段(如果没有package.json,先执行npm init -y生成)
{ "type": "module", // 其他原有字段... }
- 统一所有文件的模块语法:
- app.js:把
require改成import
import { Client, IntentsBitField } from 'discord.js'; const token = "token_here"; import { sendMessage } from './test.js'; const client = new Client({ intents: [ IntentsBitField.Flags.Guilds, IntentsBitField.Flags.GuildMembers, IntentsBitField.Flags.GuildMessages, IntentsBitField.Flags.MessageContent ] }); client.on('ready', (clientTemp) => { console.log(`${clientTemp.user.tag} is online`); }); client.on('messageCreate', (message) => { sendMessage(message); }) client.login(token);- test.js:保持原有
export语法即可
export function sendMessage(message) { if (message.content === 'say ping') { message.channel.send('!ping'); } } - app.js:把
补充:和C#命名空间的类比
- CommonJS的
module.exports/require:相当于C#中在类里定义public方法,然后通过using 命名空间后实例化类调用方法(或静态类直接调用) - ES模块的
export/import:类似C#中public static方法,通过using static 命名空间.类直接引用方法,或者导入整个模块
内容的提问来源于stack exchange,提问作者TheEmeraldEnd
相关产品推荐
相关产品推荐

