在运行时加载+覆盖功能

时间:2012-11-20 19:59:22

标签: javascript node.js

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

什么有效?

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

怎么了?

如果仍然执行我的代码,再次加载相同的插件,但现在它发生了两次或第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');
});

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

P.S。我正在使用IRC-JS作为此机器人的基础。

已更新,已修复:

  

即使对该文件的更改也会被忽略,因此它必须类似于   高速缓存中。

通过清除require.cache

修复

2 个答案:

答案 0 :(得分:4)

require不会重新加载文件。一旦加载一次,它就在内存中,不再重新加载。听起来你想要开启机器人并在其中更改脚本require'即时'的内容。你可以删除require.cache来做到这一点。查看node.js require() cache - possible to invalidate?http://nodejs.org/api/modules.html#modules_caching

答案 1 :(得分: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');
        }
    });
}