2

我试图创建一个用 Javascript + NodeJS 编写的 IRC 机器人。该机器人应该能够在运行时加载插件,并且应该能够在更改等之后重新加载相同的插件。

什么有效?

在运行时加载文件 + 执行其代码。

怎么了?

再次加载相同的插件后,如果仍然执行我的代码,但现在它发生两次或第 n 次我加载插件。

当前代码:

bot.match(/\.load/i, function(msg) {
    require('./plugins/plug.js')(this);
});

module.exports  = function(bot) {
    bot.match(/\.ping/i, function(msg) {
    msg.reply('pong');
});

那么,有什么方法可以解决我的问题并使其正常工作吗?

Ps 我使用IRC-JS作为这个机器人的基础。

更新,修复:

甚至对该文件的更改也会被忽略,因此它必须类似于缓存。

通过清除修复require.cache

4

2 回答 2

4

require不会重新加载文件。一旦加载一次,它就在内存中,不会再次重新加载。听起来您想让机器人保持打开状态并require“即时”更改脚本的内容。您可以通过删除require.cache. 查看node.js require() 缓存 - 可能无效?http://nodejs.org/api/modules.html#modules_caching

于 2012-11-20T20:10:33.527 回答
3

回答我自己的问题。在加载插件时,我将每个对象添加到一个全局数组中。之后可以轻松访问和删除它。

function clearplugins() {
    require("fs").readdirSync("./plugins/active").forEach(function(file) {
        delete require.cache[require.resolve("./plugins/active/" + file)];
    });

    plugins.forEach(function(obj) {
        obj();
    });
}

function loadplugins() {
    require("fs").readdirSync("./plugins/active").forEach(function(file) {

        if(file.slice(-2) == 'js') {
            plugins.push(require("./plugins/active/" + file)(bot));
            console.log(file+' loaded');
        }
    });
}
于 2012-12-02T13:49:08.640 回答